当前位置:   article > 正文

c语言的顺序表操作_顺序表的输出c语言

顺序表的输出c语言

这几天刚刚学完了顺序表的相关操作,也完成了老师布置的相关实验,发一篇文章记录一下学习状况。该篇的顺序表是以存放字符为依据的(%c),如果想要表中保存整型类的数据,可以将前面转定义的Elemtype改为int 

会使用到的一个重要函数:中断函数(主要就是为了吸收scanf之后的‘\n’)

  1. void Interrupt()//中断函数
  2. {
  3. while (1) //用于检测换行符,使函数脱离scanf的连续输出
  4. if (getchar() == '\n')
  5. break;
  6. }

定义好顺序表

  1. typedef struct//定义一个初始化的顺序表
  2. {
  3. ElemType *elem;//基地址
  4. int length;
  5. }Sqlist;

顺序表初始化

  1. status InintList(Sqlist &L)//初始化
  2. {
  3. L.elem = (ElemType*)malloc(sizeof(ElemType[MAX]));
  4. if (!L.elem)
  5. {
  6. printf("初始化失败!");
  7. return OVERFLOW;
  8. }
  9. L.length = 0;
  10. printf("初始化成功!");
  11. return ok;
  12. }

顺序表的初始输入

  1. status MyList(Sqlist &L)//起始输入内容
  2. {
  3. int n, i;
  4. ElemType j;
  5. mark:Interrupt();
  6. printf("请输入要输入的初始元素个数:");
  7. scanf("%d", &n);
  8. if (n<1 || n>MAX)//防止手误输入数字以外的符号出现的无限循环
  9. {
  10. printf("输入错误!请重新输入");
  11. goto mark;
  12. }
  13. for (i = 0; i < n; i++)
  14. {
  15. Interrupt();//用于吸收上一个scanf剩余的\n的操作
  16. printf("请输入第%d个元素", i + 1);
  17. scanf("%c", &j);
  18. L.elem[i] = j;
  19. }
  20. L.length = n;
  21. return ok;
  22. }

输出顺序表内容

  1. status DispList(Sqlist &L)//输出顺序表的内容
  2. {
  3. int i;
  4. if (L.length == 0)
  5. {
  6. printf("空表\n");
  7. return 0;
  8. }
  9. else
  10. {
  11. printf("该表内容为:");
  12. for (i = 0; i < L.length; i++)
  13. {
  14. printf("%-5c",L.elem[i]);
  15. }
  16. return ok;
  17. }
  18. }

插入顺序表

  1. status ListInsert(Sqlist &L, int i, ElemType e)//插入顺序表
  2. {
  3. int j;
  4. mark:Interrupt();
  5. printf("请输入要插入的位置:");
  6. scanf("%d",&i);
  7. if (i<1 || i>L.length+1)
  8. {
  9. printf("输入错误,请重新输入!");
  10. goto mark;
  11. }
  12. if (L.length + 1 > MAX)
  13. {
  14. printf("该顺序表已达到上限,无法继续输入!");
  15. return 0;
  16. }
  17. Interrupt();
  18. printf("请输入要插入的元素:");
  19. scanf("%c", &e);
  20. for (j = L.length-1; j >= i - 1; j--)
  21. {
  22. L.elem[j + 1] = L.elem[j];
  23. }
  24. L.elem[i - 1]=e;
  25. ++L.length;
  26. return ok;
  27. }

删除顺序表某个元素

  1. status ListDelete(Sqlist &L, int i)//在顺序表中删除第i个元素
  2. {
  3. int j;
  4. mark:Interrupt();
  5. printf("请输入要删除的元素位置:");
  6. scanf("%d", &i);
  7. if (i<1 || i>L.length)
  8. {
  9. printf("输入错误,请重新输入!");
  10. goto mark;
  11. }
  12. for (j = i; j <= L.length-1; j++)
  13. {
  14. L.elem[j - 1] = L.elem[j];
  15. }
  16. --L.length;
  17. return ok;
  18. }

查找顺序表元素

  1. status LocateElem(Sqlist &L, ElemType e)//查找元素e在顺序表的位置
  2. {
  3. int i;
  4. Interrupt();
  5. printf("请输入要查找位置的元素:");
  6. scanf("%c", &e);
  7. for (i = 0; i < L.length; i++)
  8. {
  9. if (L.elem[i] == e)
  10. {
  11. printf("该元素在顺序表第%d个位置", i + 1);
  12. return ok;
  13. }
  14. }
  15. printf("该元素不在顺序表中");
  16. return ok;
  17. }

------------------------------------------------以上为顺序表的基本操作-----------------------------------------------

下方的完整代码还有求长度、释放、输出元素位置等等操作

代码会和书上的有所不同,因为我把一些操作都集成到原本的函数里面了,看一下大概的思路即可,当中一些输入用到了很多次那个“中断函数”,感觉是vs2013的scanf有bug ,输入完成后的那个回车会被下一个scanf吸收(猜测)

使用的编译器是:vs2013

下面就是我完成作业的代码(供参考,如果有错误的话还请指正,谢谢):

  1. #define _CRT_SECURE_NO_WARNINGS//顺序表
  2. #include <stdio.h>
  3. #include <malloc.h>
  4. //全局定义特殊变量
  5. #define MAX 50
  6. #define ok 1
  7. #define OVERFLOW 0
  8. //转定义区域
  9. typedef char ElemType;
  10. typedef int status;
  11. typedef struct//定义一个初始化的顺序表
  12. {
  13. ElemType *elem;//基地址
  14. int length;
  15. }Sqlist;
  16. //函数声明区域
  17. void Interrupt();//创建一个中断函数
  18. status InintList(Sqlist &L);//初始化顺序表
  19. status MyList(Sqlist &L);//输入顺序表的起始内容
  20. status DestroyList(Sqlist &L);//释放顺序表(删除)
  21. status ListEmpty(Sqlist &L);//判断顺序表是否为空
  22. status listLength(Sqlist &L);//返回顺序表的的元素个数(长度)
  23. status DispList(Sqlist &L);//输出顺序表的内容
  24. status GetElem(Sqlist &L,int i,ElemType e);//获取顺序表第i个的元素
  25. status LocateElem(Sqlist &L, ElemType e);//查找元素e在顺序表的位置
  26. status ListInsert(Sqlist &L, int i, ElemType e);//在顺序表中第i位置插入元素e
  27. status ListDelete(Sqlist &L, int i);//在顺序表中删除第i个元素
  28. void Interrupt()//中断函数
  29. {
  30. while (1) //用于检测换行符,使函数脱离scanf的连续输出
  31. if (getchar() == '\n')
  32. break;
  33. }
  34. status InintList(Sqlist &L)//初始化
  35. {
  36. L.elem = (ElemType*)malloc(sizeof(ElemType[MAX]));
  37. if (!L.elem)
  38. {
  39. printf("初始化失败!");
  40. return OVERFLOW;
  41. }
  42. L.length = 0;
  43. printf("初始化成功!");
  44. return ok;
  45. }
  46. status DestroyList(Sqlist &L)//释放顺序表
  47. {
  48. L.length = 0;
  49. printf("已经成功释放顺序表!");
  50. return ok;
  51. }
  52. status ListInsert(Sqlist &L, int i, ElemType e)//插入顺序表
  53. {
  54. int j;
  55. mark:Interrupt();
  56. printf("请输入要插入的位置:");
  57. scanf("%d",&i);
  58. if (i<1 || i>L.length+1)
  59. {
  60. printf("输入错误,请重新输入!");
  61. goto mark;
  62. }
  63. if (L.length + 1 > MAX)
  64. {
  65. printf("该顺序表已达到上限,无法继续输入!");
  66. return 0;
  67. }
  68. Interrupt();
  69. printf("请输入要插入的元素:");
  70. scanf("%c", &e);
  71. for (j = L.length-1; j >= i - 1; j--)
  72. {
  73. L.elem[j + 1] = L.elem[j];
  74. }
  75. L.elem[i - 1]=e;
  76. ++L.length;
  77. return ok;
  78. }
  79. status listLength(Sqlist &L)//顺序表长度
  80. {
  81. if (L.length == 0)
  82. {
  83. printf("该顺序表长度为0");
  84. }
  85. else
  86. {
  87. printf("该顺序表长度为%d",L.length);
  88. }
  89. return ok;
  90. }
  91. status ListDelete(Sqlist &L, int i)//在顺序表中删除第i个元素
  92. {
  93. int j;
  94. mark:Interrupt();
  95. printf("请输入要删除的元素位置:");
  96. scanf("%d", &i);
  97. if (i<1 || i>L.length)
  98. {
  99. printf("输入错误,请重新输入!");
  100. goto mark;
  101. }
  102. for (j = i; j <= L.length-1; j++)
  103. {
  104. L.elem[j - 1] = L.elem[j];
  105. }
  106. --L.length;
  107. return ok;
  108. }
  109. status MyList(Sqlist &L)//起始输入内容
  110. {
  111. int n, i;
  112. ElemType j;
  113. mark:Interrupt();
  114. printf("请输入要输入的初始元素个数:");
  115. scanf("%d", &n);
  116. if (n<1 || n>MAX)//防止手误输入数字以外的符号出现的无限循环
  117. {
  118. printf("输入错误!请重新输入");
  119. goto mark;
  120. }
  121. for (i = 0; i < n; i++)
  122. {
  123. Interrupt();//用于吸收上一个scanf剩余的\n的操作
  124. printf("请输入第%d个元素", i + 1);
  125. scanf("%c", &j);
  126. L.elem[i] = j;
  127. }
  128. L.length = n;
  129. return ok;
  130. }
  131. status LocateElem(Sqlist &L, ElemType e)//查找元素e在顺序表的位置
  132. {
  133. int i;
  134. Interrupt();
  135. printf("请输入要查找位置的元素:");
  136. scanf("%c", &e);
  137. for (i = 0; i < L.length; i++)
  138. {
  139. if (L.elem[i] == e)
  140. {
  141. printf("该元素在顺序表第%d个位置", i + 1);
  142. return ok;
  143. }
  144. }
  145. printf("该元素不在顺序表中");
  146. return ok;
  147. }
  148. status DispList(Sqlist &L)//输出顺序表的内容
  149. {
  150. int i;
  151. if (L.length == 0)
  152. {
  153. printf("空表\n");
  154. return 0;
  155. }
  156. else
  157. {
  158. printf("该表内容为:");
  159. for (i = 0; i < L.length; i++)
  160. {
  161. printf("%-5c",L.elem[i]);
  162. }
  163. return ok;
  164. }
  165. }
  166. status GetElem(Sqlist &L, int i, ElemType e)//获取顺序表第i个的元素
  167. {
  168. mark:Interrupt();
  169. printf("请输入要查找的元素位置:");
  170. scanf("%d",&i);
  171. if (i<1 || i>MAX)//防止手误输入数字以外的符号出现的无限循环
  172. {
  173. printf("输入错误!请重新输入");
  174. goto mark;
  175. }
  176. if (i<1 || i>L.length)
  177. {
  178. printf("没有该位置的元素!");
  179. return 0;
  180. }
  181. e = L.elem[i - 1];
  182. printf("顺序表的第%d个位置元素为:%c",i,e);
  183. }
  184. status ListEmpty(Sqlist &L)//判断顺序表是否为空
  185. {
  186. if (L.length == 0)
  187. {
  188. printf("该顺序表为空");//实际上返回值是T
  189. }
  190. else
  191. {
  192. printf("该顺序表不为空");//实际上返回值是F
  193. }
  194. return ok;
  195. }
  196. int main()
  197. {
  198. int a,f=0,i=0;
  199. ElemType e=0;
  200. Sqlist L;//定义好顺序表
  201. while (1)
  202. {
  203. printf("\n");
  204. printf("================================\n");
  205. printf("| 顺序表操作系统 |\n");
  206. printf("================================\n");
  207. printf("| 1.初始化顺序表 |\n");
  208. printf("| 2.起始顺序输入元素 |\n");
  209. printf("| 3.输出顺序表内容 |\n");
  210. printf("| 4.输出顺序表长度 |\n");
  211. printf("| 5.判断顺序表情况 |\n");
  212. printf("| 6.输出指定位置元素 |\n");
  213. printf("| 7.输出指定元素位置 |\n");
  214. printf("| 8.插入顺序表指定位置 |\n");
  215. printf("| 9.删除顺序表指定位置 |\n");
  216. printf("| 10.释放顺序表 |\n");
  217. printf("| 0.退出顺序表操作系统 |\n");
  218. printf("================================\n");
  219. printf("请选择功能(0-10):");
  220. mark:scanf("%d", &a);
  221. switch (a)
  222. {
  223. case 0:f = 1; break;
  224. case 1:InintList(L); break;
  225. case 2: MyList(L); break;
  226. case 3: DispList(L); break;
  227. case 4:listLength(L); break;
  228. case 5: ListEmpty(L); break;
  229. case 6: GetElem(L, i, e); break;
  230. case 7: LocateElem(L, e); break;
  231. case 8: ListInsert(L, i, e); break;
  232. case 9:ListDelete(L, i); break;
  233. case 10: DestroyList(L); break;
  234. default:printf("选择功能错误!请重新选择菜单功能:"); goto mark;
  235. }
  236. if (f == 1)
  237. {
  238. printf("已经退出系统");
  239. break;//该break是为了退出while的无限“菜单”循环
  240. }
  241. }
  242. }

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

闽ICP备14008679号