c语言队列(顺序队列,循环队列,链式队列)

顺序队列

1.初始化:

front=-1;
rear=-1;

2.判空条件

font=rear;

3.队列已满条件

rear=max-1;

代码:

#include<stdio.h>
#include<stdlib.h>
#define maxn 6

typedef struct node
{
	int date[maxn];
	int font;
	int rear;
}SeqQueue;

void Init(SeqQueue* SQ)//初始化队列
{
	SQ->font = -1;
	SQ->rear = -1;
}

void EnSeqQueue(SeqQueue* SQ, int value)//入队
{
	if (SQ->rear == maxn - 1)
	{
		printf_s("队列已满");
		exit(0);
	}
	else
	{
		SQ->date[++SQ->rear] = value;
		printf_s("入列成功\n");
	}
}

int DeSeqQueue(SeqQueue* SQ)
{
	if (SQ->font == SQ->rear)
	{
		printf_s("队列为空");
		return 0;
	}
	else
	{
		int value;
		value = SQ->date[++SQ->font];
		return value;
	}
}

循环队列

1.初始化:

front=0;
rear=0;

2.判空条件

font=rear;

3.队列已满条件
少用一个元素空间,指定队头指针所在的位置不用来存放元素。这样当队尾的指针绕一圈追上头指针时队列已满。

font=(rear+1)%max;

代码:

#include<stdio.h>
#include<stdlib.h>
#define m 5
#define maxn m+1

typedef struct node
{
	int date[maxn];
	int font;
	int rear;
}SeqQueue;

void Init(SeqQueue* SQ)//初始化队列
{
	SQ->font =0;
	SQ->rear =0;
}

void EnSeqQueue(SeqQueue* SQ, int value)//入队
{
	if ((SQ->rear+1)%maxn==SQ->font)
	{
		printf_s("队列已满");
		exit(0);
	}
	else
	{
		SQ->rear = (SQ->rear + 1) % maxn;//循环
		SQ->date[SQ->rear] = value;
		printf_s("入列成功\n");
	}
}

int DeSeqQueue(SeqQueue* SQ)
{
	if (SQ->font == SQ->rear)
	{
		printf_s("队列为空");
		return 0;
	}
	else
	{
		SQ->font = (SQ->font + 1) % maxn; //循环
		int value;
		value = SQ->date[SQ->font];
		return value;
	}
}

链式队列

为了使队列结构性更强,将头指针与尾指针封装在一个节点中。
1.初始化:让头指针与尾指针一同指向一个空节点。

2.判空条件

font=rear;

3.无队列已满情况

代码:

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

typedef struct node
{
	int date;
	struct node* next;
}LQNode;

typedef struct Queue
{
	LQNode* font;
	LQNode* rear;
}LQueue;

void Init(LQueue* LQ)
{
	LQNode* node;
	node = (LQNode*)malloc(sizeof(LQNode));
	if (node == NULL)
	{
		printf_s("申请空间失败\n");
		exit(0);
	}
	else
	{
		node->next = NULL;
		LQ->font = LQ->rear = node;//初始化指向同一个节点
	}
}

void En_Link_SeqQueue(LQueue* LQ, int value)
{
	LQNode* node;
	node = (LQNode*)malloc(sizeof(LQNode));
	if (node == NULL)
	{
		printf_s("申请空间失败\n");
		exit(0);
	}
	else
	{
		node->next = NULL;
		node->date = value;
		LQ->rear->next=node;
		LQ->rear = node;
	}
}

int De_Link_SeqQueue(LQueue* LQ)
{
	if (LQ->font == LQ->rear)
	{
		printf_s("队列为空");
		return 0;
	}
	else
	{
		int value;
		LQNode* node;
		node = LQ->font->next;//头指针指向的第一个节点
		value = node->date;
		LQ->font->next = node->next; //头指针后移
		free(node);//释放掉没用用处的空间
		if (LQ->font->next == NULL) //表明队列也经为空了
			LQ->rear = LQ->font;
		return value;
	}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

落春只在无意间

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

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

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

打赏作者

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

抵扣说明:

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

余额充值