
MyQueue.h头文件:
#ifndef MYQUEUE_H
#define MYQUEUE_H
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
typedef int QElemType;
typedef struct QueueNode {
struct QueueNode* next;
QElemType val;
}QueueNode;
typedef struct Queue {
QueueNode* head;
QueueNode* tail;
}Queue;
int QueueInit(Queue* q);
int EnQueue(Queue* q, QElemType e);
QElemType DeQueue(Queue* q);
int QueueEmpty(Queue* q);
int QueueSize(Queue* q);
void QueueDestroy(Queue* q);
QElemType QueueFront(Queue* q);
QElemType QueueBack(Queue* q);
#endif
MyQueue.c源文件:
#include "My_Queue.h"
//初始化队列,使head指针和tail指针初始化为NULL
int QueueInit(Queue* q) {
q->head = q->tail = NULL;
return 0;
}
//入队元素。如果队为空(q->head==NULL),将head和NULL同时设为newNode。否则,将tail指针域指向newNode,然后将tail设置为newNode
int EnQueue(Queue* q, QElemType x) {
assert(q);
QueueNode* newNode = (QueueNode*)malloc(sizeof(QueueNode));
assert(newNode);
newNode->val = x;
newNode->next = NULL;
if (q->tail == NULL) {
q->tail = q->head = newNode;
}
else {
q->tail->next = newNode;
q->tail = newNode;
}
return 0;
}
//遍历队列,求出队列大小
int QueueSize(Queue* q) {
QueueNode* cur = q->head;
int size = 0;
while (cur) {
cur = cur->next;
size++;
}
return size;
}
QElemType DeQueue(Queue* q) {
assert(q);
assert(!QueueEmpty(q));
QElemType ret = 0;
//如果队中只有一个元素,将head和tail都指向NULL
if (q->head->next == NULL) {
ret = q->head->val;
free(q->head);
q->head = q->tail = NULL;
}
//否则将head释放后,将其指向下一个元素
else {
ret = q->head->val;
QueueNode* next = q->head->next;
free(q->head);
q->head = next;
}
return ret;
}
int QueueEmpty(Queue* q) {
assert(q);
return q->head == NULL;
}
void QueueDestroy(Queue* q) {
QueueNode* cur = q->head;
while (cur) {
QueueNode* nextNode = cur->next;
free(cur);
cur = nextNode;
}
q->head = q->tail = NULL;
}
QElemType QueueFront(Queue* q) {
assert(q);
assert(!QueueEmpty(q));
return q->head->val;
}
QElemType QueueBack(Queue* q) {
assert(q);
assert(!QueueEmpty(q));
return q->tail->val;
}
Test.c测试:
#include "My_Queue.h"
void TestQueue()
{
Queue q;
QueueInit(&q);
EnQueue(&q, 1);
EnQueue(&q, 2);
EnQueue(&q, 3);
EnQueue(&q, 4);
while (!QueueEmpty(&q))
{
printf("%d ", QueueFront(&q));
DeQueue(&q);
}
QueueDestroy(&q);
}
int main()
{
TestQueue();
return 0;
}