数据结构——链队列算法和操作

本文详细介绍了链队列的C++实现过程,包括初始化、销毁、入队、出队及获取队头元素等核心操作。通过具体代码展示了如何使用链表来构建动态的队列结构,并提供了完整的测试结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1完整代码

#include<iostream>
#include<malloc.h>
using namespace std;

#define TRUE    1
#define FALSE   0
#define OK      1
#define ERROR   0
#define OVERFLOW -2 

typedef int QElemType;
typedef int Status;

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

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

/**************************基本函数***************************/
//1.链队列初始化
Status InitQueue(LinkQueue &Q)
{
	Q.front = Q.rear = (QueuePtr)malloc(sizeof(QNode));		//先赋值给Q.reat,再赋值给Q.front 
	if ( !Q.front )
		exit(OVERFLOW);
	Q.front -> next = NULL;
	return OK;
} 

//2.销毁链队列
//算法思想:从头结点开始,用队尾指针作为中间变量依次释放所有结点 
Status DestroyQueue(LinkQueue &Q)
{
	while ( Q.front )
	{
		Q.rear = Q.front->next;
		free(Q.front);
		Q.front = Q.rear;
	}
	return OK;
}

//3.链队列的入队
Status EnQueue(LinkQueue &Q, QElemType e)
{
	QueuePtr p = (QueuePtr)malloc(sizeof(Qnode));
	if ( !p )
		exit(OVERFLOW);
	p->data = e;					//将值e赋给新结点 
	p->next = NULL;					//新结点指针域置空
	Q.rear->next = p; 				//原队尾结点的指针指向新结点
	Q.rear = p;						//尾指针指向新结点 
	return OK;
} 

//4.链队列的出队
Status DeQueue(LinkQueue &Q, QElemType &e)
{
	QueuePtr p;
	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;
} 

//5.求链队列的队头元素
Status GetHead(LinkQueue Q,QElemType &e) 
{
	if(Q.front == Q.rear)
		return ERROR;//队列为空
	e = Q.front->next->data;
	return OK;
}

//**************************功能实现函数***************************//
//入队功能函数 调用EnQueue函数 
void Enter_To_Queue(LinkQueue &Q)
{
	int n;
	QElemType e;
	int flag;
	printf("请输入入队元素个数(>=1):\n");
	scanf("%d",&n);
	for(int i=0;i<n;i++)
	{
		 printf("请输入第%d个元素的值:",i+1);
		 scanf("%d",&e);
		 flag = EnQueue(Q,e);
		 if(flag)
		 	printf("%d已入队\n",e);
	}
}

//出队功能函数 调用DeQueue函数
void Delete_From_Queue(LinkQueue &Q)
{
	int n;
	QElemType e;
	int flag;
	printf("请输入出队元素个数(>=1):\n");
	scanf("%d",&n);
	for(int i=0;i<n;i++)
	{
		 flag=DeQueue(Q,e);
		 if(flag)
		 	printf("%d已出队\n",e);
		 else 
		 {
			 printf("队已空!!!\n");
			 break;
		 }
	}
}

//取队顶功能函数 调用GetHead函数
void Get_Head_Of_Queue(LinkQueue &Q)
{
	QElemType e;
	bool flag; 
	flag = GetHead(Q,e);
	if(flag)
		printf("队头元素为:%d\n",e);
	else 
		printf("队已空!!!\n");
}

//**************************主函数***************************//
int main()
{
	LinkQueue Q;
	InitQueue(Q);
	Enter_To_Queue(Q);
	Get_Head_Of_Queue(Q);
	Delete_From_Queue(Q);
	
	return 0;
} 

2.测试结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值