【数据结构】用C语言实现顺序表的各种操作(包括头删,尾删,插入,逆序,摧毁,清空等等)

前端之家收集整理的这篇文章主要介绍了【数据结构】用C语言实现顺序表的各种操作(包括头删,尾删,插入,逆序,摧毁,清空等等)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
  1. //顺序表的各种操作(包括头删,尾删,插入,逆序,摧毁,清空等等)
  2.  
  3. //头文件
  4. #ifndef _SEQLIST_H
  5. #define _SEQLIST_H
  6.  
  7.  
  8. #include<stdio.h>
  9.  
  10.  
  11.  
  12.  
  13. typedef int ElemType;
  14.  
  15.  
  16. #define INIT_SIZE 8
  17.  
  18.  
  19. typedef struct SeqList
  20. {
  21. ElemType *base;
  22. size_t capacity;
  23. size_t size;
  24. }SeqList;
  25.  
  26.  
  27. int isempty(SeqList *list);
  28. int isfull(SeqList *list);
  29.  
  30.  
  31. void InitList(SeqList *list);
  32. void push_back(SeqList *list,ElemType x);
  33. void show_list(SeqList *list);
  34. void push_front(SeqList *list,ElemType x);
  35. void pop_back(SeqList *list);
  36. void pop_front(SeqList *list);
  37. void insert_pos(SeqList *list,ElemType x,int pos);
  38. void quit_system(SeqList *list,int *x);
  39. int find(SeqList *list,ElemType x);
  40. int length(SeqList *list);
  41. void insert_val(SeqList *list,ElemType x);
  42. void sort(SeqList *list);
  43. void delete_pos(SeqList *list,int pos);
  44. void delete_val(SeqList *list,ElemType x);
  45. void clear(SeqList *list);
  46. void destory(SeqList *list);
  47. void reverse(SeqList *list);
  48.  
  49.  
  50. #endif
  51.  
  52. //函数文件
  53. #include"SeqList.h"
  54.  
  55.  
  56. int i;
  57. int isempty(SeqList *list) //检测表是否满
  58. {
  59. return list->size == 0;
  60. }
  61. int isfull(SeqList *list) //检测表是否空
  62. {
  63. return list->size >= list->capacity;
  64. }
  65.  
  66.  
  67. void InitList(SeqList *list) //表初始化
  68. {
  69. list->capacity = INIT_SIZE;
  70. list->base = (ElemType *)malloc(sizeof(ElemType)*list->capacity);
  71. list->size = 0;
  72. }
  73.  
  74.  
  75. void push_back(SeqList *list,ElemType x) //尾插
  76. {
  77. if (isfull(list))
  78. {
  79. printf("顺序表已满,不能插入!\n") ;
  80. return;
  81. }
  82. list->base[list->size] = x;
  83. list->size++;
  84. }
  85.  
  86.  
  87.  
  88.  
  89. void show_list(SeqList *list) //显示
  90. {
  91. if (list->size == 0)
  92. {
  93. printf("顺序表为空。\n");
  94. return;
  95. }
  96. for (i = 0; i<list->size; ++i)
  97. {
  98. printf("%d ",list->base[i]);
  99. }
  100. printf("\n");
  101. }
  102.  
  103.  
  104. void push_front(SeqList *list,ElemType x) //头插
  105. {
  106. if (isfull(list))
  107. {
  108. printf("顺序表已满,不能插入!\n");
  109. return;
  110. }
  111. for (i = list->size; i > 0; i--)
  112. {
  113. list->base[i] = list->base[i - 1];
  114. }
  115. list->base[0] = x;
  116. (list->size)++;
  117. }
  118.  
  119.  
  120. void pop_front(SeqList *list) //头删
  121. {
  122. if (isempty(list))
  123. {
  124. printf("顺序表为空,不能删除\n");
  125. return;
  126. }
  127. for (i = 0; i < list->size; i++)
  128. {
  129. list->base[i] = list->base[i + 1];
  130. }
  131. (list->size)--;
  132. }
  133.  
  134.  
  135. void pop_back(SeqList *list) //尾删
  136. {
  137. if (isempty(list))
  138. {
  139. printf("顺序表为空,不能删除\n");
  140. return;
  141. }
  142. list->size--;
  143. }
  144.  
  145.  
  146. void insert_pos(SeqList *list,int pos) ////按位置插
  147. {
  148. if (pos<0 || pos>list->size)
  149. {
  150. printf("插入的位置不正确。\n ");
  151. return;
  152. }
  153. if (isempty(list))
  154. {
  155. printf("顺序表已满,不能插入.\n");
  156. return;
  157. }
  158. for (i = list->size; i > pos; i--)
  159. {
  160. list->base[i] = list->base[i - 1];
  161. }
  162. list->base[pos] = x;
  163. list->size++;
  164. }
  165.  
  166.  
  167. void quit_system(SeqList *list,int *x) //退出
  168. {
  169. *x = 0;
  170. }
  171.  
  172.  
  173. int find(SeqList *list,ElemType x) //查找
  174. {
  175. for (i = 0; i < list->size; i++)
  176. {
  177. if (list->base[i]==x)
  178. return i;
  179. }
  180. return -1;
  181. }
  182.  
  183.  
  184. int length(SeqList *list) //求长度
  185. {
  186. return list->size;
  187. }
  188.  
  189.  
  190. void insert_val(SeqList *list,ElemType x) //按值插入
  191. {
  192. push_back(list,x);
  193. sort(list);
  194. }
  195.  
  196.  
  197. void sort(SeqList *list) //排序
  198. {
  199. if (isempty(list))
  200. {
  201. return;
  202. }
  203. for (int i = 1; i < list->size; i++)
  204. {
  205. for (int j = 0; j < list->size - i; j++)
  206. {
  207. int temp;
  208. if (list->base[j]>list->base[j + 1])
  209. {
  210. temp = list->base[j];
  211. list->base[j] = list->base[j + 1];
  212. list->base[j + 1] = temp;
  213. }
  214. }
  215. }
  216. }
  217.  
  218.  
  219. void delete_pos(SeqList *list,int pos) //按位置删除
  220. {
  221. if (isempty(list))
  222. {
  223. printf( "顺序表为空,不能删除。\n" );
  224. return;
  225. }
  226. if (pos < 0 || pos >= list->size)
  227. {
  228. printf("删除的位置不正确。\n");
  229. return;
  230. }
  231. for (int i = pos; i < list->size; ++i)
  232. {
  233. list->base[i] = list->base[i + 1];
  234. }
  235. list->size--;
  236. }
  237.  
  238.  
  239. void delete_val(SeqList *list,ElemType x) //按值删除
  240. {
  241. if (isempty(list))
  242. {
  243. printf( "顺序表为空,不能删除。\n");
  244. return;
  245. }
  246. int pos = find(list,x);
  247. if (pos == -1)
  248. {
  249. printf("未找到该数。\n");
  250. return;
  251. }
  252. delete_pos(list,pos);
  253. }
  254.  
  255.  
  256. void clear(SeqList *list) //清空
  257. {
  258. list->size = 0;
  259. }
  260.  
  261.  
  262. void destory(SeqList *list) //摧毁表
  263. {
  264. list->base = NULL;
  265. }
  266.  
  267.  
  268. void reverse(SeqList *list) //逆序
  269. {
  270. for (int i = 0,j = list->size - 1; i < list->size / 2; i++,j--)
  271. {
  272. int temp = list->base[i];
  273. list->base[i] = list->base[j];
  274. list->base[j] = temp;
  275. }
  276. }
  277.  
  278. //主函数
  279. #include"SeqList.h"
  280.  
  281.  
  282. void main()
  283. {
  284. SeqList mylist;
  285. InitList(&mylist);
  286.  
  287.  
  288. int select = 1;
  289. ElemType Item;
  290. int pos;
  291. while (select)
  292. {
  293. printf("****************************************************\n");
  294. printf("* [1] show_list [2] quit_system *\n");
  295. printf("* [3] push_front [4] push_back *\n");
  296. printf("* [5] pop_front [6] pop_back *\n");
  297. printf("* [7] insert_pos [8] insert_val *\n");
  298. printf("* [9] delete_pos [10] delete_val *\n");
  299. printf("* [11] find [12] length *\n");
  300. printf("* [13] clear [14] destory *\n");
  301. printf("* [15] reverse(逆序) [16] sort(顺序) *\n");
  302. printf("****************************************************\n");
  303. printf("请选择:");
  304. scanf_s("%d",&select);
  305. switch (select)
  306. {
  307. case 1:
  308. show_list(&mylist);
  309. break;
  310.  
  311.  
  312. case 2:
  313. quit_system(&mylist,&select);
  314. break;
  315.  
  316.  
  317. case 3:
  318. printf("请输入要插入的值(-1结束):>");
  319. while (scanf_s("%d",&Item),Item != -1)
  320. {
  321. push_front(&mylist,Item);
  322. }
  323. break;
  324.  
  325.  
  326. case 4:
  327. printf("请输入要插入的值(-1结束):>");
  328. while (scanf_s("%d",Item != -1)
  329. {
  330. push_back(&mylist,Item);
  331. }
  332. break;
  333.  
  334.  
  335. case 5:
  336. pop_front(&mylist);
  337. break;
  338.  
  339.  
  340. case 6:
  341. pop_back(&mylist);
  342. break;
  343.  
  344.  
  345. case 7:
  346. printf("请输入要插入的位置:");
  347. scanf_s("%d",&pos);
  348. printf("请输入要插入的值:");
  349. scanf_s("%d",&Item);
  350. insert_pos(&mylist,Item,pos);
  351. break;
  352.  
  353.  
  354. case 8:
  355. printf("请输入要插入的数:");
  356. scanf_s("%d",&Item);
  357. insert_val(&mylist,Item);
  358. break;
  359.  
  360.  
  361. case 9:
  362. printf("请输入要删的位置:");
  363. scanf_s("%d",&pos);
  364. delete_pos(&mylist,pos);
  365. break;
  366.  
  367.  
  368. case 10:
  369. printf("请输入要删的值:");
  370. scanf_s("%d",&Item);
  371. delete_val(&mylist,Item);
  372. break;
  373.  
  374.  
  375. case 11:
  376. printf("请输入要查找的数:");
  377. scanf_s("%d",&Item);
  378. pos=find(&mylist,Item);
  379. if (pos != -1)
  380. {
  381. printf("该数为第%d个数.\n",pos);
  382. }
  383. else
  384. printf("未找到该数。\n");
  385. break;
  386.  
  387.  
  388. case 12:
  389. printf("该顺序表长度为:%d\n",length(&mylist));
  390. break;
  391.  
  392.  
  393. case 13:
  394. clear(&mylist);
  395. break;
  396.  
  397.  
  398. case 14:
  399. destory(&mylist);
  400. break;
  401.  
  402.  
  403. case 15:
  404. reverse(&mylist);
  405. break;
  406.  
  407.  
  408. case 16:
  409. sort(&mylist);
  410. break;
  411.  
  412.  
  413. default:
  414. break;
  415. }
  416. }
  417. }
  418.  

猜你在找的数据结构相关文章