• 队列的各个函数的实现


    1.第一个结构是存放链表的数据,第二个结构体是存放头节点和尾节点的以方便找到尾节点,存放头节点的是phead,尾节点的是ptail

    1. typedef struct QueueNode
    2. {
    3. struct QueueNode* next;//单链表
    4. QDataType data;//放数据
    5. }QNode;
    6. typedef struct Queue
    7. {
    8. QNode* phead;//头节点
    9. QNode* ptail;//尾节点
    10. QDataType size; //统计有多少节点
    11. }Queue;

    2.初始化存放头节点和尾节点的第二个结构体

    1. void QueueInit(Queue* pq)//初始化
    2. {
    3. assert(pq);
    4. pq->phead = NULL;
    5. pq->ptail = NULL;
    6. pq->size = 0;
    7. }

    3.销毁函数,把第一个结构体节点地址存入了第二个结构体,再通过第二个结构体所存的地址去销毁第一个结构体

    1. void QueueDestroy(Queue* pq)//销毁
    2. {
    3. assert(pq);
    4. //第一个结构体
    5. QNode* cur = pq->phead;
    6. while (cur)
    7. {
    8. QNode* next = cur->next;
    9. free(cur);
    10. cur = next;//循环更新节点
    11. }
    12. pq->phead = NULL;
    13. pq->ptail = NULL;
    14. pq->size = 0;
    15. }

    4.插入函数,1.如果是空链表则把创建的节点的地址赋值给头指针和尾指针,2.不是空指针则把新建立的节点链接到尾指针的next上

    1. void QueuePush(Queue* pq, QDataType x)//插入数据
    2. {
    3. QNode* newnode = (QNode*)malloc(sizeof(QNode));//扩大的是第一个结构体
    4. if (newnode == NULL)
    5. {
    6. perror("malloc");
    7. return;
    8. }
    9. newnode->data = x;
    10. newnode->next = NULL;
    11. if (pq->phead == NULL)
    12. {
    13. pq->phead = pq->ptail = newnode;
    14. }
    15. else
    16. {
    17. pq->ptail->next = newnode;
    18. pq->ptail = newnode;
    19. }
    20. pq->size++;
    21. }

    5.队头出数据就是删队头。1.判空:判pq指针的空,再判pq->phead指针的空,2.如果链表只有一个节点就去了 (if语句) 删除第一个节点,3.链表有两个节点的才去(else)语句
    1. void QueuePop(Queue* pq)//队头出数据就是删队头
    2. {
    3. assert(pq);
    4. assert(!QueueEmpty(pq));//判pq->phead的空
    5. if (pq->phead->next == NULL)
    6. {
    7. free(pq->phead);
    8. pq->phead = pq->ptail = NULL;
    9. }
    10. else
    11. {
    12. QNode* next = pq->phead->next;
    13. free(pq->phead);
    14. pq->phead = next;
    15. }
    16. pq->size--;
    17. }

    6.返回对头数据,(pq指针)和(pq->phead头指针不能为空)
    1. QDataType QueueFront(Queue* pq)//返回对头数据
    2. {
    3. assert(pq);
    4. assert(!QueueEmpty(pq));
    5. return pq->phead->data;
    6. }

    7.返回队尾数据
    1. QDataType QueueBack(Queue* pq)//返回队尾数据
    2. {
    3. assert(pq);
    4. assert(!QueueEmpty(pq));
    5. return pq->ptail->data;
    6. }

    8.返回总链表节点的个数

    1. int QueueSize(Queue* pq)//返回总的数据个数
    2. {
    3. assert(pq);
    4. return pq->size;
    5. }

    9.判空函数,是空指针返回真,不是空指针返回假
    1. bool QueueEmpty(Queue* pq)//是空的返回真
    2. {
    3. assert(pq);
    4. return pq->phead == NULL && pq->ptail == NULL;
    5. }

  • 相关阅读:
    【机械仿真】基于matlab打桩机运动学仿真【含Matlab源码 2101期】
    Javascript中扩展运算符的作用及使用场景
    Linux C编译器从零开发一
    基于骑手优化优化的BP神经网络(分类应用) - 附代码
    12_C++_链表_回调函数
    SpringBoot 入门
    什么是零代码?无代码和低代码开发平台该如何抉择?
    Oxylabs 和 YiLu Proxy 性价比比较案例之IP如何防关联
    使用神经网络实现对天气的预测
    uniapp自定义权限菜单,动态tabbar
  • 原文地址:https://blog.csdn.net/m0_57383688/article/details/133188140