当前位置:   article > 正文

线性表顺序存储结构_有如下的子函数定义:int listlength(sqlist *l);和主函数定义:main(){

有如下的子函数定义:int listlength(sqlist *l);和主函数定义:main(){ ……sqlist

线性表顺序存储结构

顺序存储结构:指的是用一段地址连续的存储单元一次存储线性表的数据元素。(理解成一维数组,既把第一个数据元素存到数组下表为0的位置中,接着把线性表相邻的元素存储在数组中相邻的位置)。

 

一、结构

  1. #define MAXSIZE 20//存储空间初始化分配量
  2. typedef int ElemType;//此处可能是个结构体,练习使用int型足够了
  3. typedef struct
  4. {
  5. ElemType data[MAXSIZE];//数组存储数据元素,最大存储量MAXSIZE
  6. int length;//链表长度
  7. }SqList;

描述线性表顺序存储结构需要三个属性:

1. 存储空间的起始位置:数组data,它的存储位置就是存储空间的存储位置

2. 线性表的最大存储容量:数组长度MAXSIZE

3. 线性表的当前长度:length

注意:数组的长度是存放线性表的存储空间的长度,存储分配后这个量是一般是不变的。线性表的长度是线性表中数据元素的个数,随着线性表插入和删除操作的进行,这个量是变化的。在任意时刻,线性表的长度应该小于等于数组的长度。


用数组存储顺序表意味着要分配固定长度的数组空间,由于线性表中可以进行插入和删除操作,因此分配的数组空间要大于等于当前线性表的长度。

二、线性表顺序存储插入操作


算法思路:

1. 如果插入位置不合理,抛出异常;

2. 如果线性表长度大于等于数组长度,则抛出异常或动态增加容量;

3. 从最后一个元素向前遍历到第i个位置,分表将他们都向后移动一个位置;

4. 将要插入元素填入位置i处;

5. 链表长度加1

三、线性表顺序存储删除操作


算法思路:

1. 如果删除位置不合理,抛出异常;

2. 取出删除元素;

3. 从删除元素位置开始遍历到最后一个元素位置,分别将他们都向前移动一个位置;

4. 链表长度减1

四、时间复杂度

线性表的顺序存储结构,在存、读数据是,不管是哪个位置,时间复杂度都是O(1);而插入或删除是时间复杂度都是O(n)。说明它比较适合元素个数不太变化,而更多是存取数据的应用。

五、优缺点

优点

缺点

1. 无须为表示表中元素之间的逻辑关系而增加额外的存储空间;

2. 可以快速的存取表中任一位置的元素

1. 插入和删除操作需要移动大量元素;

2. 当线性表长度变化较大时,难以确定存储空间的容量

3. 造成存储空间的“碎片”

 

六、代码示例

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #define OK 1
  5. #define ERROR 0
  6. #define MAXSIZE 20//存储空间初始化分配量
  7. typedef int ElemType;//此处可能是个结构体,练习使用int型足够了
  8. typedef struct
  9. {
  10. ElemType data[MAXSIZE];//数组存储数据元素,最大存储量MAXSIZE
  11. int length;//链表长度
  12. }SqList;
  13. //初始化操作,建立一个空的线性表L
  14. void InitList(SqList *L);
  15. //若线性表为空返回TRUE,否则返回FALSE
  16. int ListEmpty(SqList L);
  17. //将线性表清空
  18. void ClearList(SqList *L);
  19. /*在线性表L中查找给定值e相等的元素,
  20. *如果查找成功返回该元素在表中序号
  21. *表示成功;否则,返回0表示失败。
  22. */
  23. int LocateElem(SqList *L,ElemType e);
  24. //返回线性表L的元素个数
  25. int ListLength(SqList *L);
  26. //初始条件:顺序表L已经存在,1=<i=<ListLength(L)
  27. //操作结果:用e返回L中第i个数据元素的值
  28. int GetElem(SqList *L,int i,ElemType *e);
  29. //初始条件:顺序表L已经存在,1=<i=<ListLength(L)
  30. //操作结果:删除L中第i个位置的数据元素,并用e返回其值,L的长度减1
  31. int ListDelete(SqList *L,int i,ElemType *e);
  32. //初始条件:顺序表L已经存在,1=<i=<ListLength(L)
  33. //操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1
  34. int ListInsert(SqList *L,int i,ElemType e);
  35. /*将所有的在线性表Lb中但是不在La中的元素插入到La中*/
  36. void swapList(SqList *La,SqList *Lb);
  37. int ListPrint(SqList *L);
  38. //初始化操作,建立一个空的线性表L
  39. void InitList(SqList *L)
  40. {
  41. memset(L,0,sizeof(SqList));
  42. }
  43. //若线性表为空返回TRUE,否则返回FALSE
  44. int ListEmpty(SqList L)
  45. {
  46. if(0 == L.length)
  47. {
  48. printf("[%s %d]链表为空\n",__FUNCTION__,__LINE__);
  49. return ERROR;
  50. }
  51. return OK;
  52. }
  53. //将线性表清空
  54. void ClearList(SqList *L)
  55. {
  56. memset(L,0,sizeof(SqList));
  57. }
  58. /*在线性表L中查找给定值e相等的元素,
  59. *如果查找成功返回该元素在表中序号
  60. *表示成功;否则,返回0表示失败。
  61. */
  62. int LocateElem(SqList *L,ElemType e)
  63. {
  64. int i = 0;
  65. if(L->length == 0)//线性表为空
  66. {
  67. printf("[%s %d]链表为空\n",__FUNCTION__,__LINE__);
  68. return ERROR;
  69. }
  70. for(i = 0;i < L->length;i++)
  71. {
  72. if(e == L->data[i])
  73. {
  74. return i;
  75. }
  76. }
  77. printf("[%s %d]链表L中不存在元素e:%d\n",__FUNCTION__,__LINE__,e);
  78. return ERROR;
  79. }
  80. //返回线性表L的元素个数
  81. int ListLength(SqList *L)
  82. {
  83. return L->length;
  84. }
  85. //初始条件:顺序表L已经存在,1=<i=<ListLength(L)
  86. //操作结果:用e返回L中第i个数据元素的值
  87. int GetElem(SqList *L,int i,ElemType *e)
  88. {
  89. if(L->length == 0 || i< 1 || i>L->length)
  90. {
  91. return ERROR;
  92. }
  93. *e = L->data[i-1];
  94. return OK;
  95. }
  96. //初始条件:顺序表L已经存在,1=<i=<ListLength(L)
  97. //操作结果:删除L中第i个位置的数据元素,并用e返回其值,L的长度减1
  98. int ListDelete(SqList *L,int i,ElemType *e)
  99. {
  100. int k;
  101. if(L->length == 0)//线性表为空
  102. {
  103. return ERROR;
  104. }
  105. if(i< 0 || i> L->length)//删除位置不正确
  106. {
  107. return ERROR;
  108. }
  109. *e = L->data[i-1];
  110. if(i< L->length)//如果删除不是最后位置
  111. {
  112. for(k = i;k< L->length;k++)//将删除位置后继元素前移
  113. {
  114. L->data[k-1]=L->data[k];
  115. }
  116. }
  117. L->length--;
  118. return OK;
  119. }
  120. //初始条件:顺序表L已经存在,1=<i=<ListLength(L)
  121. //操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1
  122. int ListInsert(SqList *L,int i,ElemType e)
  123. {
  124. int k;
  125. if(L->length == MAXSIZE)//顺序线性表已满
  126. {
  127. return ERROR;
  128. }
  129. if(i< 0 || i> L->length)//当i不在范围内时
  130. {
  131. return ERROR;
  132. }
  133. if(i< L->length)//若插入位置不在表尾
  134. {
  135. for(k = L->length;k>= i;k--)//将要插入的位置后数据元素向后移动一位
  136. {
  137. L->data[k+1] = L->data[k];
  138. }
  139. }
  140. L->data[i] = e;//将新元素插入
  141. L->length++;
  142. return OK;
  143. }
  144. /*将所有的在线性表Lb中但是不在La中的元素插入到La中*/
  145. void swapList(SqList *La,SqList *Lb)
  146. {
  147. int La_len,Lb_len,i;
  148. ElemType e;//声明与La个Lb相同的数据元素e
  149. La_len = ListLength(La);//求线性表的长度
  150. Lb_len = ListLength(Lb);
  151. for(i = 1;i <= Lb_len;i++)
  152. {
  153. GetElem(Lb,i,&e);//取Lb中第i个数据元素赋值给e
  154. if(!LocateElem(La,e))//La中不存在和e相同的数据元素
  155. {
  156. ListInsert(La,++La_len,e);//插入
  157. }
  158. }
  159. }
  160. int ListPrint(SqList *L)
  161. {
  162. int i = 0;
  163. if(L->length == 0)//线性表为空
  164. {
  165. printf("[%s %d]链表为空\n",__FUNCTION__,__LINE__);
  166. return ERROR;
  167. }
  168. for(i = 0;i < L->length;i++)
  169. {
  170. printf("[%s %d]位置:%d,元素:%d\n",__FUNCTION__,__LINE__,i,L->data[i]);
  171. }
  172. return OK;
  173. }
  174. int main()
  175. {
  176. SqList L;
  177. int i = 0;
  178. int ret = ERROR;
  179. ElemType e = 0;
  180. InitList(&L);
  181. //插入数据
  182. printf("[%s %d]------------插入数据------------------\n",__FUNCTION__,__LINE__);
  183. for(i = 0;i < 15;i++)
  184. {
  185. ret = ListInsert(&L,i,i);
  186. if(ERROR == ret)
  187. {
  188. printf("[%s %d]插入数据失败,位置:%d,元素:%d\n",__FUNCTION__,__LINE__,i,i);
  189. }
  190. }
  191. //打印链表
  192. ret = ListPrint(&L);
  193. if(ERROR == ret)
  194. {
  195. printf("[%s %d]打印链表失败\n",__FUNCTION__,__LINE__);
  196. }
  197. //插入数据
  198. printf("[%s %d]------------指定位置插入数据------------------\n",__FUNCTION__,__LINE__);
  199. ret = ListInsert(&L,10,22);
  200. if(ERROR == ret)
  201. {
  202. printf("[%s %d]插入数据失败,位置:%d,元素:%d\n",__FUNCTION__,__LINE__,i,i);
  203. }
  204. //打印链表
  205. ret = ListPrint(&L);
  206. if(ERROR == ret)
  207. {
  208. printf("[%s %d]打印链表失败\n",__FUNCTION__,__LINE__);
  209. }
  210. //获取单个元素
  211. printf("[%s %d]------------获取单个元素------------------\n",__FUNCTION__,__LINE__);
  212. ret = GetElem(&L,5,&e);
  213. if(ERROR == ret)
  214. {
  215. printf("[%s %d]获取位置5的数据失败\n",__FUNCTION__,__LINE__);
  216. }
  217. else
  218. {
  219. printf("[%s %d]e:%d\n",__FUNCTION__,__LINE__,e);
  220. }
  221. //获取长度
  222. printf("[%s %d]------------获取长度------------------\n",__FUNCTION__,__LINE__);
  223. ret = ListLength(&L);
  224. printf("[%s %d]链表长度:%d\n",__FUNCTION__,__LINE__,ret);
  225. printf("[%s %d]------------检查元素------------------\n",__FUNCTION__,__LINE__);
  226. ret = LocateElem(&L,5);
  227. if(OK == ret)
  228. {
  229. printf("[%s %d]5是链表中元素,位置:%d\n",__FUNCTION__,__LINE__,ret);
  230. }
  231. else
  232. {
  233. printf("[%s %d]5不是链表中元素\n",__FUNCTION__,__LINE__);
  234. }
  235. //删除数据
  236. printf("[%s %d]------------删除数据------------------\n",__FUNCTION__,__LINE__);
  237. ret = ListDelete(&L,10,&e);
  238. if(ERROR == ret)
  239. {
  240. printf("[%s %d]删除失败\n",__FUNCTION__,__LINE__);
  241. }
  242. else
  243. {
  244. printf("[%s %d]删除成功e:%d\n",__FUNCTION__,__LINE__,e);
  245. }
  246. //打印链表
  247. ret = ListPrint(&L);
  248. if(ERROR == ret)
  249. {
  250. printf("[%s %d]打印链表失败\n",__FUNCTION__,__LINE__);
  251. }
  252. printf("[%s %d]------------清空链表------------------\n",__FUNCTION__,__LINE__);
  253. if(ListEmpty(L))
  254. {
  255. printf("[%s %d]链表不为空\n",__FUNCTION__,__LINE__);
  256. }
  257. ClearList(&L);
  258. if(ListEmpty(L))
  259. {
  260. printf("[%s %d]链表不为空\n",__FUNCTION__,__LINE__);
  261. }
  262. //void swapList(SqList *La,SqList *Lb);
  263. return OK;
  264. }


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

闽ICP备14008679号