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

数据结构—双链表

双链表就是带头-循环-双向的链表,下面我们来实现一下双链表

双链表的初始化

双链表由数据(data)、指向下一节点的指针(next)、指向上一节点的指针(prev)组成

LTNode* LTBuyNode(LTDataType x)
{LTNode* tmp = (LTNode*)malloc(sizeof(LTNode));if (tmp == NULL){perror("LTBuyNode");exit(1);}//空双向链表表示哨兵位两个指针指向他自己// 不代表指针为空指针//因为双向链表是循环的,所以头结点的两个指针均指向他自己tmp->data = x;tmp->next = tmp;tmp->prev = tmp;return tmp;
}
void LTInit(LTNode** pphead)
{*pphead = LTBuyNode(-1);
}

双链表中插入数据

在双链表的尾部插入数据

//哨兵位的节点不能被删除也不能被修改,所以传一级指针即可
//先修改新节点的两个指针,在修改哨兵位的指针
void LTPushBack(LTNode* phead, LTDataType x)
{//将新节点插入到头节点前面LTNode* tmp = LTBuyNode(x);tmp->next = phead;tmp->prev = phead->prev ;//先修改尾节点指向新节点,再修改尾节点为新节点phead->prev->next = tmp;phead->prev = tmp;
}

在双链表的头部插入数据

void LTPushFront(LTNode* phead, LTDataType x)
{//将新节点插入到第一个有效节点的前面就是头插//还是先修改新节点的两个指针LTNode* newNode = LTBuyNode(x);newNode->prev = phead;newNode->next = phead->next;phead->next->prev = newNode;phead->next = newNode;
}

在双链表指定位置之后插入数据

void LTInsert(LTNode* pos, LTDataType x)
{//在指定位置之后插入节点//依旧是先修改新节点的指针assert(pos);LTNode* newNode = LTBuyNode(x);newNode->prev = pos;newNode->next = pos->next;pos->next->prev = newNode;pos->next = newNode;
}

双链表删除数据

删除双链表尾部的数据

void LTPopBack(LTNode* phead)
{//将倒数第二个节点的下一个节点改成头节点//将头结点的上一个节点改成倒数第二个节点assert(phead);LTNode* tmp = phead->prev;tmp->prev->next = phead;phead->prev = tmp->prev;free(tmp);tmp = NULL;
}

删除双链表头部的数据

void LTPopFront(LTNode* phead)
{assert(phead);LTNode* tmp = phead->next;phead->next = tmp->next;tmp->next->prev = phead;free(tmp);tmp = NULL;
}

删除双链表指定位置的数据

void LTErase(LTNode* pos)
{assert(pos);//pos不能是哨兵位//这里虽然对pos指针进行了修改,但是为了保证//函数接口的一致性,所以传一级指针。//但是这样并不会对实参置空,所以要在主函数中对实参置空pos->next->prev = pos->prev;pos->prev->next = pos->next;free(pos);pos = NULL;
}

查找双链表中的数据

LTNode* LTFind(LTNode* phead, LTDataType x)
{assert(phead);LTNode* pcur = phead->next;while (pcur != phead){if (pcur->data == x){return pcur;}pcur = pcur->next;}return NULL;
}

双链表的销毁

void LTDestroy(LTNode* phead)
{//这里同样为了函数接口一致性,传递一级指针//在主函数中需要释放掉实参的内存assert(phead);LTNode* pcur = phead->next;LTNode* prev = phead->next;while (prev != phead){pcur = pcur->next;free(prev);prev = pcur;}free(phead);phead = NULL;
}

http://www.dtcms.com/a/443205.html

相关文章:

  • 长沙公司网站建设上海专业网站制作公司
  • 黄冈网站免费投放平台免费下载计算机网站建设及管理
  • Tailwind CSS介绍(现代CSS框架,与传统CSS框架Bootstrap对比)Tailwind介绍
  • 网群企业网站管理系统哈尔滨快速建站专业定制
  • 做农家乐农产品旅游的网站黄南北京网站建设
  • wdcp网站打不开wordpress文章固定链接
  • C语言模拟面向对象编程方法之this指针
  • SAP杂记
  • 建设网站的意义作用是什么在哪个网站订酒店做申根签证
  • 微信商城网站建设视频宁波哪家建网站好
  • IMX6ULL学习笔记_Boot和裸机篇(2)--- SEGGER Embedded Studio基本相关配置
  • Linux--文件IO
  • wip: 正则regex
  • 一个网站建设花了10万元永久免费网站
  • 139、【OS】【Nuttx】【周边】效果呈现方案解析:strace 日志解析(五)
  • 阿里云网站建设合作广告传媒公司业务
  • 购物网站建设 成都番禺网站建设技术
  • 网站双线主机优势wordpress降版本
  • YOLO入门教程(番外):卷积神经网络—多输入多输出通道
  • 证券网站开发数码印花图案设计网站
  • 建模布线7 三四五连接4
  • 建设网站所有步骤广州公司网站设计
  • 做的网站为什么看不到图片导视设计案例
  • 廊坊短视频优化公司优化营商环境个人心得
  • 【Docker项目实战】使用Docker部署WikiDocs文档管理工具
  • 学校网站 建设措施设计公司企业标志
  • 专业网站建设特点分析企业网站源码带后台
  • volatile解决了什么问题,底层原理是什么
  • 太原市手机网站建设服务平台app下载
  • 东莞做网站排名网站建设的风险