1. 循环链表的规则?

    循环链表的运算实现算法和非循环链表运算算法基本相同,之是对表尾的判断做了改变。例如,在头结点为*h的循环单链表中,判断表空的条件为h->next==h,判断*p为尾结点的条件是p->next==h

  2. 循环链表的实现。


  3. /*

  4. 循环链表:

  5. 判断表空的条件是:h->next=h;

  6. 判断结点是否是尾结点:l->next=h;

  7. */

  8. #include<stdio.h>

  9. #include<malloc.h>

  10. #include<stdlib.h>

  11. typedef struct node

  12. {

  13. int data;

  14. struct node *next;

  15. }NODE,*PNODE;

  16. PNODE createList(PNODE);

  17. void travleList(PNODE);

  18. void insertList(PNODE,int,int);

  19. void delList(PNODE,int,int *);

  20. int lengthList(PNODE);

  21. bool isEmpty(PNODE);

  22. void main()

  23. {

  24. PNODE phead=(PNODE)malloc(sizeof(NODE));

  25. if(phead==NULL)

  26. {

  27. printf("内存分配失败");

  28. exit(-1);

  29. }

  30. phead->next=phead;

  31. //创建循环链表

  32. phead=createList(phead);

  33. //遍历循环链表

  34. travleList(phead);

  35. //单循环链表插入

  36. printf("开始插入结点");

  37. insertList(phead,3,5);

  38. //遍历循环链表

  39. travleList(phead);

  40. //单循环链表删除

  41. printf("开始删除结点");

  42. int val;

  43. delList(phead,2,&val);

  44. //遍历循环链表

  45. travleList(phead);

  46. }

  47. PNODE createList(PNODE phead)

  48. {

  49. PNODE ptail=phead;

  50. int len,val;

  51. printf("请输入需要创建结点的个数:");

  52. scanf("%d",&len);

  53. for(int i=0;i<len;i++)

  54. {

  55. PNODE pnew=(PNODE)malloc(sizeof(NODE));

  56. if(NULL==pnew)

  57. {

  58. printf("内存分配失败");

  59. exit(-1);

  60. }

  61. printf("请给第%d个结点赋值",i+1);

  62. scanf("%d",&val);

  63. pnew->next=NULL;

  64. pnew->data=val;

  65. //开始组成循环单链表

  66. pnew->next=phead;//都指向头结点。

  67. ptail->next=pnew;//用一个替代结点来帮助变换。

  68. ptail=pnew;

  69. }

  70. return phead;


  71. }

  72. void travleList(PNODE phead)

  73. {

  74. PNODE pnew=phead->next;

  75. while(pnew!=phead)

  76. {

  77. printf("%d ",pnew->data);

  78. pnew=pnew->next;

  79. }

  80. printf("\n");

  81. }

  82. void insertList(PNODE phead,int pos,int val)

  83. {

  84. PNODE pnew=phead;

  85. int i=0;

  86. // 传统插入方法。不能使用哪个高效算法。

  87. if(pnew==NULL||pos<1||pos>lengthList(phead)+1)

  88. {

  89. printf("无法插入");

  90. return;

  91. }

  92. while(i<pos-1)

  93. {

  94. pnew=pnew->next;

  95. i++;

  96. }

  97. //开始插入

  98. //造出新结点,并初始化

  99. PNODE p=(PNODE)malloc(sizeof(NODE));

  100. if(NULL==p)

  101. {

  102. printf("内存分配失败");

  103. exit(-1);

  104. }

  105. p->next=NULL;

  106. p->data=val;

  107. //准备插入

  108. p->next=pnew->next;

  109. pnew->next=p;

  110. }

  111. void delList(PNODE phead,int pos,int *val)

  112. {

  113. int i=0;

  114. PNODE pnew=phead;

  115. if(pnew==NULL||pos<1||pos>lengthList(phead))

  116. {

  117. printf("无法删除");

  118. return;

  119. }

  120. while(i<pos-1)

  121. {

  122. pnew=pnew->next;

  123. i++;

  124. }

  125. //开始删除

  126. PNODE q=pnew->next;

  127. *val=q->data;

  128. printf("%d          ",*val);

  129. pnew->next=pnew->next->next;

  130. free(q);

  131. }

  132. int lengthList(PNODE phead)

  133. {

  134. // 主要不需要插入结点,就不需要创造结点,申请内存pnew=(PNODE)malloc(sizeof(NODE));,遍历长度,根本不需要

  135. int i=0;

  136. PNODE pnew=phead;

  137. while(pnew->next!=phead)

  138. {

  139. pnew=pnew->next;

  140. i++;

  141. }

  142. return i;


  143. }

  144. bool isEmpty(PNODE phead)

  145. {

  146. if(phead->next==phead)

  147. return true;

  148. else 

  149. return false;

  150. }