C语言回顾(9)

队列
队列是一种操作受限的线性表,只允许在表的一端进行插入,而在另一端进行删除;进行插入的一端为队尾,删除的一端为队头,相对列插入元素时为入队,删除时为出队,典型的先进先出;队首元素为离队头最近的元素;队列一般也分两种储存方式,顺序储存方式和链式储存方式,简称顺序队和链式队。
队列的顺序储存方式
队列的顺序储存方式是在结构体中构建一个数组和两个整形变量,数组用来储存元素,另外两个整形当做队头指针和队尾指针,利用队头指针和队尾指针的用算来将元素存放或输出。

#include<stdio.h>
#include<Windows.h>
#include<stdlib.h>
#include<string.h>
typedef int QElemType;
#define N 20
typedef struct QNode
{
	QElemType data[N];
	QElemType front,rear;
}LinkQueue;
void LintQueue(LinkQueue *&s)//初始化队列
{
	s=(LinkQueue*)malloc(sizeof(LinkQueue));
	s->front=s->rear=-1;
}
bool QueueEmpty(LinkQueue*&s)//判断队列是否为空
{
	return (s->front==s->rear);
}
int  EnQueue(LinkQueue*&s,QElemType e)//入队函数
{
	if(s->rear==N-1)
		return false;
	s->rear++;
	s->data[s->rear]=e;
	return true;
}
bool DnQueue(LinkQueue *&s,QElemType &e)//出队函数
{
	if(s->rear==s->front)
		return false;
	s->front++;
	e=s->data[s->front];
	return true;
}
void Destroy(LinkQueue*&s)//销毁队列
{
	free(s);
}
bool Gethead(LinkQueue*&s,QElemType e)//
{
	if(s->front==s->rear)
		return false;
	s->front++;
	e=s->data[s->front];
	return true;
}
void main()
{
	int a,b,e,c;
	LinkQueue *s;
	LintQueue(s);
	QueueEmpty(s);
	printf("请输入如队个数:");
	scanf("%d",&a);
	for(b=1;b<=a;b++)
	{
		printf("第%d个入队的是:",b);
		scanf("%d",&e);
		EnQueue(s,e);
	}
	printf("请输入出队个数:\n");
	scanf("%d",&c);
	while(c>a)
	{
		printf("请重新输入出队个数:\n");
	    scanf("%d",&c);
	}
	for(b=1;b<=c;b++)
	{
		DnQueue(s,e);
		printf("第%d个出队的是:%d\n",b,e);
	}
	Destroy(s);
	system("pause");
}

在这里插入图片描述
队列需要多个子函数共同作用才能实现,每一个子函数都有自己的作用,它们分工合作,共同构建了一个完整的队列,并能实现队列的各个功能。
循环队列
上述的队列的顺序储存方式只能储存一次数据,而出队也只是形式上的将队列中的数据打印出来,并没有真正意义上的出队,因此,顺序对列如果想要多次入队和出队,就要用到循环队列,将队列的头部和尾部相连,使构建的队列可以多次进出队列。
队列的链式存储方式
队列的链式存储方式是在用链表的形式构建的,不同于顺序队列的覆盖,链式队列的进出队列都要构建或删除节点,因此,并不会出现队列内空间不足的情况;链式队列储存数据的方法使用结构体储存,也就是节点中的数据域,除此之外,还有队头指针和队尾指针,不同于顺序队列中的用整形变量来定义,链式队列的队头队尾指针都是用结构体指针定义的,队头指针指向链表的头部,队尾指针指向链表的尾部,进队时构建新的内存空间并利用尾插法给链表的尾部插入新的数据,出队时,从队头将数据取出,并把节点的内存释放,完美的实现了队列的定理。

 #include<stdio.h>
#include<Windows.h>
#include<stdlib.h>
#include<string.h>
typedef int QElemType;
typedef struct QNode
{
	QElemType data;
	struct QNode * next;
}QNode,*Queueptr;
typedef struct
{
	Queueptr front;
	Queueptr rear;
}LinkQueue;
int LintQueue(LinkQueue &Q)
{
	Q.front=Q.rear=(Queueptr)malloc(sizeof(QNode));
	Q.front->next=NULL;
	return 0;
}
int EnQueue(LinkQueue &Q,QElemType e)
{
	QNode* p=(QNode*)malloc(sizeof(QNode));
	p->data=e;
	p->next=NULL;
    Q.rear->next=p;
	Q.rear=p;
	return 0;
}
int DeQueue(LinkQueue &Q,QElemType &e)
{
	QNode*p=(QNode*)malloc(sizeof(QNode));
	p=Q.front->next;
	e=p->data ;
	Q.front->next=p->next;
	if(Q.rear=p)
		Q.rear=Q.front;
	free(p);
	return 0;
}
int Destroy(LinkQueue &Q)
{
	while(Q.front)
	{
		Q.rear=Q.front->next;
		free(Q.front);
		Q.front=Q.rear;
	}
	return 0;
}
void main()
{
	int a,b,e,c;
	LinkQueue Q;
	LintQueue(Q);
	printf("请输入入队个数:");
	scanf("%d",&a);
	for(b=1;b<=a;b++)
	{
		printf("第%d个入队的是:",b);
		scanf("%d",&e);
		EnQueue(Q,e);
	}
	printf("请输入出队个数:\n");
	scanf("%d",&c);
	while(c>a)
	{
		printf("请重新输入出队个数:");
	    scanf("%d",&c);
		printf("\n");
	}
	for(b=1;b<=c;b++)
	{
		DeQueue(Q,e);
		printf("第%d个出队的是:%d\n",b,e);
	}
	Destroy(Q);
	system("pause");
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值