数据结构 链队列和顺序队列的实现

一、顺序队列的实现

利用顺序表的特性,定义一个队列游标的结构,头front指向队列的头(注意!这里为了好操作不直接让头等于队列头,因为以后可以利用头追上尾表示队空,这个标准使得循环队列更易理解),尾rear等于队尾。然后就是几个基本的初始化、增加、减少、删除等操作。顺序的循环队列由于无法释放不需要的内存,相对循环队列,链队列而言容易造成假溢出。代码略,你可以用一个结构体数组模拟上述过程。

二、链队列的实现

这里利用链表的特性,然后就可以动态地管理到内存。

具体代码实现如下:

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

//******宏定义参数******
#define OK 1
#define NO 0
#define EORRO 0

//******声明数据类型别名******
typedef int Status;
typedef char ElemType;
typedef double db;

//******声明数据结构******
typedef struct node
{
	ElemType ch;
	struct node *next;
}QueueNode,*QueuePoint;

typedef struct
{
	int QueueSize;
	QueuePoint front;
	QueuePoint rear;
}HeadNode,*HeadPoint;

HeadPoint InitQueue()
{
	HeadPoint Head=(HeadPoint)malloc(sizeof(HeadNode));
	Head->QueueSize=0;
	Head->front=Head->rear=(QueuePoint)malloc(sizeof(QueueNode));
	Head->rear->next=NULL;
	Head->front->ch=NO;
	return Head;
}

Status QueueEmpty(HeadPoint Head)
{
	if(Head->front == Head->rear)
		return OK;
	return NO;
}

ElemType getFront(HeadPoint Head)
{
	if(QueueEmpty(Head))
	{
		printf("对不起,该队列为空!\n");
		return NO;
	}
	return Head->front->next->ch;
}

void QueuePop(HeadPoint Head)
{
	QueuePoint p=Head->front;
	if(QueueEmpty(Head))
	{
		printf("对不起,该队列为空!无可出队元素!\n");
		return ;
	}
	Head->front=p->next;
	Head->QueueSize--;
	free(p);
	return ;
}

void QueuePush(HeadPoint Head,ElemType ch)
{
	QueuePoint p=(QueuePoint)malloc(sizeof(QueueNode));
	if(p==NULL)
	{
		printf("对不起,系统内存不足!入队失败!\n");
		return ;
	}
	p->next=Head->rear->next;
	p->ch=ch;
	Head->rear->next=p;
	Head->rear=p;
	Head->QueueSize++;
	return ;
}

void QueueDelete(HeadPoint Head)
{
	while(!QueueEmpty(Head))
		QueuePop(Head);
	free(Head->front);
	return ;
}

int main()
{
	ElemType ch;
	HeadPoint Head=InitQueue();
	printf("%s\n",QueueEmpty(Head)?"该队列为空!":"该队列非空!");
	while((ch=getchar())!='\n')
		QueuePush(Head,ch);
	printf("%s\n",QueueEmpty(Head)?"该队列为空!":"该队列非空!");
	while(!QueueEmpty(Head))
	{
		printf("%c",getFront(Head));
		QueuePop(Head);
	}
	printf("\n%s\n",QueueEmpty(Head)?"该队列为空!":"该队列非空!");
	QueueDelete(Head);
	free(Head);
	printf("链队列操作结束!\n");
	return 0;
}
总结:
队列是一种先进先出的结构,今后的迷宫问题可以利用这种特性按层搜索,找到最短路。类似于这类的按层搜索问题都可以使用到队列!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小胡同的诗

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

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

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

打赏作者

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

抵扣说明:

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

余额充值