目录
预定义类型
Typedef.h文件,定义了一些类型
//Typedef.h
#pragma once
//
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
//
typedef int Status;
typedef int ElemType;
队列的链式存储结构
LinkQueue.h文件,定义了队列的链式存储结构,以及声明了一些基本操作
//LinkQueue.h
#pragma once
#include"Typedef.h"
#include<stdio.h>
#include<stdlib.h>
//链式队列结点
typedef struct LinkNode {
ElemType data; //数据域
struct LinkNode* next; //指针域
}LinkNode;
//链式队列
typedef struct {
LinkNode* front, * rear;//队列队首队尾指针
}LinkQueue;
#if 0
链式队列有两种类型,一种是 带头结点的
和 不带头结点的
#endif // 0
//队列初始化
Status InitLinkQueue(LinkQueue& LQ);
//判空
Status EmptyLQ(LinkQueue LQ);
//链式一般不会满,除非内存不够
//入队
Status EnLinkQueue(LinkQueue& LQ, ElemType x);
//出队
Status DeLinkQueue(LinkQueue& LQ, ElemType& x);
void testLinkQueue();
LinkQueue.cpp文件,实现了LinkQueue.h中声明的函数,定义了两个宏HEADER和NOHEADER,当宏的值为1时相应模块为活动预处理器模块,该部分代码将会编译否则不编译。HEADER值为1意味着队列是带头结点的队列,NOHEADER值为1意味着队列是不带头结点的队列。是否带头节点将导致函数的实现细节有所区别。
//LinkQueue.cpp
#include"LinkQueue.h"
#define HEADER 0
#define NOHEADER 1
//队列初始化
Status InitLinkQueue(LinkQueue& LQ) {
#if HEADER
//1 带头节点的链式队列初始化
//初始化时 front,rear都指向头节点
LinkNode* q = (LinkNode*)malloc(sizeof(LinkNode));
if (!q)return OVERFLOW;
LQ.front = LQ.rear = q;
LQ.front->next = NULL;
return OK;
#endif // 1
#if NOHEADER
//0 不带头节点的链式队列初始化
//初始化时,front,rear都指向NULL
LQ.front = NULL;
LQ.rear = NULL;
return OK;
#endif // 0
}
//判空
Status EmptyLQ(LinkQueue LQ) {
#if HEADER
//1 带头结点
if (LQ.front == LQ.rear)
return TRUE;
else
return FALSE;
#endif // 1
#if NOHEADER
//0 不带头节点
if (LQ.front == NULL)
return TRUE;
else
return FALSE;
#endif // 0
}
//链式一般不会满,除非内存不够
//入队
Status EnLinkQueue(LinkQueue& LQ, ElemType x) {
//入队都是队尾操作
#if HEADER
//1 带头节点
LinkNode* p = (LinkNode*)malloc(sizeof(LinkNode));
if (!p)return OVERFLOW;
p->data = x;
p->next = NULL;
LQ.rear->next = p;
LQ.rear = p;
return OK;
#endif // 1
#if NOHEADER
//0 不带头节点
LinkNode* p = (LinkNode*)malloc(sizeof(LinkNode));
if (!p)return OVERFLOW;
p->data = x;
p->next = NULL;
if (EmptyLQ(LQ)) {
LQ.front = p;
LQ.rear = p;
}
else {
LQ.rear->next = p;
LQ.rear = p;
}
return OK;
#endif // 0
}
//出队
Status DeLinkQueue(LinkQueue& LQ, ElemType& x) {
//出队都是队首操作
#if HEADER
//1 带头指针
if (EmptyLQ(LQ))
return ERROR;
LinkNode* p = LQ.front->next;
x = p->data; //x返回对头元素
LQ.front->next = p->next; //修改头节点的next指针
if (LQ.rear == p) //当此次时队列中最后一个节点
LQ.rear = LQ.front; //修改队尾指针,置空
free(p);
return OK;
#endif // 1
#if NOHEADER
//0 不带头指针
if (EmptyLQ(LQ))
return ERROR;
LinkNode* p = LQ.front;
x = p->data; //x返回对头元素
LQ.front = LQ.front->next; //修改头节点指针
if (p == LQ.rear) //当此次时队列中最后一个节点
LQ.rear = LQ.front=NULL; //修改队尾指针,置空
free(p);
return OK;
#endif // 0
}
void testLinkQueue() {
LinkQueue LQ;
InitLinkQueue(LQ);
ElemType e = 0;
for (int i = 0; i < 16; i++) {
if(EnLinkQueue(LQ, i))printf("%dok ",i);
}
printf("\n");
while (!EmptyLQ(LQ)) {
DeLinkQueue(LQ, e);
printf("%d ", e);
}
}