bo2-8.cpp 不带头结点的单链表(存储结构由c2-2.h定义)的部分基本操作(9个)

论坛 期权论坛 编程之家     
选择匿名的用户   2021-5-31 15:54   36   0
  1. // bo2-8.cpp 不带头结点的单链表(存储结构由c2-2.h定义)的部分基本操作(9个)
  2. #define DestroyList ClearList // DestroyList()和ClearList()的操作是一样的
  3. void InitList(LinkList &L)
  4. { // 操作结果:构造一个空的线性表L
  5. L=NULL; // 指针为空
  6. }
  7. void ClearList(LinkList &L)
  8. { // 初始条件:线性表L已存在。操作结果:将L重置为空表
  9. LinkList p;
  10. while(L) // L不空
  11. {
  12. p=L; // p指向首元结点
  13. L=L->next; // L指向第2个结点(新首元结点)
  14. free(p); // 释放首元结点
  15. }
  16. }
  17. Status ListEmpty(LinkList L)
  18. { // 初始条件:线性表L已存在。操作结果:若L为空表,则返回TRUE,否则返回FALSE
  19. if(L)
  20. return FALSE;
  21. else
  22. return TRUE;
  23. }
  24. int ListLength(LinkList L)
  25. { // 初始条件:线性表L已存在。操作结果:返回L中数据元素个数
  26. int i=0;
  27. LinkList p=L;
  28. while(p) // p指向结点(没到表尾)
  29. {
  30. p=p->next; // p指向下一个结点
  31. i++;
  32. }
  33. return i;
  34. }
  35. Status GetElem(LinkList L,int i,ElemType &e)
  36. { // L为不带头结点的单链表的头指针。当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR
  37. int j=1;
  38. LinkList p=L;
  39. if(i<1) // i值不合法
  40. return ERROR;
  41. while(j<i&&p) // 没到第i个元素,也没到表尾
  42. {
  43. j++;
  44. p=p->next;
  45. }
  46. if(j==i) // 存在第i个元素
  47. {
  48. e=p->data;
  49. return OK;
  50. }
  51. else
  52. return ERROR;
  53. }
  54. int LocateElem(LinkList L,ElemType e,Status(*compare)(ElemType,ElemType))
  55. { // 初始条件:线性表L已存在,compare()是数据元素判定函数(满足为1,否则为0)
  56. // 操作结果:返回L中第1个与e满足关系compare()的数据元素的位序。
  57. // 若这样的数据元素不存在,则返回值为0
  58. int i=0;
  59. LinkList p=L;
  60. while(p)
  61. {
  62. i++;
  63. if(compare(p->data,e)) // 找到这样的数据元素
  64. return i;
  65. p=p->next;
  66. }
  67. return 0;
  68. }
  69. Status ListInsert(LinkList &L,int i,ElemType e)
  70. { // 在不带头结点的单链线性表L中第i个位置之前插入元素e
  71. int j=1;
  72. LinkList p=L,s;
  73. if(i<1) // i值不合法
  74. return ERROR;
  75. s=(LinkList)malloc(sizeof(LNode)); // 生成新结点
  76. s->data=e; // 给s的data域赋值
  77. if(i==1) // 插在表头
  78. {
  79. s->next=L;
  80. L=s; // 改变L
  81. }
  82. else
  83. { // 插在表的其余处
  84. while(p&&j<i-1) // 寻找第i-1个结点
  85. {
  86. p=p->next;
  87. j++;
  88. }
  89. if(!p) // i大于表长+1
  90. return ERROR;
  91. s->next=p->next;
  92. p->next=s;
  93. }
  94. return OK;
  95. }
  96. Status ListDelete(LinkList &L,int i,ElemType &e)
  97. { // 在不带头结点的单链线性表L中,删除第i个元素,并由e返回其值
  98. int j=1;
  99. LinkList p=L,q;
  100. if(i==1) // 删除第1个结点
  101. {
  102. L=p->next; // L由第2个结点开始
  103. e=p->data;
  104. free(p); // 删除并释放第1个结点
  105. }
  106. else
  107. {
  108. while(p->next&&j<i-1) // 寻找第i个结点,并令p指向其前趋
  109. {
  110. p=p->next;
  111. j++;
  112. }
  113. if(!p->next||j>i-1) // 删除位置不合理
  114. return ERROR;
  115. q=p->next; // 删除并释放结点
  116. p->next=q->next;
  117. e=q->data;
  118. free(q);
  119. }
  120. return OK;
  121. }
  122. void ListTraverse(LinkList L,void(*vi)(ElemType))
  123. { // 初始条件:线性表L已存在。操作结果:依次对L的每个数据元素调用函数vi()
  124. LinkList p=L;
  125. while(p)
  126. {
  127. vi(p->data);
  128. p=p->next;
  129. }
  130. printf("/n");
  131. }
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP