[C语言]链表队列空间

队列的入队,出队,判空,展示,清空等操作
相关的解释都在代码注释中

#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<conio.h>
/*队列: 头向尾移动减少数据,尾移动增加数据*/ 
typedef int Type;//自定义类型 
typedef struct _Que//队列空间 
{
	Type data;
	struct _Que *next;
}Que,*QuePtr;
/*Que是一个队列空间,QuePtr是指向一个队列空间的指针*/
typedef struct _Point//包 
{
	QuePtr top;
	QuePtr tail;
	int cnt;//计算已经拥有多少个队列空间 
}Point,*PointPtr;
/*Point包含一个含一个指向队列头(QuePtr S->top)和队列尾的指针(QuePtr S->tail)*/
PointPtr Point_Creat()//创建一个指向Point的指针S和一个队列,S->top和S->tail初始时规定指向一个Que空间作为空队列 
{
	PointPtr S = (PointPtr)malloc(sizeof(Point));
	QuePtr p = (QuePtr)malloc(sizeof(Que));
	S->top = S->tail = p;
	S->top->next = S->tail->next= NULL;
	S->cnt = 0;
	return S;
}
/*S->top始终指向一个空的头节点,S->tail在非空下始终指向一个队列空间*/
int Que_Add(PointPtr S,Type data)/*增加一个队列空间*/
{
	QuePtr p = (QuePtr)malloc(sizeof(Que));
	if(!p)
	{
		return 0;
	}
	p->data = data;
	p->next = NULL;
	S->tail->next = p;//移动尾部 
	S->tail = p;
	(S->cnt)++;
	return 1;
}
int Que_Empty(PointPtr S)//队列判空 
{
	if(S->top == S->tail)//只要时头尾指向一个空间就是判空 
	{
		return 1;
	}else
	{
		return 0;
	}
}
int Que_Pop(PointPtr S)//弹出一个队列空间 
{
	if(Que_Empty(S))
	{
		return 0;
	}else
	{
		QuePtr p = S->top->next;
		S->top->next = p->next;
		free(p);
		p = NULL; 
		(S->cnt)--;
		if(!(S->top->next))//当尾指针的下一个是NULL时,即此时已经把S->tail所指的空间free了,就需要将S->tail重新指向S->top所指向的头指针恢复空队列 
		{
			S->tail = S->top;
		}
		return 1;
	}
}
int Que_Print(PointPtr S)//展示队列 
{
	if(Que_Empty(S))
	{
		return 0;
	}else
	{
		QuePtr p = S->top->next;
		while(p)
		{
			printf("%d ",p->data);
			p=p->next;
		}
		putchar('\n'); 
		return 1;
	}
}
int Que_Count(PointPtr S)//返回已经有多少个队列空间 
{
	return S->cnt;
}
void Que_Clear(PointPtr S)//清空队列,实际上是Que_Pop的多次运用 
{
	S->cnt = 0;
	while(S->top != S->tail)
	{
		QuePtr p = S->top->next;
		S->top->next = S->top->next->next;
		free(p);
		p = NULL; 
		if(!(S->top->next))//如果把开头指向的也删除了就恢复空 
		{
			S->tail = S->top;
		}
	}
}
void Que_Free(PointPtr S)//清空所有队列信息 
{
	Que_Clear(S);
	free(S->top);
	free(S);
}
int main()
{
	PointPtr S = Point_Creat();
	while(1)
	{
		system("cls");
		fflush(stdin);
		printf(
		"1.入队\n"
		"2.出队\n"
		"3.判空\n"
		"4.个数\n"
		"5.展示\n"
		"6.清空\n"
		"7.退出\n"
		);
		int num;
		if(scanf("%d",&num)==1&&num>=1&&num<=7)
		{
			if(num == 7)
			{
				Que_Free(S);
				break;
			}
			if(num == 1)
			{
				int flag = 1;
				printf("输入数字,q停止\n");
				Type data;
				while(scanf("%d",&data)==1)
				{
					if(!Que_Add(S,data))
					{
						flag = 0;
						printf("ERROR\n");
						break;
					}
				}
				if(flag)
				{
					printf("OK\n");
				}
				getch();
			}else if(num == 2)
			{
				if(Que_Pop(S))
				{
					printf("OK\n");
				}else
				{
					printf("Empty\n");
				}
				getch();
			}else if(num == 3)
			{
				if(Que_Empty(S))
				{
					printf("Empty\n");
				}else
				{
					printf("No Empty\n");
				}
				getch();
			}else if(num == 4)
			{
				printf("%d",Que_Count(S));
				getch();
			}else if(num == 5)
			{
				if(!Que_Print(S))
				{
					printf("Empty\n");
				}
				getch();
			}else if(num == 6)
			{
				Que_Clear(S);
				printf("OK\n");
				getch();
			}
		}
	}
} 

自己研究的,如果有更好的请指出,我一定洗耳恭听

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值