C语言实现队列的链式存储

下面将实现队列的链式存储结构(C语言)
(1)队列的顺序存储
队列的顺序存储结构又称为顺序队列,它也是利用一组地址连续的存储单元存放队列中的元素。由于队中元素的插入和删除限定在表的两端进行,因此设置队头指针和队尾指针,分别指示出当前的队首元素和队尾元素。
在顺序队列中,为了降低运算的复杂度,元素入队时,只修改队尾指针;元素出对时,只修改队头指针。由于顺序队列的存储空间是提前设定的,因此队尾指针会有一个上限值,当队尾指针达到其上限时,就不能只通过修改队尾指针来实现新元素的入队操作了。此时,可将顺序队列假象成一个环状结构,称之为循环列表。
(2)队列的链式存储
队列的链式存储也称为链队列。为了便于操作,可给链队列添加一个头结点,并令头指针指向头结点。队列为空的判断条件是头指针和尾指针的值相同,且均指向头结点。(另一种方式为不带头结点的)
在这里插入图片描述
在这里插入图片描述

#include <stdio.h> 
#include <stdlib.h> 
typedef int ElemType;//将 ElemType定义为Int型 
//队列的链式存储可以看作为一个链表带有头尾指针 
typedef struct LinkNode{
	ElemType data;
	struct LinkNode *next;
}LinkNode;
typedef struct{
	LinkNode *front,*rear;
	int lenth; //队列长度 
}LinkQueue;

void InitQueue(LinkQueue &Q){
	Q.front=Q.rear=(LinkNode*)malloc(sizeof(LinkNode));//建立头结点,初始化让头尾指针都指向头结点 (带头结点的) 
	Q.front->next=NULL; 
	Q.lenth=0;
	/*Q.front=NULL;//不带头节点 
	Q.rear=NULL; 
	Q.lenth=0;*/
}
//判空 
bool IsEmpty(LinkQueue Q){
	if(Q.front==Q.rear)
	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;
	Q.rear->next=s;//新节点插入到尾指针后 
	Q.rear=s;//尾指针后移
	Q.lenth++;
	
	/*LinkNode *s=(LinkNode *)malloc(sizeof(LinkNode));//创建新节点 
	s->data=x;//给新节点赋值
	if(Q.front==NULL){//不带头结点第一次入队要判断是否为空,要是空则头尾指针都指向S 
		Q.front=s;
		Q.rear=s;
	} 
	else{//不为空则直接在尾指针后面操作 
		Q.rear->next=s;
		Q.rear=s;
	}
	Q.lenth++;*/
} 
//出队
bool DeQueue(LinkQueue &Q,ElemType &x){
	if(Q.front==Q.rear)
		return false;//对空报错 
	LinkNode *p=Q.front->next;
	x=p->data;//用x变量带回数据 
	Q.front->next=p->next;//修改头结点的next指针 
	if(Q.rear==p)//如果是最后一个元素出栈,则将头尾指针都指向头结点 
		Q.rear=Q.front;
	free(p);//释放结点空间 
	Q.lenth--;
	return true;
	
	/*//不带头结点 
	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.lenth--;
	return true;*/
	
} 
int Lenth(LinkQueue Q,ElemType &x){
	x=Q.lenth;
	return x;
} 
 

int main(){
	LinkQueue Q;
	InitQueue(Q);
	
	ElemType i;//循环入队 
	for(i=1;i<=100;i++){
		EnQueue(Q,i);
	} 
	
	ElemType x;
	Lenth( Q,x);
	printf("此时队列长为%d\n",x);
	
	//循环出队 
	ElemType h;
	for(h=1;h<=8;h++){
		DeQueue(Q,h);
		printf("%d已出队\n",h); 
	}
	
	ElemType p;
	Lenth( Q,p);
	printf("此时队列长为%d\n",p);
	
	//判断此时队列是否为空 
	if(IsEmpty(Q))
		printf("此时队列为空\n");
	else
		printf("此时队列不为空\n");
	return 0;
}
此时队列长为100
1已出队
2已出队
3已出队
4已出队
5已出队
6已出队
7已出队
8已出队
此时队列长为92
此时队列不为空
  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值