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

数据结构-双向链表-003

1双向链表

1.1链表结点结构体定义

typedef struct student_data
{char name[32];char sex;int age;
}STU_DATA;
typedef struct double_link_node
{STU_DATA data;//数据域struct double_link_node *ppre;//指向上一个结点的指针struct double_link_node *pnext;//指向下一个结点的指针
}DOUB_NODE;

1.2链表头结点结构体定义

typedef struct double_link_head
{DOUB_NODE *phead;//指向首结点的指针int clen;//记录链表节点数量
}DOUB_HEAD;

1.3双向链表头结点创建

/*=============双向链表创建头结点(创建空表)=========*/
void *create_double_link_list_head_node(void)
{DOUB_HEAD *phead=NULL;/*创建头结点空间*/phead=malloc(sizeof(DOUB_HEAD));if(NULL==phead){perror("fail to malloc");return NULL;}/*头结点初始化*/phead->phead=NULL;phead->clen=0;return phead;
}

1.4双向链表结点创建

/*=============双向链表创建新结点==============*/
void* create_double_link_list_new_node(STU_DATA data)
{DOUB_NODE *pnode=NULL;/*创建新结点空间*/pnode=malloc(sizeof(DOUB_NODE));if(NULL==pnode){perror("fail to malloc");return NULL;}/*新结点初始化*/pnode->data = data;pnode->ppre=NULL;pnode->pnext=NULL;return pnode;
}

1.5链表非空判断

/*=============双向链表非空判断==============*/
int is_empty_link(DOUB_HEAD *list)
{return NULL==list->phead;
}

1.6双向链表结点插入

1.6.1头插法

/*=============双向链表头插法=================*/
int push_head_double_link_list(DOUB_HEAD *list, DOUB_NODE *pnode)
{if(NULL==list||NULL==pnode){return -1;}if(is_empty_link(list)){list->phead=pnode;}else{pnode->pnext=list->phead;//初始化新结点的后继为旧的首结点list->phead->ppre=pnode;//更新首结点的前驱结点为新结点list->phead=pnode;//更新头结点的指向为新结点(因为此时新结点为新的首结点)}list->clen++;return 0;
}

1.6.2尾插法

/*=============双向链表尾插法=================*/
int push_tail_double_link_list(DOUB_HEAD *list,DOUB_NODE *pnode)
{DOUB_NODE *ptmp=NULL;if(NULL==list||NULL==pnode){return -1;}if(is_empty_link(list)){list->phead=pnode;}else{/*定义一个遍历指针,初始化为指向首结点*/ptmp=list->phead;while(1){if(NULL==ptmp->pnext){break;}ptmp=ptmp->pnext;}pnode->pnext=ptmp->pnext;//初始化新结点的后继结点为NULL(原来尾结点的指针域)ptmp->pnext=pnode;//更新尾结点的后继结点为新结点pnode->ppre=ptmp;//初始化新结点的前继结点为尾结点}list->clen++;return 0;
}

1.7双向链表遍历

1.7.1低配版本遍历

/*=============双向链表遍历(原始版)===============*/
int double_list_for_each(DOUB_HEAD *list)
{DOUB_NODE *ptmp=NULL;/*判断空表*/if(is_empty_link(list)){return 0;}/*初始化遍历指针为指向首结点*/ptmp=list->phead;while(1){if(NULL==ptmp)//如果是空表,也满足,如果遍历到链表末尾,也满足条件{break;}else{printf("%-10s\t%-10c\t%-10d\n",ptmp->data.name,ptmp->data.sex,ptmp->data.age);ptmp=ptmp->pnext;}}return 0;
}

1.7.2指定遍历方法的遍历

/*=============双向链表遍历(改进版)===============*/
int double_list_for_each(DOUB_HEAD *list,int dir,void (*pfun)(DOUB_NODE *))
{return 0;
}

1.8双向链表结点删除

1.8.1头删法

bug待改

1.8.2尾删法

/*==========双向链表尾删法==========*/
int pop_tail_double_link_list(DOUB_HEAD *list)
{DOUB_NODE *ptmp=NULL;if(is_empty_link(list)){return 0;}ptmp=list->phead;while(1){if(NULL==ptmp->pnext){break;}ptmp=ptmp->pnext;}if(ptmp->ppre!=NULL){ptmp->ppre->pnext=NULL;}else{list->phead=NULL;}free(ptmp);list->clen--;return 0;
}

1.9双向链表查找


1.10双向链表修改


1.11双向链表销毁


1.12双向链表的其它操作

1.12.1单向链表逆序


1.12.2双向链表查找中间结点


1.12.3双向链表查找倒数第k个结点


1.12.4双向链表删除指定结点

1.12.4.1单结点删除

1.12.4.2多结点删除
用于多个结点值相同的情况

1.13单向链表排序

1.13.1双向链表排序-插入排序法

相关文章:

  • Eclipse For ABAP:安装依赖报错
  • python共享单车信息系统的设计与实现flask-django-php-nodejs
  • U盘插入电脑没有显示怎么办?
  • 适配器模式与桥接模式-灵活应对变化的两种设计策略大比拼
  • Play on Words(UVA 10129)
  • java获取数据库信息为空解决方案
  • 一、初识 Web3
  • 【题目】【网络系统管理】2019年全国职业技能大赛高职组计算机网络应用赛项H卷
  • html5cssjs代码 036 CSS默认值
  • sentinel系统规则
  • CentOS 8 中安装与配置 MySQL
  • mac下Appuim环境安装-持续更新中
  • 航空实时监控
  • flask+ flask_socketio HTTP/1.1“ 400 公网IP 问题解决方案
  • 九、C#桶排序算法
  • JavaScript 如何正确处理 Unicode 编码问题!
  • 分享的文章《人生如棋》
  • 3.7、@ResponseBody 和 @RestController
  • Angular 4.x 动态创建组件
  • CentOS6 编译安装 redis-3.2.3
  • JSDuck 与 AngularJS 融合技巧
  • Redis字符串类型内部编码剖析
  • ubuntu 下nginx安装 并支持https协议
  • Windows Containers 大冒险: 容器网络
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 开发了一款写作软件(OSX,Windows),附带Electron开发指南
  • 如何邀请好友注册您的网站(模拟百度网盘)
  • 王永庆:技术创新改变教育未来
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • ​2021半年盘点,不想你错过的重磅新书
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • (04)odoo视图操作
  • (pojstep1.1.2)2654(直叙式模拟)
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (附源码)springboot家庭财务分析系统 毕业设计641323
  • (附源码)springboot教学评价 毕业设计 641310
  • (全注解开发)学习Spring-MVC的第三天
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • (转) 深度模型优化性能 调参
  • *** 2003
  • .bat批处理(九):替换带有等号=的字符串的子串
  • .NET/ASP.NETMVC 深入剖析 Model元数据、HtmlHelper、自定义模板、模板的装饰者模式(二)...
  • .NET/C# 阻止屏幕关闭,阻止系统进入睡眠状态
  • .Net组件程序设计之线程、并发管理(一)
  • @Service注解让spring找到你的Service bean
  • @test注解_Spring 自定义注解你了解过吗?
  • @transaction 提交事务_【读源码】剖析TCCTransaction事务提交实现细节
  • [ vulhub漏洞复现篇 ] ECShop 2.x / 3.x SQL注入/远程执行代码漏洞 xianzhi-2017-02-82239600
  • [ 渗透工具篇 ] 一篇文章让你掌握神奇的shuize -- 信息收集自动化工具
  • [AIGC] 如何建立和优化你的工作流?
  • [Android 13]Input系列--获取触摸窗口