以带头结点的循环链表为队列,并且只设一个指针指向队尾元素

假设以带头结点的循环链表(看清楚了是链表,不是循环队列,小编一开始就看错了,浪费了挺多时间)表示队列,并且只设一个指针指向队尾元素结点(注意:不设头指针),试编写相应的置空队列、判断队列是否为空、入队和出队等算法。

#include
using namespace std;
//定义队列的链式存储结构
typedef struct QNode{
	int data;
	struct QNode *next;
}QNode, *QueuePtr;
//只设一个指向队尾元素的指针
typedef struct {
	QueuePtr rear;
	//记录链表长度
	int s;
}LinkQueue;
//交互页面
void ShowMenu() {
	cout << "**************循环链表表示队列***************" << endl;
	cout << "******************0.入队*********************" << endl;
	cout << "******************1.出队*********************" << endl;
	cout << "******************2.置空队列*****************" << endl;
	cout << "******************3.打印队列*****************" << endl;
	cout << "*************本试验仅可进行一次**************" << endl;
	
}
//置空队列
void InitQueue(LinkQueue &Q) {
	Q.s = 0;
	Q.rear = Q.rear->next;
	while (Q.rear != Q.rear->next) {
		QueuePtr s= Q.rear->next;
		Q.rear->next = s->next;
		delete s;
	}
	system("pause");
	system("cls");
}
//判断队是否为空,空返回1,否则返回0
bool EmptyQueue(LinkQueue Q) {
	return Q.rear->next->next == Q.rear->next;
}
//入队
void EnQueue(LinkQueue &Q) {
	int m;
	cout << "请输入您需要插入元素的个数" << endl;
	cin >> m;
	Q.s += m;
	cout << "请依次输入您需要添加的元素" << endl;
	for (int i = 0;i < m;i++) {
		//局部变量初始化
		QueuePtr p=new QNode;
		cout << "请输入第"<<(i+1)<<"个元素" << endl;
		cin >> p->data;
		p->next = Q.rear->next;
		Q.rear->next = p;
		Q.rear = p;
	}
	system("pause");
	system("cls");
}
//出队
void DelQueue(LinkQueue &Q) {
	int n;
	cout << "请输入您需要删除元素的个数" << endl;
	cin >> n;
	for (int i = 0;i < n;i++) {
		if (Q.rear->next->next == Q.rear->next) {
			cout << "队列已空,无法继续删除元素" << endl;
			break;
		}
		QueuePtr p = Q.rear->next->next;
		//队列中只有一个结点
		if (p == Q.rear) {
			Q.rear = Q.rear->next;
			Q.rear->next = p->next;
			Q.s--;
		}
		else {
			Q.rear->next->next = p->next;
			Q.s--;
		}
	}
	system("pause");
	system("cls");
}
//打印队列的所有元素,打印后就退出系统
void PrintQueue(LinkQueue &Q) {
	//判断队列是否为空
	if (EmptyQueue(Q))
		cout << "队列为空,无法打印" << endl;
	else {
		QueuePtr q = Q.rear->next->next;
		for(int i=0;i<Q.s;i++) {
			cout << q->data;
			cout << "\t";
			q = q->next;
		}
	}
	system("pause");
	exit(0);
}
int main() {
	LinkQueue Q;
	Q.rear = new QNode();
	Q.s = 0;
	Q.rear->next = Q.rear;
	int i;
	while (1) {
		ShowMenu();
		cout << "请输入您的操作" << endl;
		cin >> i;
		switch (i)
		{
		case 0: {
			EnQueue(Q);
			break;
		}
		case 1:
		{
			DelQueue(Q);
			break;
		}
		case 2: {
			InitQueue(Q);
			break;
		}
		case 3:{
			PrintQueue(Q);
			break;
		}
		default:
			break;
		}
	}
}

以带头结点的循环链表为队列,并且只设一个指针指向队尾元素_第1张图片
以带头结点的循环链表为队列,并且只设一个指针指向队尾元素_第2张图片
以带头结点的循环链表为队列,并且只设一个指针指向队尾元素_第3张图片
以带头结点的循环链表为队列,并且只设一个指针指向队尾元素_第4张图片
以带头结点的循环链表为队列,并且只设一个指针指向队尾元素_第5张图片

以带头结点的循环链表为队列,并且只设一个指针指向队尾元素_第6张图片
以带头结点的循环链表为队列,并且只设一个指针指向队尾元素_第7张图片

这里做个解释,为什么这次和上次的系统都只能做一次就必须退出系统呢,因为两个系统都没有做交互式的文件存储删除,每次的数据无法做保留,在页面多做几次试验也是无意义的!

你可能感兴趣的:(数据结构,队列,链表,数据结构,指针)