当前位置:   article > 正文

数据结构:链式队列

数据结构:链式队列

目录

        1.实现思想

        2.包含头文件

        3.结点设计

        4.接口函数实现


实现思想

        链式队列,指的是使用链表实现的队列,是一种常见的数据结构。队列遵循先进先出(FIFO)的原则,即最先进入队列的元素将是最先被移除的元素。链式队列通过链表的动态特性来实现队列的插入和删除操作,提供了比静态数组实现的队列更高的灵活性。为了实现链式队列,需要实现以下几点:

        1.节点定义: 链式队列由一系列节点组成,每个节点通常包含两个部分:数据部分和指向下一个节点的指针

        2.入队:在队列的末尾添加一个新元素。这通常涉及到创建一个新的节点,并将其链接到队尾,然后更新队尾指针

        3.出队:移除队列的第一个元素,并返回其数据。这通常涉及到更新队首指针,以及释放被移除节点的内存(如果需要的话)

        4.队首和队尾指针: 链式队列需要维护两个指针:队首指针(指向队列的第一个元素)和队尾指针(指向队列的最后一个元素)。这两个指针使得入队和出队操作可以在 O(1) 时间复杂度内完成

        5.动态内存管理: 由于链式队列的元素是动态添加的,因此需要使用动态内存分配来创建新的节点。在 C 或 C++ 中,通常通过 malloc 或 new 操作符来完成

        6.空队列处理: 需要有一种机制来检测队列是否为空,通常可以通过检查队首指针是否为 NULL 来实现


包含头文件

  1. #include<stdio.h>
  2. #include<stdlib.h>

结点设计

  1. typedef int Elemtype; //给int类型取别名为Elemtype
  2. typedef struct LinkNode{
  3. Elemtype data;
  4. struct LinkNode* next; //定义struct LinkNode类型的指针next指向下一个结点
  5. }QNode,*LNode;
  6. typedef struct LiNode{
  7. struct LinkNode* rear; //定义struct LinkNode类型的指针rear指向队尾结点
  8. struct LinkNode* front; //定义struct LinkNode类型的指针front指向队头结点
  9. };

接口函数实现

  1. /*注:定义存储指向队头结点与指向队尾结点的指针后,在函数中调用
  2. 两个结构体时,要注意其中的关系,不要因为队头的结点的指针
  3. 指向的结点地址的再次指向而造成混乱
  4. */
  5. void InitLNode(LiNode &B); //声明函数InitLNode用于初始化链式队列
  6. bool InputLNode(LiNode &B); //声明函数InputLNode用于在队列中输出数据
  7. bool LNodeEmpty(LiNode& B); //声明函数LNodeEmpty用于判断队列是否为空
  8. void InsertLNode(LiNode &B);//声明函数InsertLNode用于在队列中输入数据
  9. bool DestroyQueue(LNode& A);//声明函数DestroyQueue用于销毁队列
  10. //在队列中输出数据
  11. bool InputLNode(LiNode &B) {
  12. if (LNodeEmpty(B)) {
  13. return false;
  14. }else{
  15. LNode Q = B.front->next; //定义LNode类型的指针变量Q指向头结点的下一个结点
  16. printf("输出数据为:%d", Q->data);//输出数据
  17. B.front->next = Q->next;
  18. if(B.rear == Q){ //判断输出的结点是否为最后一个结点
  19. B.rear = B.front; //将其队列置空
  20. }
  21. return true;
  22. }
  23. }
  24. //判断队列是否为空
  25. bool LNodeEmpty(LiNode &B){
  26. if(B.front == B.rear){
  27. printf("传入的链式队列为空");
  28. return true;
  29. }else{
  30. return false;
  31. }
  32. }
  33. //在队列中输入数据
  34. void InsertLNode(LiNode &B){
  35. Elemtype i; //定义int类型的变量i接受键盘键入的数据
  36. LNode W = (QNode*)malloc(sizeof(QNode));//定义LNode类型w向计算机的堆内申请存储空间
  37. printf("请输入要插入的数据");
  38. scanf_s("%d", &i);
  39. W->data = i;
  40. W->next = NULL;
  41. B.rear->next = W;
  42. B.rear = W; //更新尾结点的指向
  43. }
  44. //初始化链式队列
  45. void InitLNode(LiNode &B){
  46. B.front=B.rear=(QNode*)malloc(sizeof(QNode));
  47. B.front->next = NULL; //更新结点中next的指向
  48. printf("初始化链式队列成功\n");
  49. }

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

闽ICP备14008679号