LinkQueue.h
#pragma once
#define ElemType char
#define ERROR -1
#define OVERFLOW -2
typedef struct QueueNode{
ElemType data;
struct QueueNode* next;
} Node,*PNode;
typedef struct {
PNode front;//队列头节点
PNode rear;//队尾元素
}Queue;
//初始化队列
void InitQueue(Queue& Q);
//销毁队列
void DestroyQueue(Queue& Q);
//清空队列
void ClearQueue(Queue& Q);
//判断队列是否为空
bool QueueEmpty(Queue Q);
//获取队列长度
int QueueLength(Queue Q);
//获取队首元素
ElemType GetHead(Queue Q);
//入队
void EnQueue(Queue& Q, ElemType e);
//出队
void DeQueue(Queue& Q, ElemType& e);
//遍历队列
void QueueTraverse(Queue Q, void(*f)(ElemType e));
LinkQueue.cpp
#include "LinkQueue.h"
#include <stdio.h>
#include <stdlib.h>
//初始化队列
void InitQueue(Queue& Q) {
//添加头节点
Q.front = (Node*)malloc(sizeof(Node));
Q.rear = Q.front;
}
//销毁队列
void DestroyQueue(Queue& Q) {
ClearQueue(Q);
free(Q.front);
Q.front = Q.rear = NULL;
}
//清空队列
void ClearQueue(Queue& Q) {
char e;
while (!QueueEmpty(Q)) {
DeQueue(Q, e);
}
}
//判断队列是否为空
bool QueueEmpty(Queue Q) {
return Q.rear == Q.front ? true:false;
}
//获取队列长度
int QueueLength(Queue Q) {
PNode cur = Q.front;
int len = 0;
while (cur!=Q.rear)
{
len++;
cur = cur->next;
}
return len;
}
//获取队首元素
ElemType GetHead(Queue Q) {
if (QueueEmpty(Q)) {
return NULL;
}
return Q.front->next->data;
}
//入队
void EnQueue(Queue& Q, ElemType e) {
PNode NewNode = (Node*)malloc(sizeof(Node));
if (!NewNode) exit(OVERFLOW);
NewNode->data = e;
NewNode->next = NULL;
Q.rear->next = NewNode;
Q.rear = NewNode;
}
//出队
void DeQueue(Queue& Q, ElemType& e) {
if (QueueEmpty(Q)) exit(ERROR);
PNode cur = Q.front->next;
e = cur->data;
Q.front->next = cur->next;
if (Q.rear == cur) Q.rear = Q.front;//如果当前出队元素是最有一个元素,将队尾指针指向队首节点
free(cur);
}
//遍历队列
void QueueTraverse(Queue Q, void(*f)(ElemType e)) {
PNode cur = Q.front;
while (cur != Q.rear)
{
f(cur->next->data);
cur = cur->next;
}
printf("\nqueue length:%d\n",QueueLength(Q));
}
main.cpp(用于测试)
#include "LinkQueue.h"
#include <stdio.h>
#include <string.h>
#define EN "en"
#define DE "de"
#define GET "get"
#define EXIT "exit"
void PrintQueue(ElemType e) {
printf("%c\n",e);
}
int main() {
char opt[5],e=NULL;
Queue queue;
InitQueue(queue);
while (true)
{
gets_s(opt, 5);
if (strcmp(opt, EN) == 0) {
printf("wait for input:");
EnQueue(queue, getchar());
getchar();
}
else if (strcmp(opt, DE)==0) {
DeQueue(queue,e);
printf("DE:%c\n", e);
}
else if (strcmp(opt,GET)==0)
{
printf("GET:%c\n", GetHead(queue));
}
else if (strcmp(opt, EXIT)==0) {
DestroyQueue(queue);
break;
}
else {
printf("unkonw operation\n");
continue;
}
printf("queue:\n");
QueueTraverse(queue,PrintQueue);
}
}