当前位置:   article > 正文

单链表的基本操作(详细)

单链表的基本操作

目录

0.本帖的内容:

1.单链表的定义

2.初始化

3.这个帖子中的功能(函数块)

4.利用为尾插法创建单链表

5.打印单链表

6.在带有头结点的单链表L中第i个位置之前的插入元素e

7.当第i个元素存在时,把第i个元素赋值给e并返回ok

8.修改第i个元素的值为e

9.判断一个单链表是否为空

10.摧毁单链表

11.求单链表表长

12.求第i个元素的直接前驱

13.求第i个元素的直接后继

14.求元素X的直接前驱(求X的前一个元素)

15.求元素X的直接后继(求X的后一个元素)

16.功能选择函数

17.全部代码

运行样例测试:


0.本帖的内容:

  1. void show()
  2. {
  3. printf("\t*************以下为整个程序的功能区*************\n");
  4. printf("\t0.退出此程序\n");
  5. printf("\t1.打印单链表\n");
  6. printf("\t2.在带有头结点的单链表L中第i个位置之前的插入元素e\n");
  7. printf("\t3.删除L的第i个数据元素,并用e返回其值\n");
  8. printf("\t4.当第i个元素存在时,把第i个元素赋值给e并返回ok\n");
  9. printf("\t5.建表\n");
  10. printf("\t6.修改第i个元素的值为e,\n");
  11. printf("\t7.判断一个单链表是否为空\n");
  12. printf("\t8.摧毁单链表\n");
  13. printf("\t9.求单链表表长\n");
  14. printf("\t10.求第i个元素的直接前驱\n");
  15. printf("\t11.求第i个元素的直接后继\n");
  16. printf("\t12.求元素X的直接前驱(求X的前一个元素)(单链表中数字不重复时使用)\n");
  17. printf("\t13.求元素X的直接后继(求X的后一个元素)(单链表中数字不重复时使用)\n");
  18. }

1.单链表的定义

  1. typedef struct Lnode
  2. {
  3. int data;
  4. struct Lnode *next;
  5. }Lnode,*LinkList;

2.初始化

        如果是带有头结点的单链表就使用L->next=NULL;

        如果是没有头结点的单链表使用L=NULL;

  1. L->next=NULL;
  2. L=NULL;

3.这个帖子中的功能(函数块)

  1. //函数区
  2. LinkList Create(); //利用为尾插法创建单链表;
  3. void print(LinkList L); //打印单链表;
  4. Status ListInsert_L(LinkList L,int i,int e); //在带有头结点的单链表L中第i个位置之前的插入元素e;
  5. void show(); //输出功能表函数;
  6. Status GetElem_L(LinkList L,int i,int *e); //当第i个元素存在时,把第i个元素赋值给e并返回ok;
  7. Status ListDelete_L(LinkList L,int i,int *e); //在带有头结点的单链表L中,删除第i个元素,并由e返回其值;
  8. void swi(LinkList L); //switch选择函数;
  9. Status Recompose_L(LinkList L,int i,int e,int *q); //修改第i个元素的值为e;
  10. void ListEmpty_L(LinkList L); //判断一个单链表是否为空;
  11. void DestroyList_L(LinkList L); //摧毁单链表;
  12. Status PriorElem_L(LinkList L,int i,int e); //求第i个元素的直接前驱;
  13. Status NextElem_L(LinkList L,int i); //求第i个元素的直接后继;
  14. Status LenthList_L(LinkList L); //求表长;
  15. Status PriorElem_L_X(LinkList L,int e); //求元素X的直接前驱(求x的前一个元素);
  16. Status NextElem_L_X(LinkList L,int e); //求元素X的直接后继(求X的后一个元素);

4.利用为尾插法创建单链表

        输入数值为-1即可暂停输入

  1. //利用为尾插法创建单链表
  2. LinkList Create()
  3. {
  4. LinkList L,p,s;
  5. int e;
  6. L = (LinkList)malloc(sizeof(Lnode));
  7. L->next=NULL;
  8. p=L;
  9. printf("请输入表内数据(每个以空格隔开,以-1为值进行结束输入):\n");
  10. scanf("%d",&e);
  11. while(e!=-1)
  12. {
  13. s = (LinkList)malloc(sizeof(Lnode));
  14. s->data=e;
  15. p->next=s;
  16. p=s;
  17. scanf("%d",&e);
  18. }
  19. p->next=NULL;
  20. return L;
  21. }

5.打印单链表

        利用while循环

  1. //打印单链表
  2. void print(LinkList L)
  3. {
  4. LinkList p;
  5. p=L->next;
  6. printf("表内数据为:\n");
  7. while (p)
  8. {
  9. printf("%d ", p->data);
  10. p =p->next;
  11. }
  12. }

6.在带有头结点的单链表L中第i个位置之前的插入元素e

        为s开辟空间,然后利用计数器确定位置。

  1. Status ListInsert_L(LinkList L,int i,int e)
  2. {
  3. LinkList p,s;
  4. int j;
  5. int rrr;
  6. rrr = LenthList_L(L);
  7. if(i<(rrr+1)&&i>0)
  8. {
  9. p=L->next;j=1;
  10. while(p&&j<i-1)
  11. {
  12. p=p->next;++j;
  13. }
  14. if(!p||j>i-1) return ERROR;
  15. s=(LinkList)malloc(sizeof(Lnode));
  16. s->data = e;s->next = p->next;
  17. p->next = s;
  18. return OK;
  19. }else{
  20. printf("插入位置有误\n\n");
  21. }
  22. }

7.当第i个元素存在时,把第i个元素赋值给e并返回ok

  1. Status GetElem_L(LinkList L,int i,int *e)
  2. {
  3. LinkList p;
  4. int j;
  5. int tt=LenthList_L(L);
  6. if(i<=tt&&i>0)
  7. {
  8. p = L->next;
  9. j=1;
  10. while(p&&j<i)
  11. {
  12. p=p->next;++j;
  13. }
  14. //if(!p||j>i) return ERROR;
  15. *e = p -> data;
  16. printf("第%d个元素是%d\n",i,*e);
  17. return OK;
  18. }else{
  19. printf("输入有错\n");
  20. }
  21. }

8.修改第i个元素的值为e

  1. Status Recompose_L(LinkList L,int i,int e,int *q)
  2. {
  3. LinkList p;
  4. p=L->next;
  5. int j=1;
  6. while(p&&j<i)
  7. {
  8. p=p->next;
  9. ++j;
  10. }
  11. if(!p&&j>=i)
  12. return ERROR;
  13. *q=p->data;
  14. p->data= e;
  15. return OK;
  16. }

9.判断一个单链表是否为空

  1. void ListEmpty_L(LinkList L)
  2. {
  3. if(L->next!=NULL)
  4. printf("这个单链表不是空表\n");
  5. else
  6. printf("这个单链表是空表\n");
  7. }

10.摧毁单链表

  1. void DestroyList_L(LinkList L)
  2. {
  3. LinkList p;
  4. while(L)
  5. {
  6. p=L;
  7. L=L->next;
  8. free(p);
  9. }
  10. printf("单链表已经摧毁\n");
  11. }

11.求单链表表长

  1. Status LenthList_L(LinkList L)
  2. {
  3. LinkList p=L->next;
  4. int i=1;
  5. while(p->next!=NULL)
  6. {
  7. p=p->next;
  8. ++i;
  9. }
  10. return i;
  11. }

12.求第i个元素的直接前驱

  1. Status PriorElem_L(LinkList L,int i,int e)
  2. {
  3. LinkList p,q;
  4. int j=1;
  5. if(i==1){
  6. printf("这个表没有前驱\n");
  7. }else{
  8. p=L->next;
  9. while(p!=NULL&&j!=i)
  10. {
  11. q=p;
  12. p=p->next;
  13. j++;
  14. }
  15. printf("第%d个元素的直接前驱是%d",i,q->data);
  16. }
  17. }

13.求第i个元素的直接后继

  1. Status NextElem_L(LinkList L,int i)
  2. {
  3. LinkList p=L->next;
  4. int j=1;
  5. while(j!=i&&p!=NULL)
  6. {
  7. p=p->next;
  8. j++;
  9. }
  10. if(j>i)
  11. {
  12. printf("这个表没有直接后继\n");
  13. }else{
  14. p=p->next;
  15. printf("第%d个元素的直接后继是%d",i,p->data);
  16. }
  17. }

14.求元素X的直接前驱(求X的前一个元素)

  1. Status PriorElem_L_X(LinkList L,int e)
  2. {
  3. LinkList p,q;
  4. p=L->next;
  5. if(p->data==e)
  6. {
  7. printf("没有前驱\n");
  8. }
  9. while(p&&p->data!=e)
  10. {
  11. q=p;
  12. p=p->next;
  13. }
  14. printf("%d的直接前驱是%d\n",e,q->data);
  15. }

15.求元素X的直接后继(求X的后一个元素)

  1. Status NextElem_L_X(LinkList L,int e)
  2. {
  3. LinkList p=L->next;
  4. while(p&&p->data!=e)
  5. {
  6. p=p->next;
  7. }
  8. if(p->next==NULL)
  9. {
  10. printf("这个数字没有直接后继\n");
  11. }
  12. p=p->next;
  13. printf("%d的直接后继元素是%d\n",e,p->data);
  14. }

16.功能选择函数

  1. void swi(LinkList L)
  2. {
  3. int num;
  4. printf("请输入功能数字:");
  5. scanf("%d",&num);
  6. while(num)
  7. {
  8. switch(num)
  9. {
  10. case 0:
  11. num=0;
  12. break;
  13. case 1:
  14. if(L==NULL)
  15. {
  16. printf("在执行操作一之前必须执行操作5(建表)\n");
  17. }else{
  18. print(L);
  19. }
  20. printf("\n");
  21. break;
  22. case 2:
  23. if(L==NULL)
  24. {
  25. printf("在执行操作二之前必须执行操作5(建表)\n");
  26. }else{
  27. printf("选择的功能是:在带有头结点的单链表L中第i个位置之前的插入元素e\n");
  28. printf("请输入你想插入的位置和插入的元素:");
  29. int a,b;
  30. scanf("%d%d",&a,&b);
  31. ListInsert_L(L,a,b);
  32. printf("插入操作已经结束\n");
  33. }
  34. printf("\n");
  35. break;
  36. case 3:
  37. if(L==NULL)
  38. {
  39. printf("在执行操作三之前必须执行操作5(建表)\n");
  40. }else{
  41. printf("删除L的第i个数据元素,并用e返回其值\n");
  42. printf("请输入删除位置:");
  43. int c,d;
  44. scanf("%d",&c);
  45. ListDelete_L(L,c,&d);
  46. printf("删除元素为%d\n",d);
  47. }
  48. printf("\n");
  49. break;
  50. case 4:
  51. if(L==NULL)
  52. {
  53. printf("在执行操作四之前必须执行操作5(建表)\n");
  54. }else{
  55. printf("当第i个元素存在时,把第i个元素赋值给e并返回ok\n");
  56. printf("请输入第i个位置:");
  57. int f,g;
  58. scanf("%d",&f);
  59. GetElem_L(L,f,&g);
  60. //printf("第%d个元素是%d\n",f,g);
  61. }
  62. printf("\n");
  63. break;
  64. case 5:
  65. L=Create();
  66. printf("链表建立成功\n");
  67. printf("\n");
  68. break;
  69. case 6:
  70. if(L==NULL)
  71. {
  72. printf("在执行操作六之前必须执行操作5(建表)\n");
  73. }else{
  74. printf("修改第i个元素为x\n");
  75. printf("请输入i,x的值:");
  76. int k,l,q;
  77. scanf("%d%d",&k,&l);
  78. Recompose_L(L,k,l,&q);
  79. printf("把第%d的位置修改成了%d,用%d替换了%d",k,l,l,q);
  80. }
  81. printf("\n");
  82. break;
  83. case 7:
  84. if(L==NULL)
  85. {
  86. printf("在执行操作七之前必须执行操作5(建表)\n");
  87. }else{
  88. ListEmpty_L(L);
  89. }
  90. printf("\n");
  91. break;
  92. case 8:
  93. if(L==NULL)
  94. {
  95. printf("在执行操作八之前必须执行操作5(建表)\n");
  96. }else{
  97. DestroyList_L(L);
  98. L=NULL;
  99. }
  100. printf("\n");
  101. break;
  102. case 9:
  103. if(L==NULL)
  104. {
  105. printf("在执行操作九之前必须执行操作5(建表)\n");
  106. }else{
  107. int jj = LenthList_L(L);
  108. printf("链表的长度为%d\n",jj);
  109. }
  110. printf("\n");
  111. break;
  112. case 10:
  113. if(L==NULL)
  114. {
  115. printf("在执行操作十之前必须执行操作5(建表)\n");
  116. }else{
  117. int m,r;
  118. printf("请输入第i个元素的i:\n");
  119. scanf("%d",&m);
  120. PriorElem_L(L,m,r);
  121. }
  122. printf("\n");
  123. break;
  124. case 11:
  125. if(L==NULL)
  126. {
  127. printf("在执行操作十一之前必须执行操作5(建表)\n");
  128. }else{
  129. int gg,hh;
  130. printf("请输入第i个元素的i:\n");
  131. scanf("%d",&gg);
  132. NextElem_L(L,gg);
  133. }
  134. printf("\n");
  135. break;
  136. case 12:
  137. if(L==NULL)
  138. {
  139. printf("在执行操作十二之前必须执行操作5(建表)\n");
  140. }else{
  141. int qq;
  142. printf("请输入你想要搜到的数字\n");
  143. scanf("%d",&qq);
  144. PriorElem_L_X(L,qq);
  145. }
  146. printf("\n");
  147. break;
  148. case 13:
  149. if(L==NULL)
  150. {
  151. printf("在执行操作十三之前必须执行操作5(建表)\n");
  152. }else{
  153. int ww;
  154. printf("请输入你想要搜到的数字\n");
  155. scanf("%d",&ww);
  156. NextElem_L_X(L,ww);
  157. }
  158. printf("\n");
  159. break;
  160. default:
  161. printf("输入有误\n");
  162. printf("\n");
  163. break;
  164. }
  165. show();
  166. printf("\n\n请在此输入功能数字\n");
  167. scanf("%d",&num);
  168. }
  169. }

17.全部代码

  1. //define区
  2. #define List_Init_Size 100
  3. #define List_Increment 10
  4. #define OK 1
  5. #define OVERFLOW -2
  6. #define ERROR 0
  7. //预处理指令区
  8. #include <stdio.h>
  9. #include<stdlib.h>
  10. #include<malloc.h>
  11. #include<windows.h>
  12. //typedef
  13. typedef int Status;
  14. typedef struct Lnode
  15. {
  16. int data;
  17. struct Lnode *next;
  18. }Lnode,*LinkList;
  19. //函数区
  20. LinkList Create(); //利用为尾插法创建单链表;
  21. void print(LinkList L); //打印单链表;
  22. Status ListInsert_L(LinkList L,int i,int e); //在带有头结点的单链表L中第i个位置之前的插入元素e;
  23. void show(); //输出功能表函数;
  24. Status GetElem_L(LinkList L,int i,int *e); //当第i个元素存在时,把第i个元素赋值给e并返回ok;
  25. Status ListDelete_L(LinkList L,int i,int *e); //在带有头结点的单链表L中,删除第i个元素,并由e返回其值;
  26. void swi(LinkList L); //switch选择函数;
  27. Status Recompose_L(LinkList L,int i,int e,int *q); //修改第i个元素的值为e;
  28. void ListEmpty_L(LinkList L); //判断一个单链表是否为空;
  29. void DestroyList_L(LinkList L); //摧毁单链表;
  30. Status PriorElem_L(LinkList L,int i,int e); //求第i个元素的直接前驱;
  31. Status NextElem_L(LinkList L,int i); //求第i个元素的直接后继;
  32. Status LenthList_L(LinkList L); //求表长;
  33. Status PriorElem_L_X(LinkList L,int e); //求元素X的直接前驱(求x的前一个元素);
  34. Status NextElem_L_X(LinkList L,int e); //求元素X的直接后继(求X的后一个元素);
  35. //主函数
  36. int main()
  37. {
  38. char Q;
  39. printf("如果想要开始程序,请输入Y或者y,如果不开始可以输入其他,直接退出\n");
  40. scanf("%c",&Q);
  41. if(Q=='y'||Q=='Y')
  42. {
  43. LinkList L=NULL;
  44. show();
  45. swi(L);
  46. printf("\n2秒钟后退出,请稍候。。。。");
  47. Sleep(2000);
  48. return 0;
  49. }else{
  50. printf("程序截止\n");
  51. }
  52. }
  53. //利用为尾插法创建单链表
  54. LinkList Create()
  55. {
  56. LinkList L,p,s;
  57. int e;
  58. L = (LinkList)malloc(sizeof(Lnode));
  59. L->next=NULL;
  60. p=L;
  61. printf("请输入表内数据(每个以空格隔开,以-1为值进行结束输入):\n");
  62. scanf("%d",&e);
  63. while(e!=-1)
  64. {
  65. s = (LinkList)malloc(sizeof(Lnode));
  66. s->data=e;
  67. p->next=s;
  68. p=s;
  69. scanf("%d",&e);
  70. }
  71. p->next=NULL;
  72. return L;
  73. }
  74. //打印单链表
  75. void print(LinkList L)
  76. {
  77. LinkList p;
  78. p=L->next;
  79. printf("表内数据为:\n");
  80. while (p)
  81. {
  82. printf("%d ", p->data);
  83. p =p->next;
  84. }
  85. }
  86. //在带有头结点的单链表L中第i个位置之前的插入元素e;
  87. Status ListInsert_L(LinkList L,int i,int e)
  88. {
  89. LinkList p,s;
  90. int j;
  91. int rrr;
  92. rrr = LenthList_L(L);
  93. if(i<(rrr+1)&&i>0)
  94. {
  95. p=L->next;j=1;
  96. while(p&&j<i-1)
  97. {
  98. p=p->next;++j;
  99. }
  100. if(!p||j>i-1) return ERROR;
  101. s=(LinkList)malloc(sizeof(Lnode));
  102. s->data = e;s->next = p->next;
  103. p->next = s;
  104. return OK;
  105. }else{
  106. printf("插入位置有误\n\n");
  107. }
  108. }
  109. //输出功能表函数
  110. void show()
  111. {
  112. printf("\t*************以下为整个程序的功能区*************\n");
  113. printf("\t0.退出此程序\n");
  114. printf("\t1.打印单链表\n");
  115. printf("\t2.在带有头结点的单链表L中第i个位置之前的插入元素e\n");
  116. printf("\t3.删除L的第i个数据元素,并用e返回其值\n");
  117. printf("\t4.当第i个元素存在时,把第i个元素赋值给e并返回ok\n");
  118. printf("\t5.建表\n");
  119. printf("\t6.修改第i个元素的值为e,\n");
  120. printf("\t7.判断一个单链表是否为空\n");
  121. printf("\t8.摧毁单链表\n");
  122. printf("\t9.求单链表表长\n");
  123. printf("\t10.求第i个元素的直接前驱\n");
  124. printf("\t11.求第i个元素的直接后继\n");
  125. printf("\t12.求元素X的直接前驱(求X的前一个元素)(单链表中数字不重复时使用)\n");
  126. printf("\t13.求元素X的直接后继(求X的后一个元素)(单链表中数字不重复时使用)\n");
  127. }
  128. //switch选择函数
  129. void swi(LinkList L)
  130. {
  131. int num;
  132. printf("请输入功能数字:");
  133. scanf("%d",&num);
  134. while(num)
  135. {
  136. switch(num)
  137. {
  138. case 0:
  139. num=0;
  140. break;
  141. case 1:
  142. if(L==NULL)
  143. {
  144. printf("在执行操作一之前必须执行操作5(建表)\n");
  145. }else{
  146. print(L);
  147. }
  148. printf("\n");
  149. break;
  150. case 2:
  151. if(L==NULL)
  152. {
  153. printf("在执行操作二之前必须执行操作5(建表)\n");
  154. }else{
  155. printf("选择的功能是:在带有头结点的单链表L中第i个位置之前的插入元素e\n");
  156. printf("请输入你想插入的位置和插入的元素:");
  157. int a,b;
  158. scanf("%d%d",&a,&b);
  159. ListInsert_L(L,a,b);
  160. printf("插入操作已经结束\n");
  161. }
  162. printf("\n");
  163. break;
  164. case 3:
  165. if(L==NULL)
  166. {
  167. printf("在执行操作三之前必须执行操作5(建表)\n");
  168. }else{
  169. printf("删除L的第i个数据元素,并用e返回其值\n");
  170. printf("请输入删除位置:");
  171. int c,d;
  172. scanf("%d",&c);
  173. ListDelete_L(L,c,&d);
  174. printf("删除元素为%d\n",d);
  175. }
  176. printf("\n");
  177. break;
  178. case 4:
  179. if(L==NULL)
  180. {
  181. printf("在执行操作四之前必须执行操作5(建表)\n");
  182. }else{
  183. printf("当第i个元素存在时,把第i个元素赋值给e并返回ok\n");
  184. printf("请输入第i个位置:");
  185. int f,g;
  186. scanf("%d",&f);
  187. GetElem_L(L,f,&g);
  188. //printf("第%d个元素是%d\n",f,g);
  189. }
  190. printf("\n");
  191. break;
  192. case 5:
  193. L=Create();
  194. printf("链表建立成功\n");
  195. printf("\n");
  196. break;
  197. case 6:
  198. if(L==NULL)
  199. {
  200. printf("在执行操作六之前必须执行操作5(建表)\n");
  201. }else{
  202. printf("修改第i个元素为x\n");
  203. printf("请输入i,x的值:");
  204. int k,l,q;
  205. scanf("%d%d",&k,&l);
  206. Recompose_L(L,k,l,&q);
  207. printf("把第%d的位置修改成了%d,用%d替换了%d",k,l,l,q);
  208. }
  209. printf("\n");
  210. break;
  211. case 7:
  212. if(L==NULL)
  213. {
  214. printf("在执行操作七之前必须执行操作5(建表)\n");
  215. }else{
  216. ListEmpty_L(L);
  217. }
  218. printf("\n");
  219. break;
  220. case 8:
  221. if(L==NULL)
  222. {
  223. printf("在执行操作八之前必须执行操作5(建表)\n");
  224. }else{
  225. DestroyList_L(L);
  226. L=NULL;
  227. }
  228. printf("\n");
  229. break;
  230. case 9:
  231. if(L==NULL)
  232. {
  233. printf("在执行操作九之前必须执行操作5(建表)\n");
  234. }else{
  235. int jj = LenthList_L(L);
  236. printf("链表的长度为%d\n",jj);
  237. }
  238. printf("\n");
  239. break;
  240. case 10:
  241. if(L==NULL)
  242. {
  243. printf("在执行操作十之前必须执行操作5(建表)\n");
  244. }else{
  245. int m,r;
  246. printf("请输入第i个元素的i:\n");
  247. scanf("%d",&m);
  248. PriorElem_L(L,m,r);
  249. }
  250. printf("\n");
  251. break;
  252. case 11:
  253. if(L==NULL)
  254. {
  255. printf("在执行操作十一之前必须执行操作5(建表)\n");
  256. }else{
  257. int gg,hh;
  258. printf("请输入第i个元素的i:\n");
  259. scanf("%d",&gg);
  260. NextElem_L(L,gg);
  261. }
  262. printf("\n");
  263. break;
  264. case 12:
  265. if(L==NULL)
  266. {
  267. printf("在执行操作十二之前必须执行操作5(建表)\n");
  268. }else{
  269. int qq;
  270. printf("请输入你想要搜到的数字\n");
  271. scanf("%d",&qq);
  272. PriorElem_L_X(L,qq);
  273. }
  274. printf("\n");
  275. break;
  276. case 13:
  277. if(L==NULL)
  278. {
  279. printf("在执行操作十三之前必须执行操作5(建表)\n");
  280. }else{
  281. int ww;
  282. printf("请输入你想要搜到的数字\n");
  283. scanf("%d",&ww);
  284. NextElem_L_X(L,ww);
  285. }
  286. printf("\n");
  287. break;
  288. default:
  289. printf("输入有误\n");
  290. printf("\n");
  291. break;
  292. }
  293. show();
  294. printf("\n\n请在此输入功能数字\n");
  295. scanf("%d",&num);
  296. }
  297. }
  298. //在带有头结点的单链表L中,删除第i个元素,并由e返回其值
  299. Status ListDelete_L(LinkList L,int i,int *e)
  300. {
  301. LinkList p,q;
  302. int j;
  303. int eee = LenthList_L(L);
  304. if(i<eee+1&&i>0)
  305. {
  306. p=L->next;j=1;
  307. while(p->next&&j<i-1)
  308. {
  309. p=p->next;++j;
  310. }
  311. if(!(p->next)||j>i-1)return ERROR;
  312. q = p->next;p->next = q->next;
  313. *e = q->data;
  314. free(q);
  315. return OK;
  316. }else{
  317. printf("输入位置有错\n\n");
  318. }
  319. }
  320. //当第i个元素存在时,把第i个元素赋值给e并返回ok
  321. Status GetElem_L(LinkList L,int i,int *e)
  322. {
  323. LinkList p;
  324. int j;
  325. int tt=LenthList_L(L);
  326. if(i<=tt&&i>0)
  327. {
  328. p = L->next;
  329. j=1;
  330. while(p&&j<i)
  331. {
  332. p=p->next;++j;
  333. }
  334. //if(!p||j>i) return ERROR;
  335. *e = p -> data;
  336. printf("第%d个元素是%d\n",i,*e);
  337. return OK;
  338. }else{
  339. printf("输入有错\n");
  340. }
  341. }
  342. //修改第i个元素的值为e
  343. Status Recompose_L(LinkList L,int i,int e,int *q)
  344. {
  345. LinkList p;
  346. p=L->next;
  347. int j=1;
  348. while(p&&j<i)
  349. {
  350. p=p->next;
  351. ++j;
  352. }
  353. if(!p&&j>=i)
  354. return ERROR;
  355. *q=p->data;
  356. p->data= e;
  357. return OK;
  358. }
  359. //判断一个单链表是否为空;
  360. void ListEmpty_L(LinkList L)
  361. {
  362. if(L->next!=NULL)
  363. printf("这个单链表不是空表\n");
  364. else
  365. printf("这个单链表是空表\n");
  366. }
  367. //摧毁单链表
  368. void DestroyList_L(LinkList L)
  369. {
  370. LinkList p;
  371. while(L)
  372. {
  373. p=L;
  374. L=L->next;
  375. free(p);
  376. }
  377. printf("单链表已经摧毁\n");
  378. }
  379. //求单链表表长
  380. Status LenthList_L(LinkList L)
  381. {
  382. LinkList p=L->next;
  383. int i=1;
  384. while(p->next!=NULL)
  385. {
  386. p=p->next;
  387. ++i;
  388. }
  389. return i;
  390. }
  391. //求第i个元素的直接前驱
  392. Status PriorElem_L(LinkList L,int i,int e)
  393. {
  394. LinkList p,q;
  395. int j=1;
  396. if(i==1){
  397. printf("这个表没有前驱\n");
  398. }else{
  399. p=L->next;
  400. while(p!=NULL&&j!=i)
  401. {
  402. q=p;
  403. p=p->next;
  404. j++;
  405. }
  406. printf("第%d个元素的直接前驱是%d",i,q->data);
  407. }
  408. }
  409. //求第i个元素的直接后继
  410. Status NextElem_L(LinkList L,int i)
  411. {
  412. LinkList p=L->next;
  413. int j=1;
  414. while(j!=i&&p!=NULL)
  415. {
  416. p=p->next;
  417. j++;
  418. }
  419. if(j>i)
  420. {
  421. printf("这个表没有直接后继\n");
  422. }else{
  423. p=p->next;
  424. printf("第%d个元素的直接后继是%d",i,p->data);
  425. }
  426. }
  427. //求元素X的直接前驱(求X的前一个元素)
  428. Status PriorElem_L_X(LinkList L,int e)
  429. {
  430. LinkList p,q;
  431. p=L->next;
  432. if(p->data==e)
  433. {
  434. printf("没有前驱\n");
  435. }
  436. while(p&&p->data!=e)
  437. {
  438. q=p;
  439. p=p->next;
  440. }
  441. printf("%d的直接前驱是%d\n",e,q->data);
  442. }
  443. //求元素X的直接后继(求X的后一个元素)
  444. Status NextElem_L_X(LinkList L,int e)
  445. {
  446. LinkList p=L->next;
  447. while(p&&p->data!=e)
  448. {
  449. p=p->next;
  450. }
  451. if(p->next==NULL)
  452. {
  453. printf("这个数字没有直接后继\n");
  454. }
  455. p=p->next;
  456. printf("%d的直接后继元素是%d\n",e,p->data);
  457. }

运行样例测试:

如果刚刚开始不建表就不进入:

5.建表

 1.打印

2.插入

打印检查

3.删除元素

打印检查

4.当第i个元素存在时,把第i个元素赋值给e并返回ok;

6.修改第i个元素的值为e

7.判断一个单链表是否为空

9.求表长

10.求第i个元素的直接前驱

 

 11.求第i个元素的直接后继

12. 求元素X的直接前驱(求X的前一个元素)(单链表中数字不重复时使用)

13.求元素X的直接后继(求X的后一个元素)(单链表中数字不重复时使用)

 

 8.摧毁单链表

 

验证:

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

闽ICP备14008679号