链式队列的基本操作C语言详解

待我称王封你为后i 2023-07-18 06:00 68阅读 0赞

链式队列有带头结点,和不带头结点的,我这里是带头结点的。
逻辑结构如图
在这里插入图片描述
编译环境vc6.0,代码如下:

  1. /* 首元结点是指链表中存储线性表中第一个数据元素的结点。 初始化:队头指针和队尾指针都指向头结点(不是首元结点) 队满状态:只要还有内存,理论上不会满 进队操作:插入到链尾,尾指针指向新的尾结点 出头操作:删除首元结点(不是头结点),头指针指向新首元结点 */
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. //结点结构
  5. typedef struct QNode
  6. {
  7. int data;
  8. struct QNode* next;
  9. }QNode,*Queueptr;
  10. //链表结构
  11. typedef struct
  12. {
  13. Queueptr front, rear; //对头,队尾指针
  14. }LinkQueue;
  15. //************************初始化**************************
  16. int InitLinkQueue(LinkQueue* Q)
  17. {
  18. Q->front = Q->rear = (QNode*)malloc(sizeof(QNode)); //建立头结点
  19. if (!Q->rear || !Q->front)
  20. {
  21. return 0;
  22. printf("动态分配内存失败\n");
  23. }
  24. Q->front->next = NULL; //初始化为空
  25. return 1;
  26. }
  27. //************************判断是否非空**************************
  28. int IsEmpty(LinkQueue Q)
  29. {
  30. if (Q.front == Q.rear) //头尾指针同时指向头结点为空
  31. return 1;
  32. else return 0;
  33. }
  34. //************************入队**************************
  35. int EnQueue(LinkQueue* Q, int e)
  36. {
  37. Queueptr s = (Queueptr)malloc(sizeof(QNode)); //动态申请内存
  38. if (s == NULL)
  39. return 0;
  40. s->data = e;
  41. s->next = NULL; //s插入到链尾巴,所有next指针指向空
  42. Q->rear->next = s; //插入
  43. Q->rear = s; //尾指针指向新的尾结点
  44. return 1;
  45. }
  46. //************************出队**************************
  47. int DeQueue(LinkQueue* Q, int* e)
  48. {
  49. Queueptr p;
  50. if (Q->front == Q->rear) //队空
  51. return 0;
  52. p = Q->front->next; //将欲删除的结点暂存给p
  53. *e = p->data; //获取元素值
  54. Q->front->next = p->next; //删除Q->front->next, Q->front时头结点,Q->front->next 时首元结点
  55. if (Q->rear == p) //若删除后只剩下头结点,将尾指针指向头结点
  56. Q->rear = Q->front;
  57. free(p);
  58. return 1;
  59. }
  60. //************************遍历输出**************************
  61. int LinkQueueTraverse(LinkQueue Q)
  62. {
  63. Queueptr p; //结点指针
  64. if (IsEmpty(Q))
  65. {
  66. printf("链表为空\n");
  67. return 0;
  68. }
  69. p = Q.front->next; //p指向首元结点
  70. while (p)
  71. {
  72. printf("%-5d", p->data);
  73. p = p->next;
  74. }
  75. return 1;
  76. }
  77. int main()
  78. {
  79. int i, e, n; //e入队元素,n入队元素个数
  80. LinkQueue Q;
  81. InitLinkQueue(&Q); //初始化
  82. printf("初始化成功\n");
  83. printf("请输入,入队元素个数\n");
  84. scanf("%d", &n);
  85. for (i = 0; i < n; i++)
  86. {
  87. printf("请输入第%d个元素值", i + 1);
  88. scanf("%d", &e);
  89. if (EnQueue(&Q, e))
  90. printf("入队成功\n");
  91. else printf("入队失败\n");
  92. }
  93. if (DeQueue(&Q, &e))
  94. printf("\n元素%d出队\n", e);
  95. else printf("出队失败\n");
  96. printf("遍历输出\n");
  97. LinkQueueTraverse(Q);
  98. return 0;
  99. }

测试案例:
在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,68人围观)

还没有评论,来说两句吧...

相关阅读

    相关 c语言实现基本功能

    链队列,实际上是一个带有头指针和尾指针的单链表,头指针指向头节点(不存放数据),尾指针指向队尾节点,虽然用头指针可以确定一个单链表,但是插入操作是在队尾进行,如果没有尾指针,会