[基本要求]
(1)定义链队列节点结构体QNode,队列摘要结构体LinkQueue,分别记录数据元素和队首和队尾信息;
(2)初始化队列操作InitQueue,构造一个空队列;
(3)把QNode.txt文件中的数据通过入队操作EnQueue加入到链队列中;
(4)从链队列中执行DeQueue操作,出队两个元素;
(5)从链队列中执行GetHead操作,取队头元素;
(6)执行取队长操作GetQueueLen,输出队列长度。
记得创建一个记事本名字为QNode内容如下:
A
B
C
D
#include<iostream>
#include<fstream>
#include<stdlib.h>
using namespace std;
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef char QElemType;
typedef int Status;
typedef char SElemType;
//- - - - - 队列的链式存储结构- - - - -
typedef struct QNode {
QElemType data;
struct QNode* next;
} QNode, * QueuePtr;
typedef struct {
QueuePtr front; //队头指针
QueuePtr rear; //队尾指针
} LinkQueue;
//链队的初始化操作
//构造一个空队列Q
Status InitQueue(LinkQueue &Q) {
Q.front = Q.rear = new QNode; //生成新节点作为头结点,对我、头和队尾指针指向此节点
if (!Q.front) {
exit(OVERFLOW);
}
Q.front->next = NULL; //头结点的指针域置空
return OK;
}
//链队的入队
//插入元素e为Q的新的队尾元素
Status EnQueue(LinkQueue &Q, QElemType e) {
QNode *p = (QueuePtr)malloc(sizeof(QNode));
if (!p) {
exit(EOVERFLOW);
}else {
p->data = e;
p->next = NULL;
Q.rear->next = p;
Q.rear = p;
return OK;
}
}
//链队的出队
//删除Q的队头元素,用e返回其值
Status DeQueue(LinkQueue &Q, QElemType &e) {
QNode* p = (QueuePtr)malloc(sizeof(QNode));
//判断队列是否为空 ,则返回ERROR
if (Q.front == Q.rear) {
return ERROR;
}
p = Q.front->next; //p指向队头元素
e = p->data; //e保存队头元素的值
Q.front->next = p->next; //修改头结点的指针域
if (Q.rear == p) {
Q.rear = Q.front; //最后一个元素被删除,队尾指针指向头结点
free(p);
return OK;
}
}
//取链队的队头元素
//返回Q的队头元素,不修改队头指针
SElemType GetHead(LinkQueue Q) {
if (Q.front != Q.rear) {
return Q.front->next->data; //返回队头元素的值,队头指针不变
}
}
//求队列长度
//返回Q中节点个数
int GetLen(LinkQueue &Q) {
QNode* p = (QueuePtr)malloc(sizeof(QNode));
int length;
if (Q.front == Q.rear) {
length = 0;
return length;
}
else {
p = Q.front;
length = 0;
while (p->next != NULL) {
length++;
p = p->next;
}
}
printf("队列的长度是%d\n", length);
}
//调试调用
int main() {
int choose, flag = 0;
LinkQueue Q;
QElemType e, j;
cout << "1.初始化\n";
cout << "2.入队\n";
cout << "3.读队头元素\n";
cout << "4.出队\n";
cout << "5.队列长度是\n";
cout << "0.退出\n\n";
choose = -1;
while (choose != 0) {
cout << "请选择:";
cin >> choose;
switch (choose) {
//链队的初始化
case 1: {
if (InitQueue(Q)) {
flag = 1;
cout << "成功对队列进行初始化\n\n";
}else {
cout << "初始化队列失败\n\n";
}
break;
}
//链队的入队
case 2: {
fstream file;
file.open("QNode.txt");
if (!file) {
cout << "错误!未找到文件!\n\n" << endl;
exit(ERROR);
}
if (flag) {
flag = 1;
cout << "入队的元素依次为:\n";
while (!file.eof()) {
file >> j;
if (file.fail()) {
break;
}else {
EnQueue(Q, j);
cout << j << " ";
}
}
cout << endl << endl;
}else {
cout << "队列未建立,请重新选择\n\n";
file.close();
}
break;
}
//取链队的队头元素
case 3: {
if (flag != -1 && flag != 0) {
cout << "队头元素为:\n" << GetHead(Q) << endl << endl;
}else {
cout << "队列中无元素,请重新选择\n" << endl;
}
break;
}
//链队的出队
case 4: {
cout << "依次弹出的队头元素为:\n";
while (DeQueue(Q, e)) {
flag = -1;
cout << e << " ";
}
cout << endl << endl;
break;
}
//打印链队的长度
case 5: {
GetLen(Q);
printf("\n");
break;
}
}
}
return 0;
}