队列的入队,出队,判空,展示,清空等操作
相关的解释都在代码注释中
#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();
}
}
}
}
自己研究的,如果有更好的请指出,我一定洗耳恭听