当前位置:   article > 正文

数据结构c语言版严蔚敏 顺序表_数据结构c语言版严蔚敏顺序表删除

数据结构c语言版严蔚敏顺序表删除

说来惭愧由于贪玩,数据结构挂科了,现在重新学一遍数据结构,用博客督促一下自己,希望各位同学引以为戒,贪玩一时爽,痛苦永留存。

本文主要以严老师的数据结构书为主。

结构类型

listsize代表这个顺序表的最大容量  可以随时扩容

length代表表中元素个数   应小于listsize

1.初始化

  1. Status list_init(SqList &L)
  2. {
  3. L.elem=(Elemtype *)malloc(MAXSIZE*sizeof(Elemtype));//开辟空间
  4. if(!L.elem)
  5. exit(OVERFLOW);
  6. L.length=0; //初始化数据有效数据为0
  7. L.listsize=MAXSIZE; //初始化数组长度为MAXSIZE
  8. }

ps:exit函数其头文件为stdlib.h

退出程序返回OVERFLOW   OVERFLOW需要你自己宏定义   -2

在main.h中其被定义为3  不定义也可

2.顺序表的创建

  1. Status CreateList(SqList &L)
  2. {
  3. printf("请您输入想要创建的顺序表的元素的个数:\n");
  4. scanf("%d",&L.length);
  5. printf("请输入你想要创建的顺序表:\n");
  6. for(int i=0;i<L.length;i++)
  7. scanf("%d",&L.elem[i]);
  8. }

3.顺序表的取值

  1. Status GetElem(SqList L,int i,ElemType &e)
  2. {
  3. if(i<1 || i>L.length) //判断i值是否合理,如果不合理,返回0
  4. return 0;
  5. e = L.elem[i-1]; //elem[i-1]单元存储第i个数据元素
  6. return 1;
  7. }

4.顺序表的查找

  1. //在顺序表L中查找值为e的数据元素并返回其序号
  2. Status LocateElem(SqList L,ElemType e)
  3. {
  4. for(int i=0;i<L.length;i++)
  5. {
  6. if(L.elem[i] == e)
  7. return i+1; //查找成功,返回序号i+1
  8. }
  9. return 0;
  10. }

个人认为这样编写更简洁优雅

下面是按照书上的

首先,先定义一下Compare()这个函数,就假设这个关系是相等关系吧,利用Compare这个函数实现,如果两个指针中的值相等就返回true,不相等就返回false。代码如下:

  1. bool Compare(ElemType* e1,ElemType* e2) //参数要就都用指针表示,以免函数间相互调用时参数出现不匹配问题
  2. {
  3. if(*e1==*e2)
  4. return true;
  5. else
  6. return false;
  7. }

根据这个关系,要找出顺序表中的元素,明显的思路就是一个个元素进行对比了,看是否满足Compare()关系。这里需要注意的一点是元素的位置和数组元素的表示,第i个位置的元素是(*L).elem[i-1]。代码如下:

  1. int LocateElem(SqList *L,ElemType *e)
  2. {
  3. int i=1; //i为顺序表中的位置
  4. ElemType *p; //p指向顺序表中位序为i的元素
  5. p=(*L).elem; //取数组首元素地址 不用&
  6. while(i<=(*L).length&&(!Compare(p,e)))
  7. {
  8. i++;
  9. p++;
  10. }
  11. if(i<=(*L).length)
  12. return i; //返回满足条件的元素所在位置i
  13. else
  14. return 0;
  15. }

ps:我刚开始不太首元素地址为啥不加&  后来才发现是数组没学好,数组名代表首地址,如果想深入了解大家可以看看这个https://blog.csdn.net/jingzi123456789/article/details/66478310

明白bgnim5.顺序表的插入

  1. //不考虑增加分配的简化版
  2. Status ListInsert(SqList &L,int i,ElemType e)
  3. {
  4. //在顺序表L中第i个位置插入新的元素e,i值的合法范围是1<=i<=L.length+1
  5. if((i<1) || (i>L.length+1))
  6. return 0; //i值不合法
  7. if(L.length == MAXSIZE)
  8. return 0; //当前的存储空间已经满了
  9. for(int j=L.length-1;j>=i-1;j--)
  10. L.elem[j+1] = L.elem[j]; //插入位置及其之后的元素后移
  11. L.elem[i-1] = e; //将新的元素e放入第i个位置
  12. L.length++; //表长加1
  13. return 1;
  14. }
  1. Status ListInsert(SqList *L,int i,ElemType e) /* 算法2.4 */
  2. { /* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L)+1 */
  3. /* 操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1 */
  4. ElemType *newbase,*q,*p;
  5. if(i<1||i>(*L).length+1) /* i值不合法 */
  6. return ERROR;
  7. if((*L).length>=(*L).listsize) /* 当前存储空间已满,增加分配 */
  8. {
  9. newbase=(ElemType *)realloc((*L).elem,((*L).listsize+LISTINCREMENT)*sizeof(ElemType));
  10. if(!newbase)
  11. exit(OVERFLOW); /* 存储分配失败 */
  12. (*L).elem=newbase; /* 新基址 */
  13. (*L).listsize+=LISTINCREMENT; /* 增加存储容量 */
  14. }
  15. q=&(*L).elem[i-1]; /* q为插入位置 */
  16. for(p=&(*L).elem[length];p>=q;--p) /* 插入位置及之后的元素右移 */
  17. *(p+1)=*p;
  18. *q=e; /* 插入e */
  19. ++(*L).length; /* 表长增1 */
  20. return OK;
  21. }

ps:如果想严格来说按书上应  Sqlist &L      把(*L)换成L即可         两者是等价的  都可以完成对原表的操作

但切记  不用*L,&L而直接使用L按照函数形参  你是对实际L表的一个复制体进行了插入  对原表无影响

6.顺序表的删除

  1. Status ListDelete(SqList *L,int i,ElemType *e)
  2. {
  3. ElemType *p,*q;
  4. if(i<0||i>=(*L).length)
  5. {
  6. return error;
  7. }
  8. q=&((*L).elem[i-1]); //q为被删除元素的位置
  9. *e=*q;
  10. p=&((*L).elem[(*L).length-1]); //p指向顺序表最后一个元素位置的地址
  11. for(q;q<p;q++)
  12. {
  13. *q=*(q+1);
  14. }
  15. (*L).length--;
  16. return ok;
  17. }
  18. //简化不用e返回值时 取巧直接前移覆盖
  19. Status ListDelete(SqList &L,int i)
  20. {
  21. //在顺序表L中删除第i个元素,i值的合法范围是1<=i<=L.length
  22. if((i<1) || (i>L.length))
  23. return 0; //i值不合法
  24. for(int j=i;j<=L.length-1;j++)
  25. L.elem[j-1] = L.elem[j]; //被删除元素之后的元素前移
  26. L.length--; //表长减1
  27. return 1;
  28. }

 

7.其他操作比较简单大家看看代码就行了

  1. Status DestroyList(SqList *L)
  2. { /* 初始条件:顺序线性表L已存在。操作结果:销毁顺序线性表L */
  3. free((*L).elem);
  4. (*L).elem=NULL;
  5. (*L).length=0;
  6. (*L).listsize=0;
  7. return OK;
  8. }
  9. Status ClearList(SqList *L)
  10. { /* 初始条件:顺序线性表L已存在。操作结果:将L重置为空表 */
  11. (*L).length=0;
  12. return OK;
  13. }
  14. Status ListEmpty(SqList L)
  15. { /* 初始条件:顺序线性表L已存在。操作结果:若L为空表,则返回TRUE,否则返回FALSE */
  16. if(L.length==0)/*return L.length==0?TURE:FALSE;更简洁的表达*/
  17. return TRUE;
  18. else
  19. return FALSE;
  20. }
  21. int ListLength(SqList L)
  22. { /* 初始条件:顺序线性表L已存在。操作结果:返回L中数据元素个数 */
  23. return L.length;
  24. }
  25. Status ListTraverse_Sq(SqList L, void(Visit)(LElemType_Sq))
  26. {
  27. int i;
  28. for(i=0; i<L.length; i++)
  29. Visit(L.elem[i]);
  30. return OK;
  31. }//用visit函数访问表中元素
  32. 算法2.1
  33. ╚════*/
  34. void Union(SqList *La, SqList Lb)
  35. {
  36. int La_len, Lb_len;
  37. int i;
  38. LElemType_Sq e;
  39. La_len = ListLength_Sq(*La); //求顺序表长度
  40. Lb_len = ListLength_Sq(Lb);
  41. for(i=1; i<=Lb_len; i++)
  42. {
  43. GetElem_Sq(Lb, i, &e); //取Lb中第i个元素赋给e
  44. if(!LocateElem_Sq(*La, e, equal)) //若e不在La中则插入
  45. ListInsert_Sq(La, ++La_len, e);
  46. }
  47. }
  48. Status equal(LElemType_Sq e1, LElemType_Sq e2)
  49. {
  50. return e1==e2 ? TRUE : FALSE;
  51. }
  52. 算法2.2
  53. ╚════*/
  54. void MergeSqList_1(SqList La, SqList Lb, SqList *Lc) //调用顺序表函数进行合并
  55. {
  56. int La_len, Lb_len;
  57. int i, j, k;
  58. LElemType_Sq ai, bj;
  59. i = j = 1;
  60. k = 0;
  61. InitList_Sq(Lc); //初始化Lc
  62. La_len = ListLength_Sq(La); //获取La、Lb长度
  63. Lb_len = ListLength_Sq(Lb);
  64. while(i<=La_len && j<=Lb_len) //La及Lb均未扫描完
  65. {
  66. GetElem_Sq(La, i, &ai);
  67. GetElem_Sq(Lb, j, &bj);
  68. if(ai<=bj)
  69. {
  70. ListInsert_Sq(Lc, ++k, ai);
  71. i++;
  72. }
  73. else
  74. {
  75. ListInsert_Sq(Lc, ++k, bj);
  76. j++;
  77. }
  78. }
  79. while(i<=La_len) //表La还未扫描完
  80. {
  81. GetElem_Sq(La, i++, &ai);
  82. ListInsert_Sq(Lc, ++k, ai);
  83. }
  84. while(j<=Lb_len) //表Lb还未扫描完
  85. {
  86. GetElem_Sq(Lb, j++, &bj);
  87. ListInsert_Sq(Lc, ++k, bj);
  88. }
  89. }
  90. /*════╗
  91. ║ 算法2.7║
  92. ╚════*/
  93. void MergeSqList_2(SqList La, SqList Lb, SqList *Lc)
  94. {
  95. LElemType_Sq *pa, *pb, *pc;
  96. LElemType_Sq *pa_last, *pb_last;
  97. pa = La.elem; //指向La第一个元素
  98. pb = Lb.elem; //指向Lb第一个元素
  99. //不用InitList_Sq创建Lc
  100. (*Lc).listsize = (*Lc).length = La.length + Lb.length;
  101. pc = (*Lc).elem = (LElemType_Sq *)malloc((*Lc).listsize*sizeof(LElemType_Sq));
  102. if(!pc)
  103. exit(OVERFLOW);
  104. pa_last = La.elem + La.length - 1; //指向La最后一个元素
  105. pb_last = Lb.elem + Lb.length - 1; //指向Lb最后一个元素
  106. while(pa<=pa_last && pb<=pb_last) //La和Lb均未扫描完
  107. {
  108. if(*pa <= *pb)
  109. *pc++ = *pa++;
  110. else
  111. *pc++ = *pb++;
  112. }
  113. while(pa <= pa_last) //表La未扫描完
  114. *pc++ = *pa++; //插入La的剩余元素
  115. while(pb <= pb_last) //表Lb未扫描完
  116. *pc++ = *pb++; //插入Lb的剩余元素
  117. }

 

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

闽ICP备14008679号