链式队列的基本操作实现

本文详细介绍了两种链队列的数据结构:带头结点的链队列和不带头结点的链队列,包括它们的初始化、判空、入队、出队以及销毁操作。通过实例展示了如何在C语言中创建、操作和管理链队列,适用于算法和数据结构的学习者。
摘要由CSDN通过智能技术生成

1.带头结点的链队列:

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

//链队列的数据类型定义
#define ElemType int
typedef struct LinkNode{
	ElemType data;
	struct LinkNode* next;
}LinkNode;
typedef struct{
	LinkNode *front,*rear;
	int size; //这个结构体成员用来保存当前的链队列元素个数 
}LinkQueue;

//链队列初始化:
void InitQueue(LinkQueue &Q)
{
	Q.front=(LinkNode*)malloc(sizeof(LinkNode));
	Q.rear=Q.front;
	Q.front->next=NULL;
	Q.size=0;
    return;
}

//链队列判空操作:
bool IsEmpty(LinkQueue Q)
{
	if(Q.front==Q.rear)return true;
	else return false;
}

//链队列的入队操作:
void EnQueue(LinkQueue &Q,ElemType x)
{
	LinkNode *s=(LinkNode*)malloc(sizeof(LinkNode));
	s->data=x;
	s->next=NULL;
	Q.rear->next=s;
	Q.rear=s;
	Q.size++;
	return;
}

//链队列元素出队:
bool DeQueue(LinkQueue &Q,ElemType &x)
{
	if(Q.front==Q.rear)return false;
	LinkNode *p=Q.front->next;
	x=p->data;
	Q.front->next=p->next;
	if(Q.rear==p)Q.rear=Q.front;
	free(p);
	Q.size--;
	return true;
}

//彻底销毁链队列 
void DestroyQueue(LinkQueue &Q)
{
	LinkNode *p=Q.front;
	while(Q.front)
	{
		p=Q.front;
		Q.front=Q.front->next;
		free(p);
	}
	return;
}

int main()
{
	int x;
   //先声明一个链队列	
   LinkQueue Q;
   //初始化队列:
   InitQueue(Q);
   
   //先判一次空:
   if(IsEmpty(Q))printf("\n此队列为空\n");
   else printf("\n此队列不空\n");
   
   //输入新元素并将其入队
   printf("\n开始输入新元素\n");
   while(1)
   {
   	   scanf("%d",&x);
   	   if(x==9999)
   	   {
   	   	printf("\n输入结束\n");
   	   	break;
	   }
	   EnQueue(Q,x);
	   printf("\n当前队列中共有: %d个元素\n",Q.size);
   }
   
   //让这些元素出队 
   printf("\n所有元素依次出队:\n");
   while(DeQueue(Q,x))printf("%d ",x);
   printf("\n");
   
   //彻底销毁链队列 
   DestroyQueue(Q);
   return true;
} 

2.不带头结点的链队列:

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

//链队列的数据类型定义
#define ElemType int
typedef struct LinkNode{
	ElemType data;
	struct LinkNode* next;
}LinkNode;
typedef struct{
	LinkNode *rear,*front;
	int size;
}LinkQueue;

//链队列初始化:
void InitQueue(LinkQueue &Q)
{
	Q.front=NULL;
	Q.rear=NULL;
	Q.size=0;
	return;
}

//链队列判空操作:
bool IsEmpty(LinkQueue Q)
{
	if(Q.front==NULL)return true;
	else return false;
}

//链队列的入队操作:
void EnQueue(LinkQueue &Q,ElemType x)
{
	LinkNode *s=(LinkNode*)malloc(sizeof(LinkNode));
	s->data=x;
	s->next=NULL;
	if(Q.front==NULL)
	{
		Q.front=s;
		Q.front->next=NULL;
		Q.rear=Q.front; 
	}
	else{
		Q.rear->next=s;
	    Q.rear=s;
	}
	Q.size++;
	return;
}

//链队列元素出队:
bool DeQueue(LinkQueue &Q,ElemType &x)
{
	if(Q.front==NULL)return false;
	LinkNode *p=Q.front;
	x=p->data;
	Q.front=p->next;
	if(Q.rear==p){
		Q.rear=NULL;
		Q.front=NULL;
	}
	free(p);
	Q.size--;
	return true;
}

//彻底销毁链队列 
void DestroyQueue(LinkQueue &Q)
{
	LinkNode *p=Q.front;
	while(Q.front)
	{
		p=Q.front;
		Q.front=Q.front->next;
		free(p);
	}
	return;
}

int main()
{
	int x;
   //先声明一个链队列	
   LinkQueue Q;
   //初始化队列:
   InitQueue(Q);
   
   //先判一次空:
   if(IsEmpty(Q))printf("\n此队列为空\n");
   else printf("\n此队列不空\n");
   
   //输入新元素并将其入队
   printf("\n开始输入新元素\n");
   while(1)
   {
   	   scanf("%d",&x);
   	   if(x==9999)
   	   {
   	   	printf("\n输入结束\n");
   	   	break;
	   }
	   EnQueue(Q,x);
	   printf("\n当前队列中共有: %d个元素\n",Q.size);
   }
   
   //让这些元素出队 
   printf("\n所有元素依次出队:\n");
   while(DeQueue(Q,x))printf("%d ",x);
   printf("\n");
   
   //彻底销毁链队列 
   DestroyQueue(Q);
   return true;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值