数据结构-链队列-基本操作

数据结构-链队列-基本操作

队列定义: 只能在表的一端进行插入操作,在表的另一端进行删除操作的线性表。
逻辑结构: 与线性表相同,任然为一对一关系。
运算规则: 只能在对尾或者对手进行运算,且访问节点是依照先进先出的规则。

基本操作:
Status InitQueue(LinkQueue &Q)//构造一个空的队列
void OutputQueue(LinkQueue &Q)//输出队列中的数据元素
Status EnQueue(LinkQueue &Q,QElemType e)//在队尾插入元素e,e成为新的队尾元素
Status DeQueue(LinkQueue &Q,QElemType e)//若队列不为空,则删除对位元素,用e返回其值
Status LengthQueue(LinkQueue &Q)//返回队列中元素的个数
Status ClearQueue(LinkQueue &Q)// 清空队列
Status DestoryQueue(LinkQueue &Q)//销毁一个队列

QueueTest.cpp

/*项目名: Queue
*文件名: QueueTest.cpp
*创建者: YJY
*创建时间:2021-04-08
*描述: 链队列
*/

#include<stdio.h>
#include<stdlib.h>

#define OK 1
#define OVERFLOW 0
#define ERROR 0

typedef int QElemType ;
typedef int Status ;

typedef struct QNode{
	QElemType	data;
	struct QNode *next;
}QNode, *QueuePtr;

typedef struct{
	QueuePtr front;
	QueuePtr rear;
}LinkQueue;


//---------单链队列的基本操作--------------
//构造一个空队列
Status InitQueue(LinkQueue &Q){

	Q.front = Q.rear = (QueuePtr)malloc(sizeof(QNode));
	if(!Q.front){
		exit(OVERFLOW);
	}
	Q.front->next = NULL;
	return OK;
}

void OutputQueue(LinkQueue &Q){
	QueuePtr p;
	p = Q.front->next;
	do{
		printf("%d  ",p->data);
		p=p->next;
	}while(p);
	printf("\n");
}

//插入元素
Status EnQueue(LinkQueue &Q,QElemType e){
	//	插入元素e,成为新的队尾元素
	QueuePtr p;
	p = (QueuePtr)malloc(sizeof(QNode));//创建一个新结点
	if(!p){//如果内存分配不成功
		exit(OVERFLOW);
	}
	p->data = e;
	p->next = NULL;
	Q.rear->next = p;
	Q.rear = p;

	return OK;
}

Status DeQueue(LinkQueue &Q,QElemType e){
	QueuePtr p;
	//若队列不为空,则删除对位元素,用e返回其值,并返回OK,否则返回error
	if(Q.front == Q.rear){
		printf("队列已为空,无法删除!");
		return ERROR;
	}else{
		p = Q.front->next;
		e = p->data;
		Q.front->next = p->next;
		if(Q.front == p){
			Q.rear = Q.front;
		}
		free(p);
	}
	return e;
}

//返回队列中元素的个数
Status LengthQueue(LinkQueue &Q){

	QueuePtr p;
	int i = 0;
	p = Q.front->next;
	while(p){
		++i;
		p = p->next;
	}
	return i;
}

//清空队列
Status ClearQueue(LinkQueue &Q){
	QueuePtr p;
	
	while( Q.front->next->next ){

		Q.front->next = Q.front->next->next;
		free(Q.front);
	}
	free(Q.front->next);
	Q.front->next = NULL;
	Q.rear = Q.front;
	
	return OK;
}


//销毁一个队列Q,Q不在存在
Status DestoryQueue(LinkQueue &Q){
	while(Q.front){
		Q.rear = Q.front->next;
		free(Q.front);
		Q.front = Q.rear;
		if(!Q.rear){
			free(Q.rear);
		}
	}
	free(Q.rear);

	return OK;
}

Status main(){

	LinkQueue Q;
	QElemType e;
	int length,xuan,n,i;
	InitQueue(Q);
	printf("请输入将要建立队列的元素个数: ");
	scanf("%d",&n);
	for(i=1;i<=n;i++){
		printf("请输入第%d个元素:",i);
		scanf("%d",&e);
		EnQueue(Q,e);
	}
	printf("输出队列:");
	OutputQueue(Q);

	printf("\n\n");
	while(1){
		printf("			链队列操作			  	  \n");
		printf("	***************************************\n");
		printf("		1-----------入队				\n");
		printf("		2-----------出队				\n");
		printf("		3-----------队列长度			\n");
		printf("		4-----------清空队列			\n");
		printf("		5-----------销毁队列			\n");
		printf("		0-----------退出队列			\n");
		printf("	**************************************\n");
		printf("	请输入你的选择(0--5):");
		scanf("%d",&xuan);
		if(xuan == 1){
			printf("\n请在队尾插入一个元素:");
			scanf("%d",&e);
			EnQueue(Q,e);
			printf("输出队列:");
			OutputQueue(Q);
			printf("\n\n");
		}
		if(xuan == 2){
			printf("\n删除队列中的元素:\n");
			printf("删除成功!%d\n",DeQueue(Q,e));
			printf("输出队列:");
			OutputQueue(Q);
			printf("\n\n");
		}
		if(xuan == 3){
			length = LengthQueue(Q);
			printf("\n输出队列长度为:%d",length);
			printf("\n\n");
		}
		if(xuan == 4){
			printf("清空队列!");
			ClearQueue(Q);
			printf("队列已清空");
			printf("\n\n");
		}
		if(xuan == 5){
			printf("销毁这个队列:");
			DestoryQueue(Q);
			printf("队列已经销毁!");
			printf("\n\n");
		}
		if(xuan == 0){
			break;
		}
	}

	printf("\n\n\n");
	return OK;
}

运行截图

在这里插入图片描述
1.入队操作
在这里插入图片描述
2.出队操作
在这里插入图片描述
3.队列长度
在这里插入图片描述
4.清空队列
在这里插入图片描述
5.销毁队列
**在这里插入图片描述**
退出
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YJY@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值