数据结构【队列-使用链式存储实现队列】

链式队列

(1)链式队列是一个同时带有队头指针和队尾指针的单链表。头指针指向队头结点,尾指针指向队尾结点。

(2)优点:

        1.链式队列特别适合处理数据元素变动较大的情况

        2.不存在队列满导致溢出的情况。

(3)类型:带头结点和不带头结点


代码分块

1.创建链式队列

typedef struct LinkNode{
	int data;
	struct LinkNode *next;
}LinkNode;

typedef struct{
	LinkNode *front,*rear;
}LinkQueue;

InitQueue(LinkQueue *L){
	L->front = NULL;
	L->rear = NULL;
}

2.入队列操作

//[front,1,2,3,4,5,6,7,rear]
bool EnQueue(LinkQueue *L,int enNum){
	LinkNode *newNode; 
	newNode = (LinkNode *)malloc(sizeof(LinkNode)); //定义一个新结点
	if(newNode==NULL){//内存已满,新结点分配失败 
		return false;
	}
	newNode->data = enNum;//给该结点赋值 
	newNode->next=NULL;//该结点的后继结点指向空 
	if(L->front==NULL){//若当前结点为第一个结点
		//头尾指针均指向该结点 
		L->front = newNode;
		L->rear = newNode;
	}else{
		L->rear->next = newNode;// 队尾结点的后继指针指向新结点 
		L->rear = newNode;//队尾指针后移
	}
	return true; 
}

3.出队列操作

//[front,1,2,3,4,5,6,7,rear]
bool OutQueue(LinkQueue *L,int *outNum){
	if(L->front==NULL){//队列为空 
		return false;
	}
	LinkNode *agency;//创建一个中介指针 
	agency = L->front;//中介指针指向队首 
	*outNum = agency->data;//取出队首元素的值
	L->front = agency->next;//队首指针指向下一个结点
	if(agency==L->rear){//元素出队后队列空 
		L->front=NULL;
		L->rear=NULL;
	} 
	return true;
	 
} 

4.获取队首元素

void GetTop(LinkQueue *L){
	int topNum=0;
	topNum = L->front->data;
	printf("队首元素为%d",topNum);
}


完整代码

//链式存储实现队列
#include <stdio.h>
#include <stdlib.h>

//[front,1,2,3,4,5,6,7,rear]
typedef struct LinkNode{
	int data;
	struct LinkNode *next;
}LinkNode;

typedef struct{
	LinkNode *front,*rear;
}LinkQueue;

InitQueue(LinkQueue *L){
	L->front = NULL;
	L->rear = NULL;
}
//[front,1,2,3,4,5,6,7,rear]
bool EnQueue(LinkQueue *L,int enNum){
	LinkNode *newNode; 
	newNode = (LinkNode *)malloc(sizeof(LinkNode)); //定义一个新结点
	if(newNode==NULL){//内存已满,新结点分配失败 
		return false;
	}
	newNode->data = enNum;//给该结点赋值 
	newNode->next=NULL;//该结点的后继结点指向空 
	if(L->front==NULL){//若当前结点为第一个结点
		//头尾指针均指向该结点 
		L->front = newNode;
		L->rear = newNode;
	}else{
		L->rear->next = newNode;// 队尾结点的后继指针指向新结点 
		L->rear = newNode;//队尾指针后移
	}
	return true; 
}
//[front,1,2,3,4,5,6,7,rear]
bool OutQueue(LinkQueue *L,int *outNum){
	if(L->front==NULL){//队列为空 
		return false;
	}
	LinkNode *agency;//创建一个中介指针 
	agency = L->front;//中介指针指向队首 
	*outNum = agency->data;//取出队首元素的值
	L->front = agency->next;//队首指针指向下一个结点
	if(agency==L->rear){//元素出队后队列空 
		L->front=NULL;
		L->rear=NULL;
	} 
	return true;
	 
} 

void GetTop(LinkQueue *L){
	int topNum=0;
	topNum = L->front->data;
	printf("队首元素为%d",topNum);
}

int main(){
	LinkQueue L;
	InitQueue(&L);//初始化
	//入队操作
	int enNum = 0;//记录入队列元素的变量 
	bool flag;
	printf("请向队列中输入元素(输入99结束):");
	scanf("%d",&enNum);
	while(enNum != 99){
		flag=EnQueue(&L,enNum);//入队列 
		if(flag){
			printf("\n请向队列中输入元素(输入99结束):");
			scanf("%d",&enNum);
		}else{
			printf("入队列失败");
			exit(0);
		}
		
	} 
	
	//出队操作
	int outNum = 0;//存储出队元素的变量 
	char elect = NULL;//判断是否继续出队的变量 
	printf("是否出队元素(y|x):");
	scanf("%s",&elect);
	while(elect == 'y'){
		flag = OutQueue(&L,&outNum);	//调用出队操作 
		if(flag == false){
			printf("\n队已空");
			exit(0);
		}else{
			printf("\n出队元素为%d",outNum);
		}
		printf("\n是否出队元素(y|x):");
		scanf("%s",&elect);
	} 
	
	//读队首元素
	GetTop(&L);
	 
} 

运行结果

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值