数据结构-线性结构-队列-链队的两种实现方法的初步实现

目录

包含头结点的实现:

不包含头结点的实现:

包含头结点的实现:

#include<iostream>
#include<cstdlib>
#include<cstdio>

#define OK 1
#define ERROR -1
#define INIT_SIZE 100

typedef int Status;
typedef int QElemType;

typedef struct qnode {
	QElemType data;
	struct qnode* next;
}QNode;

typedef struct queue {
	QNode* head;
	QNode* end;
	int length;
}Queue;


Status InitQueue(Queue& Q);
Status CreateQueue(Queue& Q);
Status DestroyQueue(Queue& Q);
Status ClearQueue(Queue& Q);
Status QueueEmpty(Queue& Q);
long long QueueLength(Queue& Q);
QElemType GetHead(Queue& Q);
Status EnQueue(Queue& Q, QElemType e);
Status DeQueue(Queue& Q, QElemType& e);
Status QueueTraverse(Queue& Q);

int main() {
	Queue Q;
	QElemType e = 0, i = 0;
	int k = 0;
	do {
		std::cout << "\n=========队列的操作===========";
		std::cout << "\n 1.初始化队列";
		std::cout << "\n 2.创建队列";
		std::cout << "\n 3.将一个数x插到队尾";
		std::cout << "\n 4.删除队头元素";
		std::cout << "\n 5.判定队列是否为空,若不空输出队头元素";
		std::cout << "\n 6.队列的长度";
		std::cout << "\n 7.输出队列中所有元素";
		std::cout << "\n 0.结束程序运行";
		std::cout << "\n================================";
		std::cout << "\n 请输入您的选择(1,2,3,4,5,6,7,0)";
		std::cin >> k;
		switch (k)
		{
		case 1:
			if (InitQueue(Q) == OK)
				std::cout << "初始化成功!";
			else
				std::cout << "初始化失败!";
			break;
		case 2:

			if (CreateQueue(Q) == OK)
				std::cout << "创建成功!";
			else
				std::cout << "创建失败!";
			break;
		case 3:
			std::cout << "请输入插入元素的值x:";
			std::cin >> e;
			if (EnQueue(Q, e) == OK)
				std::cout << "插入成功!";
			else
				std::cout << "插入失败!";
			QueueTraverse(Q);
			break;
		case 4:
			DeQueue(Q, i);
			std::cout << "删除的队头元素为:" << i << std::endl;
			QueueTraverse(Q);
			break;
		case 5:
			if (QueueEmpty(Q) == false) {
				std::cout << "队头元素为:" << GetHead(Q) << std::endl;
			}
			else {
				std::cout << "队列为空或者队列不存在" << std::endl;
			}
			break;
		case 6:
			std::cout << "队列的长度为:" << QueueLength(Q) << std::endl;
			break;
		case 7:
			QueueTraverse(Q);
			break;
		case 0:
			break;
		default:
			std::cout << "无效选项,请重新输入!" << std::endl;
		}
	} while (k != 0);
	system("pause");
	return 0;
	return 0;
}

Status InitQueue(Queue& Q) {
	if (Q.length >= 0 && Q.head != 0) {
		std::cerr << "请勿重复初始化。" << std::endl;
		return ERROR;
	}
	Q.length = 0;
	Q.head = (QNode*)malloc(sizeof(QNode));
	if (!Q.head) {
		std::cerr << "申请内存空间失败。" << std::endl;
		exit(ERROR);
	}
	Q.head->next = 0;
	Q.end = Q.head;
	return OK;
}

Status CreateQueue(Queue& Q) {
	if (InitQueue(Q) == ERROR) {
		return ERROR;
	}
	std::cout << "请输入队列的元素个数n:";
	int i;
	std::cin >> i;
	if (i <= 0) {
		std::cerr << "输入的数字不合法。" << std::endl;
		return ERROR;
	}
	Q.length = i;
	std::cout << "请输入创建的队列的各个元素。\n" << "共" << i << "个元素:" << std::endl;
	for (int n = 0; n < i; ++n) {
		QNode *temp = (QNode*)malloc(sizeof(QNode));
		if (!temp) {
			std::cerr << "申请内存空间失败。" << std::endl;
			exit(ERROR);
		}
		QElemType e = 0;
		std::cin >> e;
		temp->data = e;
		temp->next = 0;
		Q.end->next = temp;
		Q.end = Q.end->next;
	}
	return OK;
}

Status DestroyQueue(Queue& Q) {
	if (Q.length < 0 && Q.head || !Q.head) {
		std::cerr << "要销毁的队列不存在。" << std::endl;
		return ERROR;
	}
	QNode* temp = Q.head;
	QNode* temp1 = 0;
	while (temp) {
		temp1 = temp;
		temp = temp->next;
		free(temp1);
	}
	Q.end = 0;
	Q.head = 0;
	Q.length = -1;
	return OK;
}

Status ClearQueue(Queue& Q) {
	if (Q.length < 0 && Q.head || !Q.head) {
		std::cerr << "要清空的队列不存在。" << std::endl;
		return ERROR;
	}
	QNode* temp = Q.head->next;
	QNode* temp1 = 0;
	while (temp) {
		temp1 = temp;
		temp = temp->next;
		free(temp1);
	}
	Q.end = 0;
	Q.head->next = 0;
	Q.length = 0;
	return OK;
}

Status QueueEmpty(Queue& Q) {
	if (Q.length < 0 && Q.head || !Q.head) {
		std::cerr << "要判断的队列不存在。" << std::endl;
		return ERROR;
	}
	return !Q.length ? true : false;
}

long long QueueLength(Queue& Q) {
	if (Q.length < 0 && Q.head || !Q.head) {
		std::cerr << "要查询的队列不存在。" << std::endl;
		return ERROR;
	}
	return Q.length;
}

QElemType GetHead(Queue& Q) {
	if (Q.length < 0 && Q.head || !Q.head) {
		std::cerr << "要查询的队列不存在。" << std::endl;
		return ERROR;
	}
	if (!Q.length) {
		std::cerr << "队列为空。" << std::endl;
		return ERROR;
	}
	return Q.head->next->data;
}

Status EnQueue(Queue& Q, QElemType e) {
	if (Q.length < 0 && Q.head || !Q.head) {
		std::cerr << "要修改的队列不存在。" << std::endl;
		return ERROR;
	}
	QNode* temp = (QNode*)malloc(sizeof(QNode));
	if (!temp) {
		std::cerr << "申请内存空间失败。" << std::endl;
		exit(ERROR);
	}
	temp->data = e;
	temp->next = 0;
	Q.end->next = temp;
	Q.end = Q.end->next;
	++Q.length;
	return OK;
}

QElemType DeQueue(Queue& Q, QElemType& e) {
	if (Q.length < 0 && Q.head || !Q.head) {
		std::cerr << "要修改的队列不存在。" << std::endl;
		return ERROR;
	}
	QNode* temp = Q.head->next;
	Q.head->next = temp->next;
	e = temp->data;
	free(temp);
	--Q.length;
	return OK;
}

Status QueueTraverse(Queue& Q) {
	if (Q.length < 0 && Q.head || !Q.head) {
		std::cerr << "要查询的队列不存在。" << std::endl;
		return ERROR;
	}
	if (!Q.length) {
		std::cerr << "队列为空。" << std::endl;
		return ERROR;
	}
	QNode* temp = Q.head->next;
	std::cout << "以下是存储在队列的内容:" << std::endl;
	while (temp) {
		std::cout << temp->data << " " << std::ends;
		temp = temp->next;
	}
	std::cout << std::endl;
	return OK;
}


不包含头结点的实现:

#include<iostream>
#include<cstdlib>
#include<cstdio>

#define OK 1
#define ERROR -1
#define INIT_SIZE 100

typedef int Status;
typedef int QElemType;

typedef struct qnode{
	QElemType data;
	struct qnode * next;
}QNode;

typedef struct queue{
	QNode* head;
	QNode* end;
	int length;
}Queue;


Status InitQueue(Queue& Q);
Status CreateQueue(Queue& Q);
Status DestroyQueue(Queue& Q);
Status ClearQueue(Queue& Q);
Status QueueEmpty(Queue& Q);
long long QueueLength(Queue& Q);
QElemType GetHead(Queue& Q);
Status EnQueue(Queue& Q,QElemType e);
Status DeQueue(Queue& Q,QElemType& e);
Status QueueTraverse(Queue& Q);

int main() {
	Queue Q;
	CreateQueue(Q);
	QueueTraverse(Q);
	EnQueue(Q, 999);
	QueueTraverse(Q);
	std::cout<<QueueLength(Q) << std::endl;
	DestroyQueue(Q);
	QueueTraverse(Q);
	EnQueue(Q, 999);
	QueueTraverse(Q);
	EnQueue(Q, 777);
	QueueTraverse(Q);
	EnQueue(Q, 333);
	QueueTraverse(Q);
	QElemType e = 0;
	DeQueue(Q,e);
	QueueTraverse(Q);
	std::cout << GetHead(Q)<<std::endl;
	ClearQueue(Q);
	std::cout << QueueEmpty(Q) << std::endl;
	QueueTraverse(Q);
	return 0;
}

Status InitQueue(Queue& Q){
	if(Q.length>=0 && Q.head !=0){
		std::cerr<<"请勿重复初始化。"<<std::endl;
		return ERROR;
	}
	Q.length = 0;
	Q.head = 0;
	Q.end = 0;
	return OK;
}

Status CreateQueue(Queue& Q) {
	if (InitQueue(Q) == ERROR) {
		return ERROR;
	}
	std::cout << "请输入队列的元素个数n:";
	int i;
	std::cin >> i;
	if (i <= 0) {
		std::cerr << "输入的数字不合法。" << std::endl;
		return ERROR;
	}
	Q.length = i;
	std::cout << "请输入创建的队列的各个元素。\n" << "共" << i << "个元素:" << std::endl;
	QNode* temp = (QNode*)malloc(sizeof(QNode));
	if (!temp) {
		std::cerr << "申请内存空间失败。" << std::endl;
		exit(ERROR);
	}
	QElemType e = 0;
	std::cin >> e;
	temp->data = e;
	temp->next = 0;
	Q.end = temp;
	Q.head = temp;
	for (int n = 1; n < i; ++n) {
		temp = (QNode*)malloc(sizeof(QNode));
		if (!temp) {
			std::cerr << "申请内存空间失败。" << std::endl;
			exit(ERROR);
		}
		std::cin >> e;
		temp->data = e;
		temp->next = 0;
		Q.end ->next = temp;
		Q.end = Q.end->next;
	}
	return OK;
}

Status DestroyQueue(Queue& Q){
	if(Q.length < 0 && Q.head){
		std::cerr<<"要销毁的队列不存在。"<<std::endl;
		return ERROR;
	}
	QNode* temp = Q.head;
	QNode* temp1 = 0;
	while(temp){
		temp1 = temp;
		temp = temp->next;
		free(temp1);
	}
	Q.end = 0;
	Q.head = 0;
	Q.length = -1;
	return OK;
}

Status ClearQueue(Queue& Q){
	if(Q.length < 0 && Q.head){
		std::cerr<<"要清空的队列不存在。"<<std::endl;
		return ERROR;
	}
	QNode* temp = Q.head;
	QNode* temp1 = 0;
	while(temp){
		temp1 = temp;
		temp = temp->next;
		free(temp1);
	}
	Q.end = 0;
	Q.head = 0;
	Q.length = 0;
	return OK;
}

Status QueueEmpty(Queue& Q){
	if(Q.length < 0 && Q.head){
		std::cerr<<"要判断的队列不存在。"<<std::endl;
		return ERROR;
	}
	return !Q.length?true:false;
}

long long QueueLength(Queue& Q){
	if(Q.length < 0 && Q.head){
		std::cerr<<"要查询的队列不存在。"<<std::endl;
		return ERROR;
	}
	return Q.length;
}

QElemType GetHead(Queue& Q){
	if(Q.length < 0 && Q.head){
		std::cerr<<"要查询的队列不存在。"<<std::endl;
		return ERROR;
	}
	if(!Q.length){
		std::cerr<<"队列为空。"<<std::endl;
		return ERROR;
	}
	return Q.head->data;
}

Status EnQueue(Queue& Q,QElemType e){
	if(Q.length<0&&Q.head){
		std::cerr<<"要修改的队列不存在。"<<std::endl;
		return ERROR;
	}
	QNode* temp = (QNode*)malloc(sizeof(QNode));
	if (!temp) {
		std::cerr << "申请内存空间失败。" << std::endl;
		exit(ERROR);
	}
	temp->data = e;
	temp->next = 0;
	if (!Q.head && !Q.end) {
		Q.head = temp;
		Q.end = temp;
	}
	else {
		Q.end->next = temp;
		Q.end = Q.end->next;
	}
	++Q.length;
	return OK;
}

QElemType DeQueue(Queue& Q,QElemType& e){
	if (Q.length < 0 && Q.head) {
		std::cerr << "要修改的队列不存在。" << std::endl;
		return ERROR;
	}
	QNode* temp = Q.head;
	Q.head = Q.head->next;
	e = temp->data;
	free(temp);
	--Q.length;
	return OK;
}

Status QueueTraverse(Queue& Q){
	if(Q.length < 0 && Q.head){
		std::cerr<<"要查询的队列不存在。"<<std::endl;
		return ERROR;
	}
	if(!Q.length){
		std::cerr<<"队列为空。"<<std::endl;
		return ERROR;
	}
	QNode* temp = Q.head;
	std::cout << "以下是存储在队列的内容:" << std::endl;
	while(temp){
		std::cout << temp->data << " "<<std::ends;
		temp = temp->next;
	}
	std::cout << std::endl;
	return OK;
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值