文章目录
一、顺序队列基本操作
出队、入队。
#include <stdio.h>
#include <stdlib.h>
#define Status bool
#define OK 1
#define ERROR 0
#define OVERFLOW -1
#define STRINGSIZE 30
typedef int QElemType;
int QueueSize = 10;
typedef struct {
QElemType *base; // 初始化的动态分配
int font; // 头指针
int reat; // 尾指针
}SqQueue;
Status InitQueue(SqQueue &q); // 构造空队列
Status EnQueue(SqQueue &q, QElemType e); // 入队
Status DeQueue(SqQueue &q, QElemType &e); // 出队
Status DestroyQueue(SqQueue &q); // 销毁队列
Status InitQueue(SqQueue &q) {
q.base = (QElemType *)malloc(QueueSize * sizeof(QElemType));
if (q.base == NULL) {
exit(OVERFLOW);
}
q.font = 0;
q.reat = 0;
return OK;
}
Status EnQueue(SqQueue &q, QElemType e) {
// 判断队是否满了,满了无法入队
if ((q.reat + 1) % QueueSize == q.font ) {
printf("队列已满!\n");
return ERROR;
}
*(q.base + q.reat) = e;
q.reat ++;
q.reat = q.reat % QueueSize;
return OK;
}
Status DeQueue(SqQueue &q, QElemType &e) {
// 判断队是否空了,空了无法出队
if (q.reat == q.font) {
printf("队伍为空,无法出队!\n");
e = NULL;
return ERROR;
}
e = *(q.base + q.font);
q.font++;
q.font = q.font % QueueSize;
}
Status DestroyQueue(SqQueue &q) {
free(q.base);
return OK;
}
int main() {
int e;
SqQueue q;
InitQueue(q);
return 0;
}
二、链队列基本操作
出队、入队、求队伍的长度、销毁队列(垃圾回收)。
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -1
typedef int QElemType;
typedef bool Status;
typedef struct QNode {
QElemType data;
struct QNode *next;
}QNode, *QueuePtr;
typedef struct {
QueuePtr front; // 队头指针
QueuePtr rear; // 队尾指针
}LinkQueue;
Status InitQueue( LinkQueue &q); // 初始化队列
Status EnQueue(LinkQueue &q, QElemType e); // 入队
Status DeQueue(LinkQueue &q, QElemType &e); // 出队
Status DestroyQueue(LinkQueue &q); // 销毁链队列
int QueueLenth(LinkQueue &q); // 求队长
// 队列初始化
Status InitQueue( LinkQueue &q) {
q.front = q.rear = (QueuePtr)malloc(sizeof(QNode)); // 头结点
if (q.front == NULL || q.rear == NULL) {
printf("内存分配失败!\n");
exit(OVERFLOW);
}
q.front->data = q.rear->data = NULL;
q.front->next = NULL;
return OK;
}
//入队
Status EnQueue(LinkQueue &q, QElemType e) {
// 判斷节点值是非为NULL
// 创建节点
QueuePtr n = (QueuePtr)malloc(sizeof(QNode));
if (n == NULL) {
printf("入队失败!");
exit(OVERFLOW);
}
n->data = NULL;
n->next = NULL;
if (q.rear->data == NULL) {
q.rear->data = e;
q.rear->next = n;
q.rear = n;
return OK;
} else {
return ERROR;
}
}
//出队
Status DeQueue(LinkQueue &q, QElemType &e) {
// 判断节点是否为空
// 临时通用指针
void *p;
p = q.front;
if (q.front == q.rear) {
printf("队列为空不能出队!\n");
e = NULL;
return ERROR;
} else {
e = q.front->data;
q.front = q.front->next;
}
free(p);
return OK;
}
// 销毁队列
Status DestroyQueue(LinkQueue &q) {
// 临时指针
QueuePtr p;
p = (QueuePtr)malloc(sizeof(QNode));
do {
p = q.front;
q.front = q.front->next;
printf("%d ", p->data);
free(p);
}while(q.front != NULL);
}
// 求队列长度
int QueueLenth(LinkQueue &q) {
int size;
while(q.front != q.rear) {
size++;
q.front = q.front->next;
}
return size;
}
int main() {
LinkQueue q;
QElemType e;
InitQueue(q);
DestroyQueue(q);
return 0;
}