当前位置: 首页 > ops >正文

嵌入式学习的第二十一天-数据结构-双向链表

一、双向链表

1.定义

  双向链表是在单链表的每个结点中,再设置一个指向其钱去节点的指针域。

typedef struct DulNode
{ElemType date;struct DulNode *pri;//直接前驱指针sturct DulNode *next;//直接后继指针
}DulNode,*DuLinkList;

2.双向链表的创建

struct DouLinkList* CreateDouLinkList() 
{struct DouLinkList*dl = malloc(sizeof(struct DouLinkList));if(NULL == dl){fprintf(stderr, "CreatDouLinkList malloc");return NULL;}  dl->head =NULL;dl->clen = 0;return dl;  
}

3.双向链表的插入

(1)头插

int InsertHeadDouLinkList(struct DouLinkList*dl,struct DATATYPE*data)
{struct DouNode*newnode = malloc(sizeof( struct DouNode));if(NULL == newnode){fprintf(stderr, "InsertHeadDouLinkList malloc");return 1; }memcpy(&newnode->data,data,sizeof(struct DATATYPE));newnode->next = NULL;newnode->prev = NULL;newnode->next =dl->head;if(dl->head){dl->head->prev =newnode;}dl->head = newnode;dl->clen++;return 0;
}

(2)尾插

int InsertTailDouLinkList(struct DouLinkList*dl,struct DATATYPE*data)
{if(IsEmptyDouLinkList(dl)){return InsertHeadDouLinkList(dl,data);}else{   struct DouNode*tmp = dl->head;while(tmp->next){tmp = tmp->next;}struct DouNode*newnode = malloc(sizeof( struct DouNode));if(NULL == newnode){fprintf(stderr, "InsertTailDouLinkList malloc");return 1; }//初始化节点memcpy(&newnode->data,data,sizeof(struct DATATYPE));newnode->next = NULL;newnode->prev = NULL;//连接链表newnode->prev = tmp;tmp->next = newnode;dl->clen++;}return 0;
}

(3) 任意位置插

int InsertPosDouLinkList(struct DouLinkList*dl,struct DATATYPE*data,int pos)
{int len = GetSizeDouLinkList(dl);if(pos<0||pos>len){return 1;}if(0 == pos){return InsertHeadDouLinkList(dl,data);}else if(pos == len){return InsertTailDouLinkList(dl, data);}else{struct DouNode*newnode = malloc(sizeof( struct DouNode));if(NULL == newnode){fprintf(stderr, "InsertPosDouLinkList malloc");return 1; }//初始化节点memcpy(&newnode->data,data,sizeof(struct DATATYPE));newnode->next = NULL;newnode->prev = NULL;struct DouNode*tmp = dl->head;int i = 0;for(i = 0;i < pos;++i){tmp = tmp->next;}newnode->next=tmp;newnode->prev=tmp->prev;tmp->prev=newnode;newnode->prev->next=newnode;}return 0;
}

4.双向链表的遍历

int ShowDouLinkList(struct DouLinkList*dl,DIR dir)
{struct DouNode*tmp = dl->head;if(FORWADR == dir){while (tmp){printf("%s %c %d %d\n",tmp->data.name,tmp->data.sex,tmp->data.age,tmp->data.score);tmp=tmp->next;}}else if(BACKWADR == dir){while(tmp->next){tmp=tmp->next;}while(tmp){printf("%s %c %d %d\n",tmp->data.name,tmp->data.sex,tmp->data.age,tmp->data.score);tmp =tmp->prev;}}return 0;
}

5.  vi Makefile(工程管理工具) :三个.c以上可使用

方法一:

a.out(目标):main.c ./doulink (依赖)gcc main.c doulink.c//前面空一个Tab键
clean:rm a.out

 在终端敲make,进行编译,若要指定makefile ,加-f再加指定makefile

方法二:

#代表源文件
SRC += main.c(变量名任取)//指定变量
SRC += doulink.c
DST = app(可执行文件)CC = gcc//编译器
FLAG = -g
LIB = -lm$(DST):$(SRC)$(CC) $(SRC) $(FLAG) $(LIB)-o(指定名字) $(DST)
clean:rm $(DST)

6.双向链表的查找

struct DouNode * FindDouLinkList(struct DouLinkList*dl,char*name)
{if(IsEmptyDouLinkList(dl)){return NULL;}struct DouNode*tmp = dl->head;while(tmp){if(0 == strcmp(tmp->data.name,name)){return tmp;}tmp = tmp->next;}return NULL;
}

7.双向链表的修改

int ModifyDouLinkList(struct DouLinkList*dl,char*name,struct DATATYPE*data)
{struct DouNode*tmp = FindDouLinkList(dl, name);if(NULL == tmp){return 1;}memcpy(&tmp->data, data,sizeof(struct DATATYPE));return 0;
}

8.双向链表的销毁

int DestoryDouLinkList(struct DouLinkList*dl)
{while(1){struct DouNode*tmp = dl->head;if(NULL == tmp){break;}dl->head = dl->head->next;free(tmp);}free(dl);dl = NULL;return 0;
}

9.双向链表的删除

int DeleteDouLinkList(struct DouLinkList*dl,char*name)
{if(IsEmptyDouLinkList(dl)){return 1;}struct DouNode*tmp = FindDouLinkList(dl, name);if(tmp ==dl->head){dl->head =dl->head->next;tmp->next->prev = NULL;free(tmp);}else if(NULL == tmp->next){tmp->prev->next = NULL;free(tmp);}else{tmp->next->prev = tmp->prev;tmp->prev->next = tmp->next;free(tmp);}dl->clen--;return 0;
}

10.双向链表的逆序

int ReverseDouLinkList(struct DouLinkList*dl){struct DouNode*prev = NULL;struct DouNode*tmp = dl->head;struct DouNode*next = tmp->next;int len = GetSizeDouLinkList(dl);if(len < 2){return 1;}while(1){tmp->next = prev;tmp->prev = next;prev = tmp;tmp = next;if(NULL == tmp){break;}else{next = next->next;}}dl->head = prev;return 0;}

http://www.xdnf.cn/news/6281.html

相关文章:

  • 滑动窗口最大值
  • shell脚本练习(6):备份MySQL数据库表
  • 平滑过滤值策略
  • IP地址、端口、TCP介绍、socket介绍、程序中socket管理
  • 【MySQL】第四弹——表的CRUD进阶(二)数据库设计
  • 穿透工具如何保证信息安全?
  • 小白入门:GitHub 远程仓库使用全攻略
  • Stack overflow
  • CSS3 变形
  • 蓝桥杯12届国B 123
  • 机器学习——朴素贝叶斯练习题
  • Docker部署单节点Elasticsearch
  • 互联网大厂Java求职面试实战:Spring Boot到微服务全景解析
  • 【C++】解析C++面向对象三要素:封装、继承与多态实现机制
  • 【漫话机器学习系列】260.在前向神经网络中初始权重(Initializing Weights In Feedforward Neural Networks)
  • 知从科技闪耀2025上海车展:以创新驱动未来出行新篇章
  • Logistics | Days of Inventory vs. Stock Days 【待续】
  • 2.安卓逆向2-adb指令
  • MIFARE DESFire Light 卡C#读写更改卡片密钥源码
  • SLAM定位与地图构建
  • 【专栏启动】开篇:为什么是 Django + Vue3?测试平台的技术选型与架构蓝图
  • 通用软件项目技术报告 - 第一章节检测 - 参考答案
  • DeepSeek执行流程加速指南:跨框架转换与编译优化的核心策略全解析
  • Day118 | 灵神 | 二叉树 | 删点成林
  • 缺乏对新技术的评估和引入机制,如何建立
  • 【C++】set和multiset的常用接口详解
  • 答题pk小程序道具卡的获取与应用
  • yarn任务筛选spark任务,判断内存/CPU使用超过限制任务
  • 【物联网】基于树莓派的物联网开发【3】——最新镜像下载和烧录
  • 【iOS】源码阅读(四)——isa与类关联的原理