当前位置:   article > 正文

数据结构-双链表_slink*p=l,*s

slink*p=l,*s

说明

     与单链表相比,在双链表中增加了一个指向其直接前驱的指针,这样形成的链表就有两个不同的方向链,使得可以从已知的结点向前查询。

插入

 

删除

代码

  1. /*
  2. ** dlink create by yubo.wang 2018.9.12
  3. */
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. typedef char ElemType;
  7. typedef struct node
  8. {
  9. ElemType data;
  10. struct node *prior,*next;
  11. }SLink;
  12. SLink *MaxNode(SLink *L);
  13. void InitList(SLink *&L) /*SLink *&L作为引用型参数或者用二级指针SLink **L*/
  14. {
  15. L=(SLink *)malloc(sizeof(SLink));
  16. L->prior=NULL;
  17. L->next=NULL;
  18. }
  19. int GetLength(SLink *L)
  20. {
  21. int i=0;
  22. SLink *p=L->next;
  23. while(p != NULL)
  24. {
  25. i++;
  26. p=p->next;
  27. }
  28. return i;
  29. }
  30. int GetElem(SLink *L,int i,ElemType &e)
  31. {
  32. int j=1;
  33. SLink *p=L->next;
  34. if(i<1 || i>GetLength(L))
  35. return 0;
  36. while(j<i)
  37. {
  38. p=p->next;
  39. j++;
  40. }
  41. e=p->data;
  42. return 1;
  43. }
  44. int Locate(SLink *L,ElemType x)
  45. {
  46. int i=1;
  47. SLink *p=L->next;
  48. while(p!=NULL && p->data!=x)
  49. {
  50. p=p->next;
  51. i++;
  52. }
  53. if(NULL == p)
  54. return 0;
  55. else
  56. return i;
  57. }
  58. int InsElem(SLink *L,ElemType x,int i)//初始化是尾插,也可中途插入
  59. {
  60. int j=1;
  61. SLink *p=L,*s;
  62. s=(SLink *)malloc(sizeof(SLink));
  63. s->data=x;
  64. s->prior=NULL;
  65. s->next=NULL;
  66. if(i<1 || i>GetLength(L)+1)//防止i越界
  67. return 0;
  68. while(j<i)
  69. {
  70. p=p->next;
  71. j++;
  72. }
  73. s->next = p->next;
  74. s->prior = p;
  75. if(p->next != NULL)//若p不是最后结点,将p之后的结点的prior指向s
  76. s->next->prior=s;
  77. p->next = s;
  78. return 1;
  79. }
  80. int DelElem(SLink *L,int i)
  81. {
  82. int j=1;
  83. SLink *p=L,*q;
  84. if(i<1 || i>GetLength(L))
  85. return 0;
  86. while(j<i)
  87. {
  88. p=p->next;
  89. j++;
  90. }
  91. q=p->next;
  92. printf("%c\n", q->data);
  93. p->next=q->next;
  94. if(q->next != NULL)//若q不是最后结点,将q之后的结点的prior指向p
  95. q->next->prior=p;
  96. free(q);
  97. return 1;
  98. }
  99. void DispList(SLink *L)
  100. {
  101. SLink *p=L->next;
  102. while(p != NULL)
  103. {
  104. printf("%c ", p->data);
  105. p=p->next;
  106. }
  107. printf("\n");
  108. }
  109. int main()
  110. {
  111. int i;
  112. ElemType e;
  113. SLink *L=NULL;
  114. InitList(L);//initial head
  115. InsElem(L,'a',1);
  116. InsElem(L,'b',2);
  117. InsElem(L,'c',3);
  118. InsElem(L,'d',4);
  119. InsElem(L,'e',5);
  120. InsElem(L,'f',6);
  121. printf("List:");
  122. DispList(L);
  123. printf("Length: %d\n", GetLength(L));
  124. i=3;
  125. GetElem(L,i,e);
  126. printf("index %d data is:%c\n", i,e);
  127. e='e';
  128. printf("data %c index is: %d\n", e,Locate(L,e));
  129. i=4;
  130. printf("delete index %d data ", i);
  131. DelElem(L,i);
  132. i=2;
  133. e='w';
  134. printf("insert index %d data %c\n", i, e);
  135. InsElem(L,e,2);
  136. printf("List:");
  137. DispList(L);
  138. printf("MaxNode:%c\n", MaxNode(L)->data);
  139. }
  140. /*通过一趟遍历返回单链表元素最大值的结点*/
  141. SLink *MaxNode(SLink *L)
  142. {
  143. SLink *p=L->next,*q=p;//p用来遍历,q用来记录最大的值结点
  144. while(p != NULL)
  145. {
  146. if(p->data > q->data)
  147. q=p;
  148. p=p->next;
  149. }
  150. return q;
  151. }
  152. /*ScanList算法*/

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/神奇cpp/article/detail/826356
推荐阅读
相关标签
  

闽ICP备14008679号