C语言数据结构之队列的实现(链表实现)

深藏阁楼爱情的钟 2022-11-27 12:04 188阅读 0赞

C语言数据结构之队列的实现(链表实现)

tips:前些天学习了链表和栈,今天来看看c语言数据结构之队列的实现以及队列的各种操作。


队列的特点是先进先出,后进后出,因此我们很容易就能够想到用单链表的尾插法,和头部删除法去实现队列的入队和出队的操作。


首先我们来看一下队列的各种操作的实现思路以及具体实现过程
准备工作:

  • 创建队列元素的结构体

    //定义结点
    typedef struct tag
    {

    1. int val;//队列(链表)的值
    2. struct tag *pNext;

    }Node,*pNode;

  • 创建队列的结构体

    //定义队列
    typedef struct tagQueue
    {

    1. pNode phead, ptail;//队头队尾指针,分别指向头结点和尾结点

    }Queue,*pQueue;

  • 准备队列的打印输出函数

    //测试输出队列元素
    void print_queue(pQueue p)
    {

    1. pNode pcur = p->phead;//定义工具人,保存当前结点信息
    2. while (pcur!=NULL)
    3. {
    4. printf("%d\n", pcur->val);
    5. pcur = pcur->pNext;
    6. }
    7. printf("------------------------------------------\n");

    }


1、入队(enQueue)

思路:

  • 为链表创建新的结点,并将其初始化;
  • 采用尾部插入法将新结点入队;

具体实现:

  1. //入队
  2. void enQueue(pQueue p,int val)
  3. {
  4. pNode pnew = (pNode)calloc(1,sizeof(Node));//为新结点申请空间并初始化
  5. pnew->val = val;//插入的值
  6. //入队
  7. if (p->phead == NULL)//判断队列是否为空
  8. {
  9. //为空,头尾指针指向第一个结点
  10. p->phead = pnew;
  11. p->ptail = pnew;
  12. }
  13. else
  14. {
  15. //不为空,尾插法
  16. p->ptail->pNext = pnew;//新结点放在原来尾结点后面
  17. p->ptail = pnew;//新结点变成尾结点
  18. }
  19. }

2、出队(deQueue)

思路:

  • 采用头部删除法,删除头结点(即队头元素),完成出队操作;
  • 出队后,释放出队元素所占用的空间;

具体实现:

  1. //出队
  2. void deQueue(pQueue p)
  3. {
  4. //出队,头部删除法
  5. pNode pcur;//工具人,指向当前结点
  6. pcur = p->phead;
  7. if (p->phead == NULL)
  8. {
  9. //队列为空
  10. printf("队列为空!\n");
  11. }
  12. else
  13. {
  14. //头部删除法
  15. p->phead = p->phead->pNext;//头结点后移
  16. //释放空间
  17. free(pcur);
  18. }
  19. }

3、判断队列是否为空(isEmpty)

思路:

  • 当队头指针为空时,队列即为空(当头指针=尾指针不为空时,就剩最后一个元素);

总之判断方法很多,大家可以尽情发挥。

具体实现:

  1. //判断队列是否为空
  2. int isEmpty(pQueue p)
  3. {
  4. if (p->phead == NULL)
  5. return 1;//为空
  6. else
  7. return 0;
  8. }

至此队列的基本操作我们已经全部实现了,接下来我们在main()函数中测试一下:

  1. int main()
  2. {
  3. //定义一个队列,并初始化
  4. //队列是先进先出,用尾插法和头部删除法实现进队和出队
  5. Queue que;
  6. int val;
  7. char panduan;//判断是否出队(y/n)
  8. memset(&que,0,sizeof(Queue));//memset主要是用来对空间初始化的
  9. //循环入队
  10. while (scanf("%d", &val) != EOF)
  11. {
  12. //入队
  13. enQueue(&que, val);
  14. }
  15. //打印队列元素
  16. printf("队列中的元素为:\n");
  17. print_queue(&que);
  18. //判断队列是否为空
  19. if (isEmpty(&que))
  20. {
  21. printf("队列为空!\n");
  22. }
  23. else
  24. {
  25. printf("队列不为空!\n");
  26. }
  27. printf("------------------------------------------\n");
  28. while (printf("是否出队?y/n:"), scanf("%c", &panduan) != NULL)
  29. {
  30. if (panduan == 'y')
  31. {
  32. //出队
  33. deQueue(&que);
  34. //打印元素
  35. print_queue(&que);
  36. //判断队列是否为空
  37. if (isEmpty(&que))
  38. {
  39. printf("队列为空!\n");
  40. }
  41. else
  42. {
  43. printf("队列不为空!\n");
  44. }
  45. printf("---------------------------------\n");
  46. }
  47. else if (panduan == 'n')
  48. {
  49. break;
  50. }
  51. }
  52. return 0;
  53. }

实现结果:
在这里插入图片描述
队列的操作到目前来说已经实现,希望对大家的学习能够有所帮助,加油!


tips:为了不让生活留下遗憾和后悔,我们应该尽可能地抓住一切改变生活的机会。

发表评论

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

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

相关阅读