当前位置:   article > 正文

链式队列的基本操作(详细)_链队列的基本操作

链队列的基本操作

 

目录

1.实现功能

2.建队列

3.进队列

4.打印队列信息

5.队列的判空

6.求队列的长度

7.求队尾元素

8.删除队列元素同时返回队尾元素的值

9.求队头元素

10.输入队列元素

11.摧毁一个队列

12.请空队列

13.switch case选择

14.全部代码内容

15.运行图片


本帖可以实现的功能

1.实现功能

  1. void pro()
  2. {
  3. printf("0.退出\n");
  4. printf("1.建立一个新队列\n");
  5. printf("2.按照输出方式打印队列信息\n");
  6. printf("3.求队列长度\n");
  7. printf("4.获取对头元素\n");
  8. printf("5.获取队尾元素\n");
  9. printf("6.删除对头元素\n");
  10. printf("7.判断队列是否为空\n");
  11. printf("8.在队尾插入一个数\n");
  12. printf("9.清空一个队列\n");
  13. printf("10.摧毁一个队列\n");
  14. }

2.建队列

  1. void InitQueue(LinkQueue &Q)
  2. {
  3. //建立链队列
  4. Q.front = Q.rear = (QueuePtr)malloc(sizeof(QNode));
  5. Q.front = Q.rear;
  6. if (!Q.front)
  7. printf("开辟空间失败\n");
  8. Q.front->next = NULL;
  9. printf("链式队列存储空间开辟完成\n");
  10. // Q.front->next=Q.rear->next;
  11. }

3.进队列

  1. Status EnQueue(LinkQueue &Q, int e)
  2. {
  3. //在队列的尾部插入元素
  4. QueuePtr p = (QueuePtr)malloc(sizeof(QNode));
  5. p->data = e;
  6. p->next = NULL;
  7. Q.rear->next = p;
  8. Q.rear = p;
  9. }

4.打印队列信息

  1. void print(LinkQueue Q)
  2. {
  3. //打印对列信息,按照输出方向
  4. QueuePtr p;
  5. p = Q.front->next;
  6. while (p != NULL)
  7. {
  8. printf("%d ", p->data);
  9. p = p->next;
  10. }
  11. printf("\n");
  12. }

5.队列的判空

  1. void QueueEmpty(LinkQueue Q)
  2. {
  3. //判断是否为空队列
  4. if (Q.front == Q.rear)
  5. {
  6. printf("空\n");
  7. }
  8. else
  9. {
  10. printf("不空\n");
  11. }
  12. }

6.求队列的长度

  1. void QueueLength(LinkQueue Q)
  2. {
  3. //求队列的长度
  4. int length = 0;
  5. QueuePtr p, q;
  6. p = Q.front->next;
  7. while (p != NULL)
  8. {
  9. p = p->next;
  10. length++;
  11. }
  12. printf("长度为%d\n", length);
  13. }

7.求队尾元素

  1. void QueueRear(LinkQueue Q)
  2. {
  3. //求队尾
  4. printf("队尾元素是:%d\n", Q.rear->data);
  5. }

8.删除队列元素同时返回队尾元素的值

  1. Status DeQueue(LinkQueue &Q)
  2. {
  3. int e;
  4. if (Q.front == Q.rear)
  5. {
  6. printf("这个队列为空\n");
  7. }
  8. QueuePtr p = Q.front->next;
  9. e = p->data;
  10. Q.front->next = p->next;
  11. if (Q.rear == p)
  12. {
  13. Q.rear = Q.front;
  14. }
  15. free(p);
  16. return e;
  17. }

9.求队头元素

  1. void QueueFront(LinkQueue Q)
  2. {
  3. //求对头
  4. printf("对头元素为:%d\n", Q.front->next->data);
  5. }

10.输入队列元素

  1. Status CreatQueue(LinkQueue &Q)
  2. {
  3. //输入队列元素
  4. printf("请输入队列里面的元素\n");
  5. int e;
  6. scanf("%d", &e);
  7. while (e != -1)
  8. {
  9. EnQueue(Q, e);
  10. scanf("%d", &e);
  11. }
  12. }

11.摧毁一个队列

  1. Status DestoryQueue(LinkQueue &Q)
  2. {
  3. QueuePtr p;
  4. while(!p)
  5. {
  6. p=Q.front;
  7. Q.front=Q.front->next;
  8. free(p);
  9. }
  10. printf("摧毁队列完成\n");
  11. }

12.请空队列

  1. Status ClearQueue(LinkQueue &Q)
  2. {
  3. Q.rear=Q.front->next=NULL;
  4. printf("清空操作已经完成\n");
  5. }

13.switch case选择

  1. void swi(LinkQueue Q)
  2. {
  3. int num;
  4. pro();
  5. printf("请输入功能数字:");
  6. scanf("%d", &num);
  7. while (num)
  8. {
  9. switch (num)
  10. {
  11. case 0:
  12. num = 0;
  13. break;
  14. case 1:
  15. printf("建立一个新队列\n");
  16. InitQueue(Q);
  17. printf("\n\n");
  18. CreatQueue(Q);
  19. printf("建立成功\n");
  20. break;
  21. case 2:
  22. if (Q.rear == NULL)
  23. {
  24. printf("在进行操作二时,需要进行操作一\n");
  25. }
  26. else
  27. {
  28. printf("队列信息如下:\n");
  29. print(Q);
  30. }
  31. break;
  32. case 3:
  33. if (Q.rear == NULL)
  34. {
  35. printf("在进行操作三时,需要进行操作一\n");
  36. }
  37. else
  38. {
  39. printf("队列");
  40. QueueLength(Q);
  41. }
  42. break;
  43. case 4:
  44. if (Q.rear == NULL)
  45. {
  46. printf("在进行操作四时,需要进行操作一\n");
  47. }
  48. else
  49. {
  50. printf("获取对头元素\n");
  51. QueueFront(Q);
  52. }
  53. break;
  54. case 5:
  55. if (Q.rear == NULL)
  56. {
  57. printf("在进行操作五时,需要进行操作一\n");
  58. }
  59. else
  60. {
  61. printf("获取队尾元素\n");
  62. QueueRear(Q);
  63. }
  64. break;
  65. case 6:
  66. if (Q.rear == NULL)
  67. {
  68. printf("在进行操作六时,需要进行操作一\n");
  69. }
  70. else
  71. {
  72. printf("删除对头元素,");
  73. int e;
  74. e = DeQueue(Q);
  75. printf("删除的对头元素是:%d\n", e);
  76. }
  77. break;
  78. case 7:
  79. if (Q.rear == NULL)
  80. {
  81. printf("在进行操作七时,需要进行操作一\n");
  82. }
  83. else
  84. {
  85. printf("判断队列是否为空\n");
  86. QueueEmpty(Q);
  87. }
  88. break;
  89. case 8:
  90. if (Q.rear == NULL)
  91. {
  92. printf("在进行操作八时,需要进行操作一\n");
  93. }
  94. else
  95. {
  96. printf("在队尾插入一个数\n");
  97. int n;
  98. printf("请输入一个数字:");
  99. scanf("%d", &n);
  100. printf("\n");
  101. EnQueue(Q, n);
  102. printf("插入成功\n");
  103. }
  104. break;
  105. case 9:
  106. if (Q.rear == NULL)
  107. {
  108. printf("在进行操作九时,需要进行操作一\n");
  109. }
  110. else
  111. {
  112. ClearQueue(Q);
  113. }
  114. break;
  115. case 10:
  116. if (Q.rear == NULL)
  117. {
  118. printf("在进行操作十时,需要进行操作一\n");
  119. }
  120. else
  121. {
  122. DestoryQueue(Q);
  123. Q.rear=NULL;
  124. }
  125. break;
  126. default:
  127. printf("输入错误,请重新输入\n");
  128. }
  129. printf("\n\n");
  130. pro();
  131. printf("请输入功能数字:");
  132. scanf("%d", &num);
  133. }
  134. }

14.全部代码内容

  1. // define区
  2. #define Stack_Init_Size 100
  3. #define Stack_Increment 10
  4. #define OK 1
  5. #define OVERFLOW -2
  6. #define ERROR 0
  7. //预处理
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. //typedef
  11. typedef int Status;
  12. typedef struct QNode
  13. {
  14. int data;
  15. struct QNode *next;
  16. } QNode, *QueuePtr;
  17. typedef struct
  18. {
  19. QueuePtr front;
  20. QueuePtr rear;
  21. } LinkQueue;
  22. //函数区声明
  23. void InitQueue(LinkQueue &Q); //建立链队列
  24. Status EnQueue(LinkQueue &Q, int e); //在队列的尾部插入元素
  25. void print(LinkQueue Q); //打印对列信息,按照输出方向
  26. void QueueEmpty(LinkQueue Q); //判断是否为空队列
  27. void QueueLength(LinkQueue Q); //求队列的长度
  28. void QueueRear(LinkQueue Q); //求队尾
  29. Status DeQueue(LinkQueue &Q); //求对头
  30. void QueueFront(LinkQueue Q); //输入队列元素
  31. Status CreatQueue(LinkQueue &Q); //创建队列
  32. Status DestoryQueue(LinkQueue &Q); //摧毁队列
  33. Status ClearQueue(LinkQueue &Q); //请空队列
  34. void pro(); //功能
  35. void swi(LinkQueue Q); //switch
  36. //主函数
  37. int main()
  38. {
  39. LinkQueue Q;
  40. Q.rear = NULL;
  41. swi(Q);
  42. }
  43. void InitQueue(LinkQueue &Q)
  44. {
  45. //建立链队列
  46. Q.front = Q.rear = (QueuePtr)malloc(sizeof(QNode));
  47. Q.front = Q.rear;
  48. if (!Q.front)
  49. printf("开辟空间失败\n");
  50. Q.front->next = NULL;
  51. printf("链式队列存储空间开辟完成\n");
  52. // Q.front->next=Q.rear->next;
  53. }
  54. Status EnQueue(LinkQueue &Q, int e)
  55. {
  56. //在队列的尾部插入元素
  57. QueuePtr p = (QueuePtr)malloc(sizeof(QNode));
  58. p->data = e;
  59. p->next = NULL;
  60. Q.rear->next = p;
  61. Q.rear = p;
  62. }
  63. void print(LinkQueue Q)
  64. {
  65. //打印对列信息,按照输出方向
  66. QueuePtr p;
  67. p = Q.front->next;
  68. while (p != NULL)
  69. {
  70. printf("%d ", p->data);
  71. p = p->next;
  72. }
  73. printf("\n");
  74. }
  75. void QueueEmpty(LinkQueue Q)
  76. {
  77. //判断是否为空队列
  78. if (Q.front == Q.rear)
  79. {
  80. printf("空\n");
  81. }
  82. else
  83. {
  84. printf("不空\n");
  85. }
  86. }
  87. void QueueLength(LinkQueue Q)
  88. {
  89. //求队列的长度
  90. int length = 0;
  91. QueuePtr p, q;
  92. p = Q.front->next;
  93. while (p != NULL)
  94. {
  95. p = p->next;
  96. length++;
  97. }
  98. printf("长度为%d\n", length);
  99. }
  100. void QueueRear(LinkQueue Q)
  101. {
  102. //求队尾
  103. printf("队尾元素是:%d\n", Q.rear->data);
  104. }
  105. Status DeQueue(LinkQueue &Q)
  106. {
  107. int e;
  108. if (Q.front == Q.rear)
  109. {
  110. printf("这个队列为空\n");
  111. }
  112. QueuePtr p = Q.front->next;
  113. e = p->data;
  114. Q.front->next = p->next;
  115. if (Q.rear == p)
  116. {
  117. Q.rear = Q.front;
  118. }
  119. free(p);
  120. return e;
  121. }
  122. void QueueFront(LinkQueue Q)
  123. {
  124. //求对头
  125. printf("对头元素为:%d\n", Q.front->next->data);
  126. }
  127. /*
  128. int DeQueue(LinkQueue &Q)
  129. {
  130. //删除对列的对头元素
  131. QNode *p;
  132. p = Q.front->next;
  133. int e = p->data;
  134. Q.front->next = p->next;
  135. free(p);
  136. return e;
  137. }*/
  138. Status CreatQueue(LinkQueue &Q)
  139. {
  140. //输入队列元素
  141. printf("请输入队列里面的元素\n");
  142. int e;
  143. scanf("%d", &e);
  144. while (e != -1)
  145. {
  146. EnQueue(Q, e);
  147. scanf("%d", &e);
  148. }
  149. }
  150. Status DestoryQueue(LinkQueue &Q)
  151. {
  152. QueuePtr p;
  153. while(!p)
  154. {
  155. p=Q.front;
  156. Q.front=Q.front->next;
  157. free(p);
  158. }
  159. printf("摧毁队列完成\n");
  160. }
  161. Status ClearQueue(LinkQueue &Q)
  162. {
  163. Q.rear=Q.front->next=NULL;
  164. printf("清空操作已经完成\n");
  165. }
  166. void pro()
  167. {
  168. printf("0.退出\n");
  169. printf("1.建立一个新队列\n");
  170. printf("2.按照输出方式打印队列信息\n");
  171. printf("3.求队列长度\n");
  172. printf("4.获取对头元素\n");
  173. printf("5.获取队尾元素\n");
  174. printf("6.删除对头元素\n");
  175. printf("7.判断队列是否为空\n");
  176. printf("8.在队尾插入一个数\n");
  177. printf("9.清空一个队列\n");
  178. printf("10.摧毁一个队列\n");
  179. }
  180. void swi(LinkQueue Q)
  181. {
  182. int num;
  183. pro();
  184. printf("请输入功能数字:");
  185. scanf("%d", &num);
  186. while (num)
  187. {
  188. switch (num)
  189. {
  190. case 0:
  191. num = 0;
  192. break;
  193. case 1:
  194. printf("建立一个新队列\n");
  195. InitQueue(Q);
  196. printf("\n\n");
  197. CreatQueue(Q);
  198. printf("建立成功\n");
  199. break;
  200. case 2:
  201. if (Q.rear == NULL)
  202. {
  203. printf("在进行操作二时,需要进行操作一\n");
  204. }
  205. else
  206. {
  207. printf("队列信息如下:\n");
  208. print(Q);
  209. }
  210. break;
  211. case 3:
  212. if (Q.rear == NULL)
  213. {
  214. printf("在进行操作三时,需要进行操作一\n");
  215. }
  216. else
  217. {
  218. printf("队列");
  219. QueueLength(Q);
  220. }
  221. break;
  222. case 4:
  223. if (Q.rear == NULL)
  224. {
  225. printf("在进行操作四时,需要进行操作一\n");
  226. }
  227. else
  228. {
  229. printf("获取对头元素\n");
  230. QueueFront(Q);
  231. }
  232. break;
  233. case 5:
  234. if (Q.rear == NULL)
  235. {
  236. printf("在进行操作五时,需要进行操作一\n");
  237. }
  238. else
  239. {
  240. printf("获取队尾元素\n");
  241. QueueRear(Q);
  242. }
  243. break;
  244. case 6:
  245. if (Q.rear == NULL)
  246. {
  247. printf("在进行操作六时,需要进行操作一\n");
  248. }
  249. else
  250. {
  251. printf("删除对头元素,");
  252. int e;
  253. e = DeQueue(Q);
  254. printf("删除的对头元素是:%d\n", e);
  255. }
  256. break;
  257. case 7:
  258. if (Q.rear == NULL)
  259. {
  260. printf("在进行操作七时,需要进行操作一\n");
  261. }
  262. else
  263. {
  264. printf("判断队列是否为空\n");
  265. QueueEmpty(Q);
  266. }
  267. break;
  268. case 8:
  269. if (Q.rear == NULL)
  270. {
  271. printf("在进行操作八时,需要进行操作一\n");
  272. }
  273. else
  274. {
  275. printf("在队尾插入一个数\n");
  276. int n;
  277. printf("请输入一个数字:");
  278. scanf("%d", &n);
  279. printf("\n");
  280. EnQueue(Q, n);
  281. printf("插入成功\n");
  282. }
  283. break;
  284. case 9:
  285. if (Q.rear == NULL)
  286. {
  287. printf("在进行操作九时,需要进行操作一\n");
  288. }
  289. else
  290. {
  291. ClearQueue(Q);
  292. }
  293. break;
  294. case 10:
  295. if (Q.rear == NULL)
  296. {
  297. printf("在进行操作十时,需要进行操作一\n");
  298. }
  299. else
  300. {
  301. DestoryQueue(Q);
  302. Q.rear=NULL;
  303. }
  304. break;
  305. default:
  306. printf("输入错误,请重新输入\n");
  307. }
  308. printf("\n\n");
  309. pro();
  310. printf("请输入功能数字:");
  311. scanf("%d", &num);
  312. }
  313. }

15.运行图片

在没有建立队列时:

建立队列

打印队列

求长度

获取对头元素

获取队尾元素

删除对头元素

队尾插入一个数字

 验证

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

闽ICP备14008679号