什么叫双向循环链表,双向循环链表和双向链表

  什么叫双向循环链表,双向循环链表和双向链表

  私藏项目实操分享

  一~我爱你~链表的种类单向

  双向

  单向带头循环链表

  双向带头循环链表

  单向带头不循环链表

  双向带头不循环链表

  单向不带头循环链表

  双向不带头循环链表

  单向不带头不循环链表

  双向不带头不循环链表

  二~我爱你~双向带头循环链表其中单向不带头不循环链表和双向循环链表最为常见,而双向循环链表看起来好像很复杂,但是由于它是带头的又是双向循环的,反而给操作上带来了很多方便。下面主要主要实现双向带头循环链表。

  双向循环链表和单链表都是由结点组成的,单链表包含一个数据域和一个指针域构成,而双向循环链表不同,它是由一个数据域和两个指针域组成,其中指针包含前驱指针(预测)和后继指针(下一步)。

  三~我爱你~代码实现(1)附表h文件#包括标准视频

  #include assert.h包含断言

  #包括标准库

  typedef int ltdatatype

  typedef结构列表节点类型定义结构清单节点

  {

  ltdatatype数据

  结构列表节点*下一个

  结构列表节点*预测:

  } ltnode

  lt node * listinit();

  //双向带头循环链表的初始化

  见list print(lt node * phead);

  //打印

  lt node * buylistnode(lt datatype x);

  //增容函数

  见ListPushBack(LTNode* phead,lt datatype x);

  //尾插

  见listpopback(lt node * phead);

  //尾删

  见listpushfran(ltnode * phead,lt datatype x);

  //头插

  见listpopfront(lt node * phead);

  //头删

  LTNode* ListFind(LTNode* phead,lt datatype x);

  //查找

  请参阅list list(ltnode * pos、lt datatype x);

  //在位置(p)之前插入

  见list rase(lt node * pos);

  //在位置(p)位置删除

  见list destroy(lt node * phead);

  //销毁(2)附表c文件#包括List.h

  ltnode * listinit()

  {

  lt node * phead=(lt node *)malloc(sizeof(lt node));

  //创建头节点

  ph head-next=ph head;//后继指针指向头

  phead-prev=phead;//前驱指针指向头

  返回phead

  }

  请参阅ListPrint(LTNode* phead)

  {

  断言(phead);

  lt node * cur=phead-next;

  而(当前值!=phead)

  {

  printf("% d-",当前日期):

  cur=cur-next;

  }

  printf(" \ n ");

  }

  LTNode* BuyListNode(LTDataType x)

  {

  lt node * new node=(lt node *)malloc(sizeof(lt node));

  if(newnode==NULL)

  {

  printf(malloc故障\ n’);

  退出(-1);

  }

  节点数据=x:

  newnode- next=NULL:

  newnode- prev=NULL:

  返回新节点;

  }

  请参阅ListPushBack(LTNode* phead,LTDataType x)

  {

  断言(phead);

  ltnode * tail=phead-prev(ltnode *尾部=phead-预测):

  lt node * new node=buylistnode(x);

  尾部-下一个=新节点:

  newnode- prev=tail(新节点-预测=尾部):

  new node-next=phead;

  phead-prev=新节点;

  }

  请参阅ListPopBack(LTNode* phead)

  {

  断言(phead);

  断言(phead-下一个!=phead

  ltnode * tail=phead-prev(ltnode *尾部=phead-预测):

  lt node * tai prev=tail-prev(lt node *详细信息-预测):

  自由(尾部);

  tai prev-next=ph EAD;

  phead-prev=tai prev;

  }

  请参见listpushfran(ltnode * phead,LTDataType x)

  {

  断言(phead);

  lt node * new node=buylistnode(x);

  lt node * next=phead-next;

  phead-next=新节点;

  new node-prev=phead;

  新节点-下一个=下一个:

  下一步-prev=新节点;

  }

  参见ListPopFront(LTNode* phead)

  {

  断言(phead);

  断言(phead-下一个!=ph EAD

  lt node * next=phead-next;

  ltnode * nextnext=下一个

  phead-next=下一个;

  next-prev=phead;

  }

  LTNode* ListFind(LTNode* phead,LTDataType x)

  {

  断言(phead);

  lt node * cur=phead-next;

  而(当前值!=phead)

  {

  if(cur- Data==x)

  {

  返回当前值;

  }

  cur=cur-next;

  }

  返回空:

  }

  请参阅list list(ltnode * pos、LTDataType x)

  {

  断言(pos);

  LTNode* posPrev=pos- prev:

  lt node * new node=buylistnode(x);

  posprev-next=新节点;

  new node-prev=pos prev;

  newnode- next=pos:

  pos- prev=newnode:

  }

  参见列表(LTNode*位置)

  {

  断言(pos);

  LTNode* posPrev=pos- prev:

  lt node * pos next=pos-next;

  pos prev-next=pos next;

  posnext=posprev:

  自由(pos);

  pos=NULL:

  }

  请参见ListDestroy(LTNode* phead)

  {

  断言(phead);

  lt node * cur=phead-next;

  而(当前值!=phead)

  {

  lt node * next=cur-next;

  自由(cur);

  当前-下一个;

  }

  自由(phead);

  phead=NULL:

  }(3)测试。c文件#包括List.h

  请参见菜单()

  {

  打印文本(* * * * * * * * * * * * * * * * * * * * *带头双循环链表**本报告迟交是因为需要更多的资料。

  页:1。尾插* * * * * * * * * * * \ n];

  Printf (* * * * * * * * * * * * 2。头插入* * * * * * * * * * * * \ n’);

  printf( * * * * * * * * * * 3。删除末尾的* * * * * * * * * * * * * * \ n’);

  printf( * * * * * * * * * * 4。删除开头的* * * * * * * * * * * * * * \ n’);

  printf( * * * * * * * * * * 5。查询N位置* * * * * * * * * * * * \ N’);

  printf( * * * * * * * * * * 6。在N位置之前插入元素X * * * * * * * * * * \ N’);

  Printf (* * * * * * * * * * * * 7。删除N位置的元素* * * * * * * * * * * * \ N’);

  printf( * * * * * * * * * * 8。打印链表* * * * * * * * * * * * * * \ n’);

  printf( * * * * * * * * * * * * *-1。退出链表* * * * * * * * * * * * \ n’);

  printf( * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * \ n );

  }

  int main()

  {

  lt node * pList=ListInit();

  menu();

  int选项=-1;

  做

  {

  Printf(请输入选项:);

  scanf(%d ,选项);

  if(选项==1)

  {

  int x=0;

  Printf(请输入要结尾的元素:);

  scanf(%d ,x);

  ListPushBack(pList,x);

  }

  else if(选项==2)

  {

  int x=0;

  Printf(请输入要作为前缀的数字:);

  scanf(%d ,x);

  ListPushFront(pList,x);

  }

  else if(选项==3)

  {

  //结尾删除

  ListPopBack(pList);

  }

  else if(选项==4)

  {

  //标头删除

  ListPopFront(pList);

  }

  else if(选项==5)

  {

  int x=0;

  Printf(请输入要查找的值x:);

  scanf(%d ,x);

  LTNode* pos=ListFind(pList,x);

  如果(pos!=空)

  {

  Printf (number %d\n ,x);

  }

  其他

  {

  Printf(找不到编号% d \ n ,x);

  }

  }

  else if(选项==6)

  {

  int x=0;

  int y=0;

  Printf(请分别输入N位的值X和N位前插入的值Y:);

  scanf(%d %d ,x,y);

  LTNode* n=ListFind(pList,x);

  如果(n!=空)

  {

  ListInsert(n,y);

  }

  其他

  {

  Printf(链表不存在%d\n ,x);

  }

  }

  else if(选项==7)

  {

  int x=0;

  Printf(请输入要删除的第n个位置的值:);

  scanf(%d ,x);

  LTNode* n=ListFind(pList,x);

  李斯特酶;

  }

  else if(选项==8)

  {

  list print(pList);

  }

  } while(选项!=-1);

  list destroy(pList);

  返回0;

  }(4)makefile src=$(通配符*。c)

  obj=$(patsubst %。c,%。o,$(src))

  全部:测试

  测试:$(obj)

  gcc $^ -pthread -o $@

  清洁:

  -rm -rf $(obj)测试

  %.o:%。c

  gcc -c $ -o $@。假的:清洗所有的静脉注射。结果表明

  ,转载请联系作者获得转载授权,否则将追究法律责任。评论0发表评论。

  mb6268f6803d12d

  2022-05-21 11:32

  写得很详细。感谢分享。我在使用的过程中发现这个链表的数据字段是一个整数。不知道怎么改进成通用链表。

  wx620e51599794e

  博主回复mb6268f6803d12d

  2022-05-21 19:04

  写得很详细。感谢分享。我在使用的过程中发现这个链表的数据字段是一个整数。不知道怎么改进成通用链表。

  更改为无效*

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • office2010激活密钥大全 怎么永久激活office2010
  • project2010产品密钥免费_project2010激活密钥永久激活码
  • c语言调用退出函数 c语言退出整个程序怎么写
  • c语言中怎么给函数初始化 c语言的初始化语句
  • c语言编写函数计算平均值 c语言求平均函数
  • chatgpt是什么?为什么这么火?
  • ChatGPT为什么注册不了?OpenAI ChatGPT的账号哪里可以注册?
  • OpenAI ChatGPT怎么注册账号?ChatGPT账号注册教程
  • chatgpt什么意思,什么是ChatGPT ?
  • CAD中怎么复制图形标注尺寸不变,CAD中怎么复制图形线性不变
  • cad中怎么创建并使用脚本文件,cad怎么运行脚本
  • cad中快速计算器的功能,cad怎么快速计算
  • cad中快速修改单位的方法有哪些,cad中快速修改单位的方法是
  • cad中心点画椭圆怎么做,cad轴测图怎么画椭圆
  • CAD中常用的快捷键,cad各种快捷键的用法
  • 留言与评论(共有 条评论)
       
    验证码: