赞
踩
目录
以下是我们队列需要实现的功能
- #pragma once
-
- #include <stdio.h>
- #include <stdlib.h>
- #include <stdbool.h>
- #include <assert.h>
-
- typedef int QDataType;
-
- //定义我们队列的结点
- typedef struct QueueNode
- {
- QDataType data;
- struct QueueNode* next;
- }QNode;
-
- //定义一个队列类型,并且给我们的队列定义头指针和尾指针
- typedef struct Queue
- {
- QNode* head;
- QNode* tail;
-
- }Queue;
-
- //队列初始化
- void QueueInit(Queue* pq);
- //摧毁队列
- void QueueDestory(Queue* pq);
- //元素入队
- void QueuePush(Queue* pq, QDataType x);
- //元素出队
- void QueuePop(Queue* pq);
- //判断当前队列是否为空
- bool QueueEmpty(Queue* pq);
- //判断队列的大小
- size_t QueueSize(Queue* pq);
- //获取队首元素
- QDataType QueueFront(Queue* pq);
- //获取队尾元素
- QDataType QueueBack(Queue* pq);
将我们的队首指针和队尾指针全部都置空
- void QueueInit(Queue* pq)
- {
- assert(pq);
- pq->head = pq->tail = NULL;
- }
- void QueueDestory(Queue* pq)
- {
- assert(pq);
- //创建一个临时指针指向我们队伍的头
- QNode* cur = pq->head;
- while (cur)
- {
- //用next指针记录下我们临时指针的下一个结点
- QNode* next = cur->next;
- //将我们的临时指针置空
- free(cur);
- //将我们的cur指针指向下一个需要释放空间的位置,实现迭代。
- cur = next;
- }
-
- pq->head = pq->tail = NULL;
- }
- void QueuePush(Queue* pq, QDataType x)
- {
- assert(pq);
- //开辟一片的新的空间作为新的结点
- QNode* newnode = (QNode*)malloc(sizeof(QNode));
- assert(newnode);
- //将我们的新的结点的数据传入
- newnode->data = x;
- //将我们新的结点的next指针置空
- newnode->next = NULL;
- //队列都是从队尾入队的,我们需要从队尾尾插我们的结点。
- if (pq->tail == NULL)
- {
- assert(pq->head == NULL);
- pq->head = pq->tail = newnode;
- }
- else
- {
- pq->tail->next = newnode;
- pq->tail = newnode;
- }
- }
- void QueuePop(Queue* pq)
- {
- assert(pq);
- assert(pq->head && pq->tail);
- //队列的出队操作是在队首,同时将我们的队首的结点空间释放
- if (pq->head->next == NULL)
- {
- free(pq->head);
- pq->head = pq->tail = NULL;
- }
- else
- {
- QNode* next = pq->head->next;
- free(pq->head);
- pq->head = next;
- }
- }
- bool QueueEmpty(Queue* pq)
- {
- assert(pq);
-
- //判断时否为空,只需要判断我们的头指针是否为NULL就可以了
- return pq->head == NULL;
- }
- size_t QueueSize(Queue* pq)
- {
- assert(pq);
- //创建一个临时结点指向我们的头结点,然后遍历完整张队列,就能够得到我们队列的长度
- QNode* cur = pq->head;
- size_t size = 0;
- while (cur)
- {
- size++;
- cur = cur->next;
- }
-
- return size;
- }
- //因为我们有队首指针和队尾指针,所以直接返回队首指针和队尾指针指向的结点的数据
- QDataType QueueFront(Queue* pq)
- {
- assert(pq);
- assert(pq->head);
-
- return pq->head->data;
- }
-
- QDataType QueueBack(Queue* pq)
- {
- assert(pq);
- assert(pq->tail);
-
- return pq->tail->data;
- }
以下是写在queue.c中的内容。
-
- #include "queue.h"
-
- void QueueInit(Queue* pq)
- {
- assert(pq);
- pq->head = pq->tail = NULL;
- }
-
- void QueueDestory(Queue* pq)
- {
- assert(pq);
- QNode* cur = pq->head;
- while (cur)
- {
- QNode* next = cur->next;
- free(cur);
- cur = next;
- }
-
- pq->head = pq->tail = NULL;
- }
-
- void QueuePush(Queue* pq, QDataType x)
- {
- assert(pq);
- QNode* newnode = (QNode*)malloc(sizeof(QNode));
- assert(newnode);
-
- newnode->data = x;
- newnode->next = NULL;
-
- if (pq->tail == NULL)
- {
- assert(pq->head == NULL);
- pq->head = pq->tail = newnode;
- }
- else
- {
- pq->tail->next = newnode;
- pq->tail = newnode;
- }
- }
-
- void QueuePop(Queue* pq)
- {
- assert(pq);
- assert(pq->head && pq->tail);
-
- if (pq->head->next == NULL)
- {
- free(pq->head);
- pq->head = pq->tail = NULL;
- }
- else
- {
- QNode* next = pq->head->next;
- free(pq->head);
- pq->head = next;
- }
- }
-
- bool QueueEmpty(Queue* pq)
- {
- assert(pq);
-
- //return pq->head == NULL && pq->tail == NULL;
- return pq->head == NULL;
- }
-
- size_t QueueSize(Queue* pq)
- {
- assert(pq);
- QNode* cur = pq->head;
- size_t size = 0;
- while (cur)
- {
- size++;
- cur = cur->next;
- }
-
- return size;
- }
-
- QDataType QueueFront(Queue* pq)
- {
- assert(pq);
- assert(pq->head);
-
- return pq->head->data;
- }
-
- QDataType QueueBack(Queue* pq)
- {
- assert(pq);
- assert(pq->tail);
-
- return pq->tail->data;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。