• Day 63 双向循环链表


    1.概念:

    带头双向循环链表:结构最复杂,一般用在单独存储数据。实际中使用的链表 数据结构 ,都是带头
    双向循环链表。另外这个链表虽然结构复杂,但是使用代码实现以后会发现能带来很多优势。
    2.对双向循环链表的操作:
    (1) 动态申请一个结点
    (2) 创建头结点进行初始化
    (3) 尾插法
    (4) 尾删法
    (5) 头插法
    (6) 头删法
    (7) 查找元素
    (8) pos 位置前进行插入
    (9) 删除 pos 位置的结点
    (10) 打印数据
    示例如下:
    1. #include
    2. #include
    3. #include
    4. typedef struct node{
    5. struct node *prev;
    6. struct node *next;
    7. int data;
    8. }Node;
    9. Node *buylistnode(int data){
    10. Node *newnode=(Node *)malloc(sizeof(Node));
    11. if(newnode==NULL){
    12. printf("malloc error");
    13. exit(-1);
    14. }
    15. newnode->prev=newnode->next=NULL;
    16. newnode->data=data;
    17. return newnode;
    18. }
    19. Node *listinit(){
    20. Node *plist=buylistnode(0);
    21. plist->prev=plist->next=plist;
    22. return plist;
    23. }
    24. void listpushback(Node *plist,int data){
    25. if(plist==NULL){
    26. printf("This list is empty.\n");
    27. return;
    28. }
    29. Node *newnode=buylistnode(data);
    30. Node *tail=plist->prev;
    31. tail->next=newnode;
    32. newnode->prev=tail;
    33. newnode->next=plist;
    34. plist->prev=newnode;
    35. }
    36. void listpopback(Node *plist){
    37. if(plist==NULL){
    38. printf("This list is empty.\n");
    39. return;
    40. }
    41. if(plist->next!=plist){
    42. printf("This list is not only head.\n");
    43. }
    44. Node *tail=plist->prev;
    45. Node *tailprev=tail->prev;
    46. tailprev->next=plist;
    47. plist->prev=tailprev;
    48. free(tail);
    49. tail=NULL;
    50. }
    51. void listpushfront(Node *plist,int data){
    52. if(plist==NULL){
    53. printf("This list is empty.\n");
    54. }
    55. Node *newnode=buylistnode(data);
    56. Node *first=plist->next;
    57. plist->next=newnode;
    58. newnode->prev=plist;
    59. newnode->next=first;
    60. first->prev=newnode;
    61. }
    62. void listpopfront(Node *plist){
    63. if(plist==NULL){
    64. printf("This list is empty.\n");
    65. return;
    66. }
    67. if(plist->next!=plist){
    68. printf("List is not only head\n");
    69. }
    70. Node *first=plist->next;
    71. Node *second=first->next;
    72. plist->next=second;
    73. second->prev=plist;
    74. free(first);
    75. first=NULL;
    76. }
    77. Node *listfind(Node *plist,int data){
    78. if(plist==NULL){
    79. printf("This list is empty.\n");
    80. return NULL;
    81. }
    82. Node *cur=plist->next;
    83. while(cur!=plist){
    84. if(cur->data==data){
    85. return cur;
    86. }
    87. cur=cur->next;
    88. }
    89. return NULL;
    90. }
    91. void listinsert(Node *pos,int data){
    92. if(pos==NULL){
    93. printf("List is empty.\n");
    94. return;
    95. }
    96. Node *newnode=buylistnode(data);
    97. Node *posprev=pos->prev;
    98. posprev->next=newnode;
    99. newnode->prev=posprev;
    100. newnode->next=pos;
    101. pos->prev=newnode;
    102. }
    103. void listerase(Node *pos){
    104. if(pos==NULL){
    105. printf("List is empty.\n");
    106. return;
    107. }
    108. Node *posprev=pos->prev;
    109. Node *posnext=pos->next;
    110. posprev->next=posnext;
    111. posnext->prev=posprev;
    112. free(pos);
    113. pos=NULL;
    114. }
    115. void listprint(Node *plist){
    116. if(plist==NULL){
    117. printf("List is empty.\n");
    118. return;
    119. }
    120. Node *cur=plist->next;
    121. while(cur!=plist){
    122. if(cur->next==plist){
    123. printf("%d",cur->data);
    124. }else{
    125. printf("%d<->",cur->data);
    126. }
    127. cur=cur->next;
    128. }
    129. printf("\n");
    130. }
    131. void testlist01(){
    132. Node *plist=listinit();
    133. listpushback(plist,1);
    134. listpushback(plist,2);
    135. listpushback(plist,3);
    136. listpushback(plist,4);
    137. listprint(plist);
    138. listpopback(plist);
    139. listpopback(plist);
    140. listpopback(plist);
    141. listpopback(plist);
    142. listprint(plist);
    143. listpushfront(plist,1);
    144. listpushfront(plist,2);
    145. listpushfront(plist,3);
    146. listpushfront(plist,4);
    147. listprint(plist);
    148. listpopfront(plist);
    149. listpopfront(plist);
    150. listpopfront(plist);
    151. listpopfront(plist);
    152. listprint(plist);
    153. }
    154. void testlist02(){
    155. Node *plist=listinit();
    156. listpushback(plist,1);
    157. listpushback(plist,1);
    158. listpushback(plist,1);
    159. listpushback(plist,1);
    160. listprint(plist);
    161. Node *pos=listfind(plist,3);
    162. listinsert(pos,30);
    163. listprint(plist);
    164. listerase(pos);
    165. listprint(plist);
    166. }
    167. int main(){
    168. testlist01();
    169. testlist02();
    170. }

    结果如下:

  • 相关阅读:
    SOM网络1:原理讲解
    java项目springboot医院固定资产检修管理系统
    机器学习和深度学习区别
    用echarts在vue2中实现3d饼图
    【Android】修改aar包里的jar包里的class文件内容
    用对外贸分析工具,让你对竞争对手情况“了如指掌”!
    微信小程序部分知识点总结
    css初学之css基础用法及选择器(二)
    修饰符的笔记
    洛谷C++简单题小练习day21—梦境数数小程序
  • 原文地址:https://blog.csdn.net/m0_60247706/article/details/127775531