读书笔记-《大话数据结构》第三章 线性表之顺序存储结构

举报
鱼酱 发表于 2022/01/06 23:30:14 2022/01/06
【摘要】 线性表的机内表示法(又称存储结构)有2种   顺序存储结构 链式存储结构 顺序存储结构 是在内存中开辟一个连续的空间用来存储数据,因此对于内存的需求和苛刻,必须是连续的空间.在数据查找(特别是不按照规律排列的数据),时间复杂度教少.效率高. 大概看了一眼书,觉得书上的内容不够实用,在网上找个顺...

线性表的机内表示法(又称存储结构)有2种

  •   顺序存储结构
  •  链式存储结构

顺序存储结构

是在内存中开辟一个连续的空间用来存储数据,因此对于内存的需求和苛刻,必须是连续的空间.在数据查找(特别是不按照规律排列的数据),时间复杂度教少.效率高.

大概看了一眼书,觉得书上的内容不够实用,在网上找个顺序结构的小demo,以便于理解顺序存储结构


  
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define TRUE 1
  4. #define FALSE 0
  5. #define ERROR -1
  6. typedef int Status;
  7. typedef int ElemType;
  8. //------顺序存储结构---------
  9. #define LIST_INIT_SIZE 100 //SqList的初始分配大小
  10. #define LIST_INCREMENT 10 //SqList的增量分配大小
  11. typedef struct{
  12. ElemType *elem;
  13. int length;
  14. int listsize;
  15. } SqList;
  16. //线性表初始化
  17. Status InitList_Sq(SqList *L){
  18. //构造空的线性表,开辟对应内存
  19. L->elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
  20. if(!L->elem)
  21. return ERROR;
  22. L->length=0;
  23. L->listsize=LIST_INIT_SIZE;
  24. return TRUE;
  25. }//InitList_Sq
  26. //线性表销毁
  27. void DestoryList_Sq(SqList *L){
  28. //销毁已存在的线性表
  29. if(L->elem) free(L->elem);
  30. L->length=0;
  31. }//DestoryList_Sq
  32. //线性表清空
  33. void ClearList_Sq(SqList *L){
  34. //清空线性表
  35. L->length=0;
  36. }//ClearList_Sq
  37. Status ListEmpty_Sq(SqList L){
  38. //线性表为空返回TRUE,否则返回FALSE
  39. if(!L.elem) return ERROR;
  40. if(L.length!=0) return TRUE;
  41. return FALSE;
  42. }//ListEmpty_Sq
  43. Status ListLength_Sq(SqList L){
  44. //返回线性表的长度
  45. if(!L.elem) return ERROR;
  46. return L.length;
  47. }//ListLength_Sq
  48. Status GetElem_Sq(SqList L,int i,ElemType *e){
  49. //用e返回L的第i个元素值
  50. if(i>L.length||i<1) return ERROR;
  51. *e=L.elem[i-1];
  52. return TRUE;
  53. }//GetElem_Sq
  54. int LocateElem_Sq(SqList L,ElemType e,int (*cmp)(ElemType el,ElemType e)){
  55. //返回L中第一个与e满足cmp函数的数据元素位序,若不存在则返回0
  56. int i=0;
  57. for(i=0;i<L.length;i++){
  58. if(cmp(L.elem[i],e))
  59. return i;
  60. }
  61. return 0;
  62. }//LocateElem_Sq
  63. Status PriorElem_Sq(SqList L,ElemType cur_e,ElemType *e){
  64. //若cur_e为L中的元素,则返回其前驱
  65. int loc=0;
  66. int compareEqual(ElemType a,ElemType b);
  67. loc=LocateElem_Sq(L,cur_e,compareEqual);
  68. if(loc>0) {
  69. *e=L.elem[loc-1];
  70. return TRUE;
  71. }
  72. else
  73. return FALSE;
  74. }//PriorElem_Sq
  75. Status NextElem_Sq(SqList L,ElemType cur_e,ElemType *e){
  76. //若cur_e为L中的元素,返回其后继
  77. int loc;
  78. int compareEqual(ElemType a,ElemType b);
  79. loc=LocateElem_Sq(L,cur_e,compareEqual);
  80. if(loc<L.length-1){
  81. *e=L.elem[loc+1];
  82. return TRUE;
  83. }
  84. else
  85. return FALSE;
  86. }
  87. //@Func: 插入
  88. //@Param 线性表地址 ,插入位置,插入的数据
  89. Status ListInsert_Sq(SqList *L,int i,ElemType e){
  90. //在L的每i个元素之前插入e
  91. int j=0;
  92. if((i>L->length && L->length!=0) || i<1)
  93. return ERROR;//位置不合法
  94. if(L->length>=L->listsize)
  95. {
  96. L->elem=(ElemType*)realloc(L->elem,(LIST_INIT_SIZE+LIST_INCREMENT)*sizeof(ElemType));
  97. if(!L->elem) return ERROR;//分配失败
  98. L->listsize+=LIST_INCREMENT;
  99. }
  100. for(j=L->length;j>=i;j--){
  101. L->elem[j]=L->elem[j-1];
  102. }
  103. L->elem[j]=e;
  104. L->length++;
  105. return TRUE;
  106. }//ListInsert_Sq
  107. Status ListDelete_Sq(SqList *L,int i,ElemType *e){
  108. //删除L中第i元素,并用e返回
  109. int j=0;
  110. if(L->length==0||i<1||i>L->length) return ERROR;
  111. *e=L->elem[i-1];
  112. for(j=i-1;j<L->length-1;j++)
  113. L->elem[j]=L->elem[j+1];
  114. L->length--;
  115. return TRUE;
  116. }//ListDelete_Sq
  117. void ListTraverse_Sq(SqList L,void (*visit)(ElemType e)){
  118. //遍历L
  119. int i;
  120. for(i=0;i<L.length;i++)
  121. visit(L.elem[i]);
  122. }//ListTraverse_Sq
  123. int compareEqual(ElemType a,ElemType b){
  124. //比较元素,相等返回1
  125. if(a==b) return TRUE;
  126. else
  127. return FALSE;
  128. }
  129. void visit(ElemType e){
  130. //输出e
  131. printf("%d ",e);
  132. }
  133. //主函数
  134. int main(){
  135. //生命顺序存储结构
  136. SqList L;
  137. ElemType e;
  138. InitList_Sq(&L);
  139. ListInsert_Sq(&L,1,1);
  140. ListInsert_Sq(&L,1,2);
  141. ListInsert_Sq(&L,1,3);
  142. ListInsert_Sq(&L,1,4);
  143. ListTraverse_Sq(L,visit);
  144. printf("\n");
  145. if(PriorElem_Sq(L,2,&e))
  146. //ListDelete_Sq(&L,1,&e);
  147. printf("e=%d\n",e);
  148. //ListTraverse_Sq(L,visit);
  149. printf("\n");
  150. return 0;
  151. }








文章来源: yujiang.blog.csdn.net,作者:鱼酱2333,版权归原作者所有,如需转载,请联系作者。

原文链接:yujiang.blog.csdn.net/article/details/52149834

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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