今天来讨论下链表中的双向链表。

双向链表:

概念:在双向链表中,结点除含有数据域外,还含有两个指针域:一个存储直接后继结点的地址,称为右链域;另一个存储直接前驱结点的地址,称为左链域。

typedef struct node{int num;              //数值域     struct node *lnext;   //左链域指针     struct node *rnect;   //右链域指针}stud;

双向链表常用算法:

先对三个指针作个声明:

head:用来指向链表的头部。链表需要一个指针来标识,这就是头指针。

p1:用来指向新结点,以及用来遍历链表的每一个结点。

p2:用来指向当前结点。

(1)双向链表创建算法

创建结点数目为n的双向链表:

typedef struct node{int num;              //数值域    struct node *lnext;   //左链域指针    struct node *rnect;   //右链域指针}stud;

stud* Create(int n){    stud *head,*p1,*p2;    head=p1=p2=NULL;for(int i=0;i<n;i++)    {        p1=(stud*)malloc(sizeof(stud));        p1->num=i;if(i==0)        {            head=p1;            head->lnext=NULL;        }else        {            p2->rnext=p1            p1->lnext=p2;        }        p2=p1;            }    p2->rnext=null;return head;}

(2)双向链表的查找算法

(一)头结点输入双向链表查找算法

typedef struct node{int num;              //数值域    struct node *lnext;   //左链域指针    struct node *rnect;   //右链域指针}stud;

stud* Find_FormHead(stud *head,int i){    stud *p1;    p1=head;while(p1!=NULL)    {if(i==p1->num)        {break;        }else        {            p1=p1->rnext;   //遍历链表        }    }return p1;}

(二)无序双向链表查找算法

typedef struct node{int num;              //数值域    struct node *lnext;   //左链域指针    struct node *rnect;   //右链域指针}stud;
//p是链表中任一个结点指针,i是要查的号码

stud* Find_NoSort(stud *p,int i) {    stud *p1;    p1=p;

//先住右遍历    while(p1!=NULL)    {if(i==p1->num)        {break;        }else        {            p1=p1->rnext;        }    }

//往左遍历    if(p1==NULL)    {        p1=p;while(p1!=NULL)        {if(i==p1->num)            {break;            }else            {                p1=p1->lnext;            }        }    }return p1;    }

(三)有序双向链表查找算法(从小到大)

typedef struct node{int num;              //数值域    struct node *lnext;   //左链域指针    struct node *rnect;   //右链域指针}stud;

stud* Find_IsSort(stud *p,int i){    stud *p1;    p1=p;while(p1!=NULL)    {if(i==p1->num)        {break;        }else        {if(i > p1->num)       //往右遍历            {                p1=p1->rnext;            }else            {                p1=p1->lnext;    //往左遍历            }        }    }return p1;}

(3)双向链表的删除算法

(一)头指针输入双向链表删除算法

typedef struct node{int num;              //数值域    struct node *lnext;   //左链域指针    struct node *rnect;   //右链域指针}stud;

bool Delete_FormHead(stud *head,int i){bool flag=false;if(head)    {        stud *p1,*p2;while(p1->num!=i && p1->rnext!=NULL)        {            p2=p1;            p1=p1->rnext;        }if(p1->num==i)        {if(p1==head)            {                head=p1->rnext;            }else            {                p2->rnext=p1->rnext;            }            free(p1);   //释放已经脱离链表的结点内存            flag=true;        }    }return flag;}

(二)无序双向链表删除算法

typedef struct node{int num;              //数值域    struct node *lnext;   //左链域指针    struct node *rnect;   //右链域指针}stud;

bool Delete_NoSort(stud *p,int i){bool flag=false;if(p)    {        stud *p1,*p2;

//往右遍历        while(p1!=NULL)        {if(i==p1->num)            {break;            }else            {                p2=p1;                p1=p1->rnext;            }        }

//往左遍历        while(p1!=NULL)        {if(i==p1->num)            {break;            }else            {                p2=p1;                p1=p1->lnext;            }        }    }if(p1->num == i)    {if(p1=p)        {            p=p1->rnext;        }else        {            p2->rnext=p1->rnext;        }        free(p1)        flag=true;    }return flag;}

(三)有序双向链表删除算法

typedef struct node{int num;              //数值域    struct node *lnext;   //左链域指针    struct node *rnect;   //右链域指针}stud;

bool Delete_IsSort(stud *p,int i){bool flag=false;if(p)    {        stud *p1,*p2;while(p1->num!=i && p1!=NULL)        {            p2=p1;if(i > p->num)          //往右遍历            {                p1=p1->rnext;            }else                    //往左遍历            {                p1=p1->lnext;            }        }if(p1->num==i)        {if(p1==p)            {                p=p1->rnext;            }else            {                p2->rnext=p1->rnext;            }            free(p1);       //释放已经脱离链表的结点内存            flag=true;        }    }return flag;}

(4)双向链表的插入算法

(一)双向链表通用插入算法

说明:p0为输入的链表指针,p为插入的结点地址

typedef struct node{int num;              //数值域    struct node *lnext;   //左链域指针    struct node *rnect;   //右链域指针}stud;

stud *Insert(stud *p0,stud *p){    stud *p1,*p2;    p1=p0;

if(!p0)    {        p0=p;        p->rnext=NULL;        p->lnext-NULL;    }else    {//往右遍历        if(p->num > p1->num)             {while(p->num > p1->num && p1->rnext!=NULL)            {                p2=p1;                p1=p1->rnext;            }

if(p->num < p1->num)            {if(p0==p1)                {                    p0=p;                }else                {                    p2->rnext=p;                    p->rnext=p1;                }            }else                //把p插入链表尾部            {                p1->rnext=p;                p->rnext=NULL;            }        }

//往左遍历        else        {while(p->num < p1->num && p1->lnext!=NULL)            {                p2=p1;                p1=p1->lnext;            }if(p->num > p1->num)            {if(p0==p1)                {                    p0=p;                }else                {                    p2->lnext=p;                    p->lnext=p1;                }            }else         //把这插入链表头部            {                p1->lnext=p;                p->lnext=NULL;            }        }    }return p0;}

(二)头结点输入双向链表插入算法

typedef struct node{int num;              //数值域    struct node *lnext;   //左链域指针    struct node *rnect;   //右链域指针}stud;

stud* Insert_FormHead(stud *head,stud *p){    stud *p1,*p2;    p1=head;if(!head)    {        head=p;        p->rnext=NULL;    }else    {while(p->num > p1->num && p1->rnext!=NULL)        {            p2=p1;            p1=p1->next;        }if(p->num < p1->num)        {if(head==p1)            {                head=p;            }else            {                p2->rnext=p;                p->rnext=NULL;            }        }else             //将p插入链表尾部        {            p1->rnext=p;            p->rnext=NULL;        }        }return head;}

相关文章:

  •  C/C++版数据结构之链表<一>

  •  C/C++版数据结构之链表<二>

  •  C/C++版数据结构之链表<三>

C/C++版数据结构之链表三相关推荐

  1. Android版数据结构与算法汇总十二章

    Android版数据结构与算法(一):基础简介 https://www.cnblogs.com/leipDao/p/9140726.html Android版数据结构与算法(二):基于数组的实现Arr ...

  2. JS版数据结构第三篇(链表)

    链表分为单链表,双链表,以及环形链表,我将分三个模块分别介绍,并有相应的题目对应讲解. 单链表 定义 还是按照老规矩先看一下百度百科对单链表的定义 根据以上文字我们可以得出 单链表是一种链式的数据结构 ...

  3. 数据结构c语言版第二版第三章课后答案,数据结构(C语言版)习题集答案第三章.doc...

    数据结构(C语言版)习题集答案第三章.doc 习题三3.1 3.10 3.13 3.5 3.6 3.15 3.17 3.19 3.24 3.29 3.31 3.51 给定操作序列P1P2P3PiPn( ...

  4. 常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构)

    常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构) 数据结构和算法作为程序员的基本功,一定得稳扎稳打的学习,我们常见的框架底层就是各类数据 ...

  5. SDUT_2118 数据结构实验之链表三:链表的逆置

    点击打开链接 数据结构实验之链表三:链表的逆置 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem De ...

  6. Java版数据结构之单向链表 新增,有序新增的两种方式,修改和删除(CRUD)

    Java版数据结构之单向链表 CRUD Java版数据结构之单向链表 新增,有序新增的两种方式,修改和删除; 留了一个疑问; 我的代码仓库:https://github.com/zhuangbinan ...

  7. Java版数据结构之单向链表

    Java版数据结构之单向链表 我的代码仓库:https://github.com/zhuangbinan/datastructure package club.zhuangbinan.linkedli ...

  8. java 数据结构_Java版-数据结构-队列(数组队列)

    前言 看过笔者前两篇介绍的 Java版数据结构 数组和 栈的盆友,都给予了笔者一致的好评,在这里笔者感谢大家的认可!!! 由于本章介绍的数据结构是 队列,在队列的实现上会基于前面写的 动态数组来实现, ...

  9. 浙大版数据结构学习系列内容汇总

    数据结构 一.基本概念 二.线性结构 三.树 四.图 五.排序 六.散列查找   学习浙大版数据结构系列课程过程中使用C++实现的课程对应练习代码和编程作业代码,点击 → Github链接进行查看. ...

最新文章

  1. Windows删除指定时间之前指定后缀名的文件
  2. apache图片cache容量_apache利用mod_cache缓存图片等
  3. mysql查询表名匹配只有字母的_MySQL按某些匹配字母查询表
  4. Linux ls常见的命令选项【转载】
  5. Scala构建工具SBT
  6. json生成shp_使用JS把shapefile地图数据转换为geojson格式
  7. python展开list嵌套,并解决from compiler.ast import flatten报错ModuleNotFoundError: No module named ‘compiler‘
  8. 【报告分享】2022跨境电商行业趋势报告.pdf(附下载链接)
  9. asp.net mvc 点滴 一 asp.net mvc vs asp.net web forms
  10. 网络游戏防沉迷的理想与现实
  11. 两平面间8参数变换参数求解简单原理解析(已更新间接平差算法)
  12. c语言获取随机数硬币问题,算法 – 从硬币中创建一个随机数生成器
  13. java仿制百度云盘_基于jsp的仿百度网盘-JavaEE实现仿百度网盘 - java项目源码
  14. Windows下的Node.js安装及环境配置
  15. idea配置翻译插件(google翻译插件)
  16. stm32—超声波传感器
  17. 新手想开一个传奇该如何操作?开一个传奇必须掌握哪些知识要点
  18. 上海车艺尚教你如何DIY原厂8.8寸大屏幕----宝马车友必看
  19. 小豆苗服务器维护,小豆苗问题排查方法新版
  20. nsis安装包(四)_软件环境

热门文章

  1. 高速串行总线设计基础(八)揭秘SERDES高速面纱之CML电平标准与预加重技术
  2. HDLBits 系列(7)对for循环以及generate for的各种实践
  3. 【 MATLAB 】filter 函数介绍(一维数字滤波器)
  4. MapReduce 概述
  5. Swift - 使用NSNotificationCenter发送通知,接收通知
  6. Memcache的原理的详解
  7. Interpreter - 解释器模式
  8. [C#学习]多线程编程——多线程基础
  9. JavaScript下拉菜单的例子
  10. springside / springside4—CRUD页面教程