链式队列是一种特殊的链表,只能在尾部添加,在头部删除,类似于排队问题,先入先出
在这里插入图片描述
代码如下

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#define ERROR 0
typedef int ElemType;
typedef struct Queue{
	struct Queue*next;
	int data;
}ListQueue;				//接口 
struct Queue*front=NULL;//指向队列首元节点的指针 
struct Queue*rear=NULL;//指向队列尾节点的指针 
int length=0;			//控制队列长度,为了方便第一次入队 
ListQueue *createQueue() //初始化 
{
	ListQueue *s=(ListQueue *)malloc(sizeof(ListQueue));
	if(!s)
	{
		printf("内存分配失败!");
		exit(ERROR);
	}
	s->next=NULL;
	length++;
	return s;	
}
void PushQueue(ListQueue *s) //入队 
{
	
	ListQueue *p=(ListQueue*)malloc(sizeof(ListQueue));
	if(!p)				//创建失败 
	{
		printf("内存分配失败!");
		exit(ERROR);       
	}
	printf("请输入你要数据的数据:");
	int a;
	scanf("%d",&a);
	p->data=a;
	p->next=NULL;
	if(length==1) //第一次入队 
	{
		front=rear=p;
		s->next=front;
	}
	else    //第n+1次入队(n>=1) 
	{
	    rear->next=p;
		rear=p;
	}
	length++;   //控制是否为第一次入队,初始化时length已经为1; 
}
void PopQueue(ListQueue*s) //出队 
{
	if(front==NULL||rear==NULL)
	printf("该队列已空!");
	int v;
	v=front->data;
	s->next=front->next;
	free(front);
	front=s->next;
	printf("该出队的数据为:");
	printf("%d",v);
}
void Display(ListQueue*s) //遍历队列 
{
	ListQueue*v=s->next;
	while(v)
	{
		printf("%d->",v->data);
		v=v->next;
	}
}
void DestoryQueue(ListQueue *s) //清空队列并且销毁头节点 
{
	ListQueue *v=s->next;
	while(v)
	{
		front=v->next;
		free(v);
		v=front;
	}
	printf("该队列已清空!");
	free(s);
	printf("\n");
	printf("头节点释放成功!"); 
}
int main()
{
	ListQueue *t=createQueue();
	PushQueue(t);
	PushQueue(t);
	PushQueue(t);
	printf("该数据如下");
	Display(t);
	printf("\n");
	printf("出队!");
	PopQueue(t);
	printf("\n");
	printf("余下数据如下:");
	printf("\n");
	Display(t);
	printf("\n");
	DestoryQueue(t);
	return 0;
}
posted on 2020-03-30 21:33  凸凸大军的一员  阅读(591)  评论(0编辑  收藏  举报