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

【双向循环带头链表】

双向循环带头链表

 双向循环带头链表结构如下
Alt
 先设计数据结构如下。
typedef int LTDataType;
typedef struct ListNode
{
struct ListNode* prev;
struct ListNode* next;
LTDataType val;
}LTNode;.
  第一个节点为头结点,后面链接的节点存储数据。一个指向前面的指针prev,一个指向后面的指针next,一个数据。

 实现下面的接口
LTNode* ListInit();
void ListDestory(LTNode* phead);
void ListPrint(LTNode* phead);
void ListPushBack(LTNode* phead, LTDataType data);
void ListPopBack(LTNode* phead);
void ListPushFront(LTNode* phead, LTDataType data);
void ListPopFront(LTNode* phead);
LTNode* ListFind(LTNode* phead, LTDataType data);
// 双向链表在pos的前面进行插入
void ListInsert(LTNode* pos, LTDataType data);
// 双向链表删除pos位置的结点
void ListErase(LTNode* pos);


LTNode* ListInit();这个节点的实现初始化,要注意,两个指针要自己指向自己,在写后面的接口中有大用.

LTNode* BuyNode(LTDataType data)
{LTNode* node = (LTNode*)malloc(sizeof(LTNode));if (node == NULL){perror("malloc fail");return;}node->prev = node;node->next = node;node->val = data;return node;
}LTNode* ListInit()
{LTNode* node = (LTNode*)malloc(sizeof(LTNode));if (node == NULL){perror("malloc fail");return;}node->prev = node->next = node;return node;
}
}

 ListDestory接口实现定义一个指针cur = phead->next,先保存下一个节点的地址,在free.

void ListDestory(LTNode* phead)
{assert(phead);LTNode* cur = phead->next;while (cur!=phead){LTNode* next = cur->next;free(cur);cur = next;}free(phead);phead = NULL;
}

 ListPrint,遍历直接·打印

void ListPrint(LTNode* phead)
{assert(phead);LTNode* cur = phead->next;while (cur!=phead){printf("%d->", cur->val);cur = cur->next;}printf("\n---------------------------\n");
}

 LIstPushBack直接尾插,

void ListPushBack(LTNode* phead, LTDataType data)
{assert(phead);LTNode* newnode = BuyNode(data);LTNode* tail = phead->next;while (phead != tail->next)找到尾直接插入{tail = tail->next;}LTNode* prev = tail;LTNode* next = tail->next;prev->next = newnode;newnode->prev = prev;newnode->next = next;next->prev = newnode;
}

 尾删

void ListPopBack(LTNode* phead)
{assert(phead);if (phead->next == phead){printf("No node\n");return;}LTNode* cur = phead->next;while (cur->next != phead){cur = cur->next;}LTNode* prev = cur->prev;LTNode* next = cur->next;free(cur);prev->next = next;next->prev = prev;
}

 头插

void ListPushFront(LTNode* phead, LTDataType data)
{assert(phead);LTNode* newnode = BuyNode(data);LTNode* next = phead->next;phead->next = newnode;newnode->prev = phead;newnode->next = next;next->prev = newnode;
}

 头删

void ListPopFront(LTNode* phead)
{assert(phead);if (phead->next == phead){printf("No node\n");return;}LTNode* del = phead->next;LTNode* next = del->next;free(del);del = NULL;phead->next = next;next->prev = phead;}

 下面接口

LTNode* ListFind(LTNode* phead, LTDataType data)
{assert(phead);LTNode* cur = phead->next;while (cur != phead){if (cur->val == data){return cur;}cur = cur->next;}
}// 双向链表在pos的前面进行插入
void ListInsert(LTNode* pos, LTDataType data)
{assert(pos);LTNode* newnode = BuyNode(data);LTNode*  prev = pos->prev;prev->next = newnode;newnode->prev = prev;newnode->next = pos;pos->prev = newnode;}
// 双向链表删除pos位置的结点
void ListErase(LTNode* pos)
{assert(pos);LTNode* prev = pos->prev;LTNode* next = pos->next;free(pos);pos = NULL;prev->next = next;next->prev = prev;
}

 完结!
http://www.dtcms.com/a/267981.html

相关文章:

  • Java中的抽象类和接口
  • CICD[构建镜像]:构建django使用的docker镜像
  • 【9】用户接入与认证配置
  • 车载智能座舱用户画像系统研究二:子系统构建
  • Linux国产与国外进度对垒
  • GANs环境应用及启发思考
  • java学习——guava并发编程练习
  • 跨平台游戏引擎 Axmol-2.7.0 发布
  • @Data、@AllArgsConstructor、@NoArgsConstructor不生效。lombok不起作用怎么解决?
  • 设置LInux环境变量的方法和区别_Ubuntu/Centos
  • 网页怎么不使用工具截图和长图
  • 《Spring AI实战:Java智能开发速成指南》
  • D435i + ROS2
  • 利用selenium获取网页数据,脚本加载慢问题的解决办法
  • CentOS环境搭建-快速升级G++版本
  • 【CSS样式】有趣的滑块开关
  • 深入理解 classnames:React 动态类名管理的最佳实践
  • 20250706-6-Docker 快速入门(上)-镜像是什么?_笔记
  • TNNLS期刊接受后,最终版提交说明
  • QT - QCustomPlot
  • Next.js面试常问内容详解
  • 【网络安全基础】第八章---电子邮件安全
  • 5种高效解决Maven依赖冲突的方法
  • 基于SpringBoot和Leaflet集成在线天气服务的区县当前天气WebGIS实战
  • 手机电工仿真软件更新了
  • Typecho主题开发指南:现代框架布局与SEO优化实践
  • 基于SSM和JSP开发的旅游系统
  • [论文阅读] 人工智能 + 软件工程 | 自然语言驱动结构代码搜索:突破DSL学习壁垒的创新方法
  • HRDNet: High-resolution Detection Network for Small Objects论文阅读
  • 7.6 hash | rust