数据结构 静态链表的插入与删除

举报
悦来客栈的老板 发表于 2020/12/29 23:06:37 2020/12/29
【摘要】 #include <stdio.h>#include <stdlib.h>#include <iostream.h> #define MAXSIZE 100#define OK 1#define ERROR 0#define OVERFLOW -2 typedef int ElemType; typedef struct{ Elem...

  
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <iostream.h>
  4. #define MAXSIZE 100
  5. #define OK 1
  6. #define ERROR 0
  7. #define OVERFLOW -2
  8. typedef int ElemType;
  9. typedef struct
  10. {
  11. ElemType data;
  12. int cur;
  13. }component, SLinkList[MAXSIZE];
  14. void InitSpace_SL(SLinkList &space)
  15. {//初始化静态链表,space[0].cur为头指针
  16. int i;
  17. for (i=0; i<MAXSIZE-1; i++)
  18. {
  19. space[i].cur = i+1;
  20. }
  21. space[MAXSIZE-1].cur = 0;
  22. }
  23. void Create_SL(SLinkList &space,int n)
  24. {
  25. int i;
  26. for (i=1; i<=n; i++)
  27. {
  28. scanf("%d",&space[i].data);
  29. }
  30. space[0].cur = n+1;/*space[0].cur 第一个备用空闲的下标*/
  31. space[n].cur = 0;/*最后一个元素的cur为0*/
  32. space[MAXSIZE-1].cur = 1;/*space[MAXSIZE-1].cur指向第一个元素*/
  33. }
  34. int SL_Length(SLinkList space)
  35. {
  36. int j = 0;
  37. int i = space[MAXSIZE-1].cur;
  38. while (i)
  39. {
  40. i = space[i].cur;/*类似于p = p->next */
  41. j++;
  42. }
  43. return j;
  44. }
  45. void print_SL(SLinkList space)
  46. {
  47. int i = space[MAXSIZE-1].cur;
  48. while (i)
  49. {
  50. printf("%d ",space[i].data);
  51. i = space[i].cur;
  52. }
  53. printf("\n");
  54. }
  55. int Malloc_SL(SLinkList space)
  56. {/*类似于mallco函数*/
  57. int i = space[0].cur;/*space[0].cur 第一个备用空闲的下标*/
  58. if (space[0].cur)
  59. {/*space[0].cur 始终指向第一个备用空闲的下标*/
  60. space[0].cur = space[i].cur ;
  61. }
  62. return i;
  63. }
  64. int Insert_SL(SLinkList space, int i, ElemType e)
  65. {//在第i个位置插入e,就是把第i-1个元素的cur指向插入的元素,然后将插入元素的cur指向第i个元素
  66. int j,k,l;
  67. k = MAXSIZE - 1;//k指向第一个元素的cur
  68. if (i < 1 || i > SL_Length(space) + 1)
  69. {//i值不合法
  70. return ERROR;
  71. }
  72. j = Malloc_SL(space);//分配一个节点
  73. if (j)
  74. {
  75. space[j].data = e;//插入e
  76. for (l=1; l<=i-1; l++)
  77. {//找到第i个元素之前的位置
  78. k = space[k].cur ;
  79. }
  80. space[j].cur = space[k].cur ;//把第i个元素之前的cur赋值给新元素的cur
  81. space[k].cur = j;//把新元素的下标赋值给第i个元素之前元素的cur
  82. return OK;
  83. }
  84. return ERROR;
  85. }
  86. void Free_SL(SLinkList space, int k)
  87. {
  88. space[k].cur = space[0].cur; //space[k].cur指向下一个备用空闲位置
  89. space[0].cur = k;//将第k设置为第一个备用空闲位置
  90. }
  91. int Delete_SL(SLinkList space, int i)
  92. {//删除第i个位置上的元素,就是把第i-1个元素的cur指向第i+1个元素或者0
  93. int j,k;
  94. if (i<1 || i>SL_Length(space))
  95. {
  96. return ERROR;
  97. }
  98. k = MAXSIZE - 1;
  99. for (j=1; j<=i-1; j++)
  100. {
  101. k = space[k].cur ;
  102. }
  103. j = space[k].cur ;
  104. space[k].cur = space[j].cur ;
  105. Free_SL(space,j);
  106. return OK;
  107. }
  108. int main()
  109. {
  110. int n,i,e;
  111. SLinkList space;
  112. InitSpace_SL(space);
  113. printf("请输入静态链表的长度:");
  114. scanf("%d",&n);
  115. printf("请输入 %d 个元素:",n);
  116. Create_SL(space, n);
  117. printf("打印静态链表:");
  118. print_SL(space);
  119. printf("请输入您要插入元素的位置:");
  120. scanf("%d",&i);
  121. printf("请输入您要插入的元素:");
  122. scanf("%d",&e);
  123. Insert_SL(space, i, e);
  124. printf("插入元素后的静态链表是:");
  125. print_SL(space);
  126. printf("请输入您要删除元素的位置:");
  127. scanf("%d",&i);
  128. Delete_SL(space, i);
  129. printf("删除元素后的静态链表是:");
  130. print_SL(space);
  131. return 0;
  132. }

文章来源: blog.csdn.net,作者:悦来客栈的老板,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/qq523176585/article/details/17248997

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。