以下是补充完整的链队列代码:
#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;
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);
}
// 链队列的基本操作(9个)
void InitQueue(LinkQueue &Q){
// 构造一个空队列Q
Q.front = Q.rear = (QueuePtr)malloc(sizeof(struct QNode));
if(!Q.front){
exit(OVERFLOW); // 存储分配失败
}
Q.front->next = NULL;
}
void DestroyQueue(LinkQueue &Q){
// 销毁队列Q(无论空否均可)
while (Q.front){
Q.rear = Q.front->next;
free(Q.front);
Q.front = Q.rear;
}
}
void ClearQueue(LinkQueue &Q){
// 将Q清为空队列
Q.rear = Q.front;
}
int QueueEmpty(LinkQueue Q){
// 若Q为空队列,则返回TRUE,否则返回FALSE
if (Q.front == Q.rear){
return TRUE;
}
else{
return FALSE;
}
}
int QueueLength(LinkQueue Q){
// 求队列的长度
int length = 0;
QueuePtr p = Q.front->next;
while (p){
length++;
p = p->next;
}
return length;
}
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 = (QueuePtr)malloc(sizeof(struct QNode));
if(!p){
exit(OVERFLOW); // 存储分配失败
}
p->data = e;
p->next = NULL;
Q.rear->next = p; // 把拥有元素e新节点链接到原来链表的最后一个节点之后
Q.rear = p; // 把当前的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; // 将欲删除的队头节点暂存给p
e = p->data; // 保存队头元素的值
Q.front->next = p->next; // 修改头指针,使其指向原队头节点的下一个节点
if (Q.rear == p){ // 若队头就是队尾,则删除后将rear指向头节点
Q.rear = Q.front;
}
free(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助手提供,问题来源于学员提问