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

从头开始嵌入式第三十八天(数据结构 双向链表)

目录

 

双向链表

一、结构特点

二、操作优势

三、应用场景

1.创建链表

2.头插数据

3.打印数据

4.查找数据

5.删除数据

6.更改数据

7.清空数据

8.尾插数据

9.按位插入

10.获取长度

11.是否为空


 

双向链表

双向链表是一种链表结构。


一、结构特点


1. 每个节点包含两个指针,分别指向直接前驱节点和直接后继节点。这使得在双向链表中可以双向遍历,既可以向前也可以向后查找节点。
2. 相比单向链表,双向链表在某些操作上更加灵活,比如在删除节点时,可以快速找到前驱节点进行调整,而单向链表需要从头开始遍历才能找到前驱节点。


二、操作优势


1. 插入操作:可以快速确定插入位置的前后节点,进行指针调整,实现高效的插入操作。
2. 删除操作:由于能够直接访问前驱节点,删除操作也更加方便快捷。


三、应用场景


1. 需要频繁进行前后遍历的场景,如文本编辑器中对字符的双向移动和操作。
2. 对数据的插入和删除操作较多,且要求高效的系统中。

1.创建链表

LinkList *CreateLinkList()
{LinkList*ll =  (LinkList*)malloc(sizeof(LinkList));if(NULL == ll){perror("CreateLinkList malloc");return NULL;}ll->head = NULL;ll->clen = 0;return ll;
}

2.头插数据

int InsertHeadLinkList(LinkList *list, DATATYPE *data)
{LinkNode* newnode = (LinkNode*)malloc(sizeof(LinkNode));if(NULL == newnode){perror("InsertHeadLinkList malloc");return 1;}memcpy(&newnode->data,data,sizeof(DATATYPE));newnode->next = NULL;newnode->prev = NULL;if(IsEmptyLinkList(list)){list->head  = newnode;}else{newnode->next = list->head;list->head->prev = newnode;list->head = newnode;}list->clen++;return 0;
}

3.打印数据

int ShowLinkList(LinkList *list ,DIRECT dir)
{int i=0;int len =GetSizeLinkList(list);LinkNode* tmp = list->head;if(DIR_FORWARD == dir){for(i = 0 ;i<len;i++){printf("name:%s age:%d score:%d\n",tmp->data.name,tmp->data.age,tmp->data.score);tmp=tmp->next;}}else{while(tmp->next){tmp=tmp->next;}while(tmp){printf("name:%s age:%d score:%d\n",tmp->data.name,tmp->data.age,tmp->data.score);tmp=tmp->prev;}}return 0;
}

4.查找数据

LinkNode *FindLinkList(LinkList *list, char *name)
{int len = GetSizeLinkList(list);int i = 0 ;LinkNode*tmp = list->head;for(i = 0 ;i<len;i++){if(0==strcmp(tmp->data.name,name)){return tmp;}tmp=tmp->next;}return NULL;
}

5.删除数据

int DeleteLinkList(LinkList *list, char *name)
{LinkNode*tmp = FindLinkList(list,name);if(NULL == tmp){return 1;}if(tmp->next){tmp->next->prev=tmp->prev;}if(tmp->prev){tmp->prev->next = tmp->next;}else{list->head = tmp->next;}free(tmp);list->clen--;return 0;
}

6.更改数据

int ModifyLinkList(LinkList *list, char *name, DATATYPE *data)
{LinkNode* tmp = FindLinkList(list,name);if(NULL == tmp){return 1;}memcpy(&tmp->data,data,sizeof(DATATYPE));return 0;
}

7.清空数据

int DestroyLinkList(LinkList *list)
{LinkNode* tmp = list->head;while(tmp){list->head= list->head->next;free(tmp);tmp = list->head;}free(list);return 0;
}

8.尾插数据

int InsertTailLinkList(LinkList *list, DATATYPE *data)
{if(IsEmptyLinkList(list)){return InsertHeadLinkList(list,data);}else{LinkNode* newnode = (LinkNode*)malloc(sizeof(LinkNode));if(NULL == newnode){perror("inster tail malloc");return 1;}// newnode  initmemcpy(&newnode->data,data,sizeof(DATATYPE));newnode->next = NULL;newnode->prev=NULL;LinkNode*tmp = list->head;while(tmp->next){tmp = tmp->next;}newnode->prev = tmp;tmp->next = newnode;}list->clen++;return 0;
}

9.按位插入

int InsertPosLinkList(LinkList *list, DATATYPE *data, int pos) {int len = GetSizeLinkList(list);if (pos < 0 || pos > len) {return 1;}if (0 == pos) {return InsertHeadLinkList(list, data);} else if (len == pos) {return InsertTailLinkList(list, data);} else {LinkNode *tmp = list->head;int i = 0;for (i = 0; i < pos - 1; i++) {tmp = tmp->next;}LinkNode *newnode = (LinkNode *)malloc(sizeof(LinkNode));if (NULL == newnode) {perror("insert pos malloc");return 1;}memcpy(&newnode->data, data, sizeof(DATATYPE));newnode->next = NULL;newnode->prev = NULL;newnode->prev = tmp;newnode->next = tmp->next;tmp->next->prev = newnode;tmp->next = newnode;}list->clen++;return 0;
}

10.获取长度

int GetSizeLinkList(LinkList*list)
{return list->clen;
}

11.是否为空

int IsEmptyLinkList(LinkList*list)
{return 0 == list->clen;
}

 

 

 

 

http://www.lryc.cn/news/435507.html

相关文章:

  • chapter14-集合——(List-HashSet)——day18
  • 企业会议室预约管理系统
  • 安全API
  • 【论文阅读】视觉分割新SOTA: Segment Anything(SAM)
  • redis之list核心命令演示与细节探索
  • [数据集][目标检测]智慧农业草莓叶子病虫害检测数据集VOC+YOLO格式4040张9类别
  • Lua 与 C#交互
  • 【办公类】大组工会学习(文心一言+Python批量)
  • 项目管理工作流是什么?项目管理工作流管理实战技巧!
  • leveldb源码剖析(二)——LSM Tree
  • 三十六、Gin注册功能-检查账号是否存在
  • 什么是期权对冲?
  • 什么是数据库课程设计?
  • 走进低代码报表开发(二):高效报表设计新利器
  • 校园水电费管理|基于java的校园水电费管理小程序系统 (源码+数据库+文档)
  • java设计模式 桥接模式
  • 如何利用大数据技术来识别和预防网络赌博行为?
  • N-152基于java贪吃蛇游戏5
  • 从线段中搜寻提取闭合轮廓(三)
  • 最全面的递归算法详解,一篇足矣(高手必备)
  • 数据结构(2)单向链表排序和双向链表操作
  • OpenCV结构分析与形状描述符(14)拟合直线函数fitLine()的使用
  • Mysql基础练习题 1757.可回收且低脂的产品(力扣)
  • Nginx调优,有这篇就够了
  • Java语言程序设计基础篇_编程练习题*18.17 (数组中某个指定字符出现的次数)
  • 实时(按帧)处理的低通滤波C语言实现
  • Centos7.9部署Gitlab-ce-16.9
  • 卷积神经网络(一)
  • 加密与安全_ sm-crypto 国密算法sm2、sm3和sm4的Java库
  • VR 尺寸美学主观评价-解决方案-现场体验研讨会报名