顺序表的一些基本操作

举报
悦来客栈的老板 发表于 2020/12/30 00:43:02 2020/12/30
【摘要】    # include <stdio.h># include <malloc.h># include <stdlib.h> # define LIST_INIT_SIZE 1000# define LISTINCREMENT 10# define OK 1# define ERROR 0# define OVERFLOW -1 typedef struct{ int *e...

  
  1. # include <stdio.h>
  2. # include <malloc.h>
  3. # include <stdlib.h>
  4. # define LIST_INIT_SIZE 1000
  5. # define LISTINCREMENT 10
  6. # define OK 1
  7. # define ERROR 0
  8. # define OVERFLOW -1
  9. typedef struct
  10. {
  11. int *elem;
  12. int length;
  13. int listsize;
  14. }SqList;
  15. int InitList_Sq(SqList &L)
  16. {
  17. L.elem = (int *)malloc(LIST_INIT_SIZE * sizeof (int));
  18. if (!L.elem)
  19. exit(OVERFLOW);
  20. L.listsize = LIST_INIT_SIZE;
  21. L.length = 0;
  22. return OK;
  23. }
  24. int Create_SqList(SqList &L)
  25. {
  26. int i,n;
  27. printf("请输入您要创建顺序表元素的个数:");
  28. scanf("%d",&n);
  29. for (i=0; i<n; i++)
  30. {
  31. scanf("%d",&L.elem[i] );
  32. }
  33. L.length = n;
  34. return OK;
  35. }
  36. void Display(SqList L)
  37. {
  38. int i;
  39. for (i=0; i<L.length; i++)
  40. {
  41. printf("%4d",L.elem [i]);
  42. }
  43. printf("\n");
  44. }
  45. void MergeList_Sq(SqList La, SqList Lb, SqList &Lc)
  46. {
  47. int *pa,*pb,*pc;
  48. int *pa_last,*pb_last;
  49. pa = La.elem;
  50. pb = Lb.elem;
  51. Lc.listsize = Lc.length = La.length+Lb.length;
  52. pc = Lc.elem = (int *)malloc(Lc.listsize*sizeof(int));
  53. if(!Lc.elem)
  54. exit(OVERFLOW);
  55. pa_last = La.elem + La.length -1;
  56. pb_last = Lb.elem + Lb.length -1;
  57. while (pa<=pa_last && pb<=pb_last)
  58. {
  59. if(*pa<=*pb)
  60. *pc++ = *pa++;
  61. else
  62. *pc++ = *pb++;
  63. }
  64. while (pa<=pa_last)
  65. *pc++ = *pa++;
  66. while (pb<=pb_last)
  67. *pc++ = *pb++;
  68. }
  69. int ListInsert_Sq(SqList &L, int i, int e)
  70. {
  71. int *p,*q,*newbase;
  72. if (i<0 || i>L.length +1)
  73. return ERROR;
  74. if(L.length >L.listsize )
  75. {
  76. newbase = (int *)realloc(L.elem ,(L.listsize + LISTINCREMENT) * sizeof (int));
  77. if (!newbase)
  78. exit(OVERFLOW);
  79. L.elem = newbase;
  80. L.listsize += LISTINCREMENT;
  81. }
  82. q = &L.elem [i-1];
  83. for (p=&L.elem [L.length -1]; p>=q; --p)
  84. {
  85. *(p+1) = *p;
  86. }
  87. *q = e;
  88. ++L.length ;
  89. return OK;
  90. }
  91. int ListDelete_Sq(SqList &L, int i, int &e)
  92. {
  93. int *p,*q;
  94. if (i<0 || i>=L.length )
  95. return ERROR;
  96. p = &L.elem [i-1];
  97. e = *p;
  98. printf("您删除的元素是: %d\n",e);
  99. q = L.elem + L.length -1;
  100. for (++p; p<=q; ++p)
  101. {
  102. *(p-1) = *p;
  103. }
  104. --L.length ;
  105. return OK;
  106. }
  107. int GetElem(SqList L,int i,int &e)
  108. {
  109. if(i<1 || i>L.length)
  110. return ERROR;
  111. e=*(L.elem+i-1);
  112. return OK;
  113. }
  114. int equal(int e1,int e2)
  115. {
  116. if(e1==e2)
  117. return OK;
  118. else
  119. return ERROR;
  120. }
  121. int LocateElem_Sq(SqList L, int e,int (*compare)(int, int))
  122. {
  123. int i;
  124. int *p;
  125. i = 1;
  126. p = L.elem;
  127. while (i <= L.length && !(*compare)(*p++, e))
  128. ++i;
  129. if (i <= L.length)
  130. return i;
  131. else
  132. return 0;
  133. }
  134. void DifferList(SqList La,SqList Lb,SqList &Le)//实现两个集合的差集
  135. {
  136. int La_len,Lb_len,Le_len,i;
  137. int e;
  138. La_len = La.length;
  139. Lb_len = Lb.length;
  140. Le_len = Le.length ;
  141. for (i=1; i<=La_len; i++)
  142. {
  143. GetElem(La, i, e);
  144. if (!LocateElem_Sq(Lb, e, equal))
  145. ListInsert_Sq(Le, ++Le_len, e);
  146. }
  147. }
  148. void Union(SqList &La, SqList Lb) {
  149. int La_len,Lb_len,i;
  150. int e;
  151. La_len = La.length;
  152. Lb_len = Lb.length;
  153. for (i=1; i<=Lb_len; i++)
  154. {
  155. GetElem(Lb, i, e);
  156. if (!LocateElem_Sq(La, e, equal))
  157. ListInsert_Sq(La, ++La_len, e);
  158. }
  159. }
  160. void InferList(SqList La,SqList Lb,SqList &Ld)//实现两个集合的交集
  161. {
  162. int *pa,*pb,*pd;
  163. pa=La.elem;//pa指向第一个元素
  164. pb=Lb.elem;//pb指向第二个元素
  165. int i,j;
  166. pd=Ld.elem=(int *)malloc(Ld.listsize*sizeof(int));//pd分配空间
  167. Ld.length=0;
  168. for(i=0;i<La.length;i++)
  169. {
  170. for(j=0;j<Lb.length;j++)
  171. {
  172. if(La.elem[i]==Lb.elem[j])
  173. {
  174. Ld.elem[Ld.length]=La.elem[i];
  175. Ld.length++;
  176. }
  177. }
  178. }
  179. }
  180. int main(void)
  181. {
  182. int i,e;
  183. SqList L;
  184. SqList La,Lb,Lc,Ld,Le;
  185. InitList_Sq(L);
  186. InitList_Sq(La);
  187. InitList_Sq(Lb);
  188. InitList_Sq(Lc);
  189. InitList_Sq(Ld);
  190. InitList_Sq(Le);
  191. printf(" ------------------------------------------------------------------------\n");
  192. printf(" | 欢 迎 使 用 本 系 统! |\n");
  193. printf(" | 制 作 人 :风尘三侠 |\n");
  194. printf(" | 1:建立一个顺序表 5:求两个顺序表的差集 |\n");
  195. printf(" | 2:插入一个元素 6:求两个顺序表的并集 |\n");
  196. printf(" | 3:删除一个元素 7:求两个顺序表的交集 |\n");
  197. printf(" | 4:求两个顺序表的归并 8: 退出本系统 |\n");
  198. printf(" ------------------------------------------------------------------------\n");
  199. do{
  200. printf("请选择您要执行的操作:");
  201. scanf("%d",&i);
  202. switch(i)
  203. {
  204. case 1:
  205. {
  206. Create_SqList(L);
  207. printf("您创建的顺序表是:");
  208. Display(L);
  209. break;
  210. }
  211. case 2:
  212. {
  213. printf("请先创建一个顺序表!\n");
  214. Create_SqList(L);
  215. printf("您创建的顺序表是:");
  216. Display(L);
  217. printf("请输入您要插入的元素:");
  218. scanf("%d",&e);
  219. printf("请输入您要插入元素的位置:");
  220. scanf("%d",&i);
  221. ListInsert_Sq(L,i,e);
  222. printf("插入元素后的顺序表是:");
  223. Display(L);
  224. break;
  225. }
  226. case 3:
  227. {
  228. printf("请先创建一个顺序表!\n");
  229. Create_SqList(L);
  230. printf("您创建的顺序表是:");
  231. Display(L);
  232. printf("请输入您要删除元素的位置:");
  233. scanf("%d",&i);
  234. ListDelete_Sq(L,i,e);
  235. printf("删除元素后的顺序表是:");
  236. Display(L);
  237. break;
  238. }
  239. case 4:
  240. {
  241. printf("请创建第一个顺序表!\n");
  242. Create_SqList(La);
  243. printf("您创建顺序表是:");
  244. Display(La);
  245. printf("请创建第二个顺序表!\n");
  246. Create_SqList(Lb);
  247. printf("您创建顺序表是:");
  248. Display(Lb);
  249. printf("两顺序表归并后的顺序表是:");
  250. MergeList_Sq(La,Lb,Lc);
  251. Display(Lc);
  252. break;
  253. }
  254. case 5:
  255. {
  256. printf("请创建第一个顺序表!\n");
  257. Create_SqList(La);
  258. printf("您创建顺序表是:");
  259. Display(La);
  260. printf("请创建第二个顺序表!\n");
  261. Create_SqList(Lb);
  262. printf("您创建顺序表是:");
  263. Display(Lb);
  264. printf("两顺序表的差集是:");
  265. DifferList(La,Lb,Le);
  266. Display(Le);
  267. break;
  268. }
  269. case 6:
  270. {
  271. printf("请创建第一个顺序表!\n");
  272. Create_SqList(La);
  273. printf("您创建顺序表是:");
  274. Display(La);
  275. printf("请创建第二个顺序表!\n");
  276. Create_SqList(Lb);
  277. printf("您创建顺序表是:");
  278. Display(Lb);
  279. printf("两顺序表的并集是:");
  280. Union(La,Lb);
  281. Display(La);
  282. break;
  283. }
  284. case 7:
  285. {
  286. printf("请创建第一个顺序表!\n");
  287. Create_SqList(La);
  288. printf("您创建顺序表是:");
  289. Display(La);
  290. printf("请创建第二个顺序表!\n");
  291. Create_SqList(Lb);
  292. printf("您创建顺序表是:");
  293. Display(Lb);
  294. printf("两顺序表的交集是:");
  295. InferList(La,Lb,Ld);
  296. Display(Ld);
  297. break;
  298. }
  299. case 8:
  300. {
  301. exit(0);
  302. }
  303. default:
  304. {
  305. printf("您的输入有误,请重新输入!\n!");
  306. break;
  307. }
  308. }
  309. }while(i!=8);
  310. return 0;
  311. }

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

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

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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