队列的基本操作(采用链式存储结构)

[基本要求]

(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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值