队列的链式存储结构

【算法说明】
此算法代码来源于严蔚敏编著的《数据结构(C语言版|第2版)》的随书代码。
这个代码做了一点点微调,方便学习队列的链式存储结构。


【算法代码】

/***链队的基本操作***/
#include <bits/stdc++.h>
using namespace std;

//队列的链式存储结构
typedef struct QNode {
	char data;
	struct QNode *next;
} QNode, *QueuePtr;

typedef struct {
	QueuePtr front; //队头指针
	QueuePtr rear; //队尾指针
} LinkQueue;

//链队的初始化
int InitQueue(LinkQueue &Q) { //构造一个空队列Q
	Q.front = Q.rear = new QNode; 
	Q.front->next = NULL; //头结点的指针域置空
	return 1;
}

//链队的入队
int EnQueue(LinkQueue &Q, char e) { //插入元素e为Q的新的队尾元素
	QueuePtr p;
	p = new QNode; //为入队元素分配结点空间,用指针p指向
	p->data = e; //将新结点数据域置为e
	p->next = NULL;
	Q.rear->next = p; //将新结点插入到队尾
	Q.rear = p; //修改队尾指针
	return 1;
}

//链队的出队
int DeQueue(LinkQueue &Q, char &e) { //删除Q的队头元素,用e返回其值
	QueuePtr p;
	if (Q.front == Q.rear)
		return 0; //若队列空,则返回0
	p = Q.front->next; //p指向队头元素
	e = p->data; //e保存队头元素的值
	Q.front->next = p->next; //修改头指针
	if (Q.rear == p)
		Q.rear = Q.front; //最后一个元素被删,队尾指针指向头结点
	delete p; //释放原队头元素的空间
	return 1;
}

//取链队的队头元素
char GetHead(LinkQueue Q) { //返回Q的队头元素,不修改队头指针
	if (Q.front != Q.rear) //队列非空
		return Q.front->next->data; //返回队头元素的值,队头指针不变
}

int main() {
	int choose, flag = 0;
	LinkQueue Q;
	char e, j;
	cout << "1.初始化\n";
	cout << "2.入队\n";
	cout << "3.读队头元素\n";
	cout << "4.出队\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(0);
				}
				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;
		}
	}
	return 0;
}


/*
在源代码所在文件夹下新建文件QNode.txt,内容如下: 
A
B
C
D
*/



 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
队列链式存储结构实际上就是线性表的单链表,只不过是能尾进头出,简称为链队列。为了操作上的方便,将队头指针指向链队列的头结点,而队尾指针指向终端结点。空队列时,front和rear都指向头结点。链队列的结构可以用以下代码表示: ``` typedef int QElemType; /* QElemType类型根据实际情况而定,这里假设为int */ typedef struct QNode /* 结点结构 */ { QElemType data; struct QNode *next; }QNode,*QueuePtr; typedef struct /* 队列的链表结构 */ { QueuePtr front,rear; /* 队头、队尾指针 */ }LinkQueue; ``` 其中,QNode队列的结点结构体,QueuePtr为指向QNode的指针类型,LinkQueue为队列的链表结构体,包含队头指针front和队尾指针rear。 队列链式存储结构的入队操作可以用以下代码表示: ``` /* 链式队列的入队操作 */ Status EnQueue(LinkQueue *Q,QElemType e) { QueuePtr s = (QueuePtr)malloc(sizeof(QNode)); if(!s) /* 存储分配失败 */ exit(OVERFLOW); s->data = e; s->next = NULL; Q->rear->next = s; /* 把拥有元素e新结点s赋值给原队尾结点的后继 */ Q->rear = s; /* 把当前的s设置为队尾结点,rear指向s */ return OK; } ``` 其中,EnQueue为入队操作函数,Q为链队列指针,e为要入队的元素。该函数首先创建一个新结点s,将要入队的元素e赋值给s的data域,将s的next指针置为NULL。然后将s赋值给原队尾结点的后继,将rear指向s,完成入队操作。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值