这段代码是一个基于链表实现的队列的示例,包含了队列的初始化、销毁、清空、判空、求长度等操作。以下是完整代码的注释部分:
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -1
typedef int QElemType;
typedef struct QNode {
QElemType data;
struct QNode *next;
} *QueuePtr;
struct LinkQueue {
QueuePtr front, rear; // 队头、队尾指针
};
void print(QElemType i) {
printf("%d ", i);
}
void InitQueue(LinkQueue &Q); // 构造一个空队列Q
void DestroyQueue(LinkQueue &Q); // 销毁队列Q,Q不再存在
void ClearQueue(LinkQueue &Q); // 将Q清为空队列
int QueueEmpty(LinkQueue Q); // 若队列Q为空队列,则返回TRUE;否则返回FALSE
int QueueLength(LinkQueue Q); // 返回Q的元素个数,即队列的长度
int GetHead(LinkQueue Q, QElemType &e); // 若队列不空,则用e返回Q的队头元素,并返回OK;否则返回ERROR
int EnQueue(LinkQueue &Q, QElemType e); // 插入元素e为Q的新的队尾元素
int DeQueue(LinkQueue &Q, QElemType &e); // 若队列不空,则删除Q的队头元素,用e返回其值,并返回OK;否则返回ERROR
void QueueTraverse(LinkQueue Q, void(*vi)(QElemType)); // 从队头到队尾依次对队列Q中每个元素调用函数vi()
int main() {
int j;
int i = 0, l;
QElemType d;
LinkQueue Q;
InitQueue(Q);
for (i = 0; i < 5; i++) {
scanf("%d", &d);
EnQueue(Q, d);
};
printf("队列长度为: %d\n", QueueLength(Q));
printf("现在队列中元素:\n");
QueueTraverse(Q, print);
DeQueue(Q, d);
printf("删除的元素是%d\n", d);
DeQueue(Q, d);
printf("删除的元素是%d\n", d);
scanf("%d", &d);
EnQueue(Q,d);
printf("队列长度为: %d\n", QueueLength(Q));
printf("现在队列中元素:\n");
QueueTraverse(Q, print);
j = GetHead(Q, d);
if (j) {
printf("现在队头元素为:%d\n", d);
}
ClearQueue(Q);
DestroyQueue(Q);
}
void InitQueue(LinkQueue &Q) {
// 构造一个空队列Q
Q.front = Q.rear = new QNode;
if (!Q.front) exit(OVERFLOW); // 存储分配失败
Q.front->next = NULL;
}
void DestroyQueue(LinkQueue &Q) {
// 销毁队列Q(无论空否均可)
while (Q.front) {
Q.rear = Q.front->next;
delete Q.front;
Q.front = Q.rear;
}
}
void ClearQueue(LinkQueue &Q) {
// 将Q清为空队列
QueuePtr p, q;
Q.rear = Q.front; // 队尾指针也指向头结点,使链表中无任何元素
p = Q.front->next; // 指向首元结点
while (p) { // 遍历删除所有结点
q = p->next;
delete p;
p = q;
}
Q.front->next = NULL; // 头结点的指针域置空
}
int QueueEmpty(LinkQueue Q) {
// 若Q为空队列,则返回TRUE,否则返回FALSE
if (Q.front == Q.rear) return TRUE;
else return FALSE;
}
int QueueLength(LinkQueue Q) {
// 求队列的长度
int len = 0;
QueuePtr p = Q.front->next; // 指向首元结点
while (p) {
len++;
p = p->next;
}
return len;
}
int GetHead(LinkQueue Q, QElemType &e) {
// 若队列不空,则用e返回Q的队头元素,并返回OK;否则返回ERROR
if (Q.front == Q.rear)
return ERROR; // 队列为空,无法获取队头元素
e = Q.front->next->data; // 获取队头元素的值
return OK;
}
int EnQueue(LinkQueue &Q, QElemType e) {
// 插入元素e为Q的新的队尾元素
QueuePtr p = new QNode;
if (!p) exit(OVERFLOW); // 存储分配失败
p->data = e;
p->next = NULL;
Q.rear->next = p; // 新结点插入队尾
Q.rear = p; // 队尾指针指向新结点
return OK;
}
int DeQueue(LinkQueue &Q, QElemType &e) {
// 若队列不空,则删除Q的队头元素,用e返回其值,并返回OK;否则返回ERROR
if (Q.front == Q.rear)
return ERROR; // 队列为空,无法删除元素
QueuePtr p = Q.front->next; // 指向首元结点
e = p->data; // 获取队头元素的值
Q.front->next = p->next; // 头结点的后继指针指向第二个结点
if (Q.rear == p) // 如果删除后队列为空,修改队尾指针
Q.rear = Q.front;
delete p; // 释放原队头结点的空间
return OK;
}
void QueueTraverse(LinkQueue Q, void(*vi)(QElemType)) {
// 从队头到队尾依次对队列Q中每个元素调用函数vi()
QueuePtr p = Q.front->next; // 指向首元结点
while (p) {
vi(p->data);
p = p->next;
}
}
以上代码实现了一个链式队列,包含了初始化队列、销毁队列、清空队列、判断队列是否为空、获取队头元素、插入元素到队尾以及删除队头元素等操作。
内容由零声教学AI助手提供,问题来源于学员提问