#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include <string.h>
typedef int Item;
typedef struct node * PNode;
typedef struct node
{
Item data;
PNode next;
} Node;
typedef struct
{
PNode front;//头
PNode rear;//尾
int size;//用于存储队列长度
} Queue;
void print(Item i)
{
printf("该节点元素为%d\n",i);
}
/*构造一个空队列*/
Queue *InitQueue()
{
Queue *pqueue = (Queue *)malloc(sizeof(Queue));
if(pqueue!=NULL)
{
pqueue->front = NULL;
pqueue->rear = NULL;
pqueue->size = 0;
}
return pqueue;
}
/*判断队列是否为空*/
int QueueEmpty(Queue *pqueue)
{
if(pqueue->front==NULL&&pqueue->rear==NULL&&pqueue->size==0)
return 1;
else
return 0;
}
/*队头元素出队*/
PNode DeleteQ(Queue *pqueue,Item *pitem)
{
PNode pnode = pqueue->front;
if(QueueEmpty(pqueue)!=1&&pnode!=NULL)
{
if(pitem!=NULL)//判断是否为空
*pitem = pnode->data;
pqueue->size--;//记录队列长度
pqueue->front = pnode->next;//连接
free(pnode);//释放pnode
if(pqueue->size==0)
pqueue->rear = NULL;
}
return pqueue->front;
}
/*清空一个队列*/
void ClearQueue(Queue *pqueue)
{
while(QueueEmpty(pqueue)!=1)
{
DeleteQ(pqueue,NULL);
}
}
/*销毁一个队列*/
void DestroyQueue(Queue *pqueue)
{
if(QueueEmpty(pqueue)!=1)
ClearQueue(pqueue);
free(pqueue);
}
/*求队列的长度*/
int QueueLength(Queue *pqueue)
{
return pqueue->size;
}
/*返回队头元素*/
PNode GetQElem(Queue *pqueue,Item *pitem)
{
if(QueueEmpty(pqueue)!=1&&pitem!=NULL)//判断是否有队头元素
{
*pitem = pqueue->front->data;
}
return pqueue->front;
}
/*返回队尾元素*/
PNode GetRear(Queue *pqueue,Item *pitem)
{
if(QueueEmpty(pqueue)!=1&&pitem!=NULL)//判断是否有队尾元素
{
*pitem = pqueue->rear->data;
}
return pqueue->rear;
}
/*将新元素入队*/
PNode AddQ(Queue *pqueue,Item item)
{
PNode pnode = (PNode)malloc(sizeof(Node));
if(pnode != NULL)
{
pnode->data = item;
pnode->next = NULL;
if(QueueEmpty(pqueue))
{
pqueue->front = pnode;
}
else
{
pqueue->rear->next = pnode;
}
pqueue->rear = pnode;
pqueue->size++;
}
return pnode;
}
/*遍历队列并对各数据项调用visit函数*/
void QueueTraverse(Queue *pqueue,void (*visit)())
{
PNode pnode = pqueue->front;
int i = pqueue->size;
while(i--)
{
visit(pnode->data);
pnode = pnode->next;
}
}
/*逆置队列*/
void QueueReverse(Queue *pqueue)
{
if(QueueEmpty(pqueue) == 0)
{
int a[100]= {0};
int i,b=QueueLength(pqueue);
int item;
for(i=b; i>0; i--)
{
DeleteQ(pqueue,&item);
a[i-1]=item;
}
for(i=0; i<b; i++)
{
AddQ(pqueue,a[i]);
GetRear(pqueue,&item);
}
}
}
void xianshi()
{
printf(" ****************************************************************************\n");
printf(" * 欢迎使用链式存储队列模拟系统 *\n");
printf(" * *\n");
printf(" * 输入数字选择相应功能 *\n");
printf(" * *\n");
printf(" * 0.退出程序 *\n");
printf(" * 1.重新显示菜单 *\n");
printf(" * 2.销毁队列,完成分配空间的回收 *\n");
printf(" * 3.将队列空间清为空 *\n");
printf(" * 4.判断一个队列是否为空 *\n");
printf(" * 5.求队列的长度 *\n");
printf(" * 6.取队头的元素 *\n");
printf(" * 7.将一个元素添加到队尾 *\n");
printf(" * 8.将队头元素出队 *\n");
printf(" * 9.打印输出队头到队尾的每个元素 *\n");
printf(" * 10.打印输出队尾到队头的每个元素 *\n");
printf(" * 11.逆置队列 *\n");
printf(" * 12.重新创建新队列 *\n");
printf(" * 13.将多个元素添加到队尾 *\n");
printf(" * *\n");
printf(" ****************************************************************************\n");
}
int shurujiance()
{
char s[20];
int num = 0,n,len,i;
while(1)
{
gets(s);
len = strlen(s);
fflush(stdin);
if(len!=0)
{
num = 0;
for(i = len-1; i >= 0; --i)
{
if((s[i] < '0') || (s[i] > '9'))
{
printf("请输入数字!\n");
break; //
}
num = 10 * num + s[len-i-1] - '0'; //
}
if(i < 0)
break;
}
}
return num;
}
void main()
{
int shurujiance();
xianshi();
printf("初始队列已创建\n");
Queue *pq = InitQueue();
int x,i,item,n1,n2,n3,input=0;
int p=1;
input=shurujiance();
while(input != -1)
{
switch(input)
{
case 0 :
{
exit(0);
break;
}
case 1 :
{
xianshi();
break;
}
case 2 :
{
if(p)
{
DestroyQueue(pq);
printf("队列已销毁\n");
p=0;
}
else
{
printf("队列已被销毁,无法再次销毁\n");
}
break;
}
case 3 :
{
if(QueueEmpty(pq))
{
printf("队列已为空,无法再次清空。\n");
}
else
{
if(p)
{
ClearQueue(pq);
printf("队列已清空\n");
}
else
{
printf("队列已被销毁,无法清空\n");
}
}
break;
}
case 4 :
{
if(p)
{
if(QueueEmpty(pq))
{
printf("队列为空\n");
}
if(QueueEmpty(pq)==0)
{
printf("队列不为空\n");
}
}
else
{
printf("队列已被销毁,无法判断\n");
}
break;
}
case 5 :
{
if(p)
{
printf("队列长度为:%d\n",QueueLength(pq));
}
else
{
printf("队列已被销毁,无法判断\n");
}
break;
}
case 6 :
{
if(p)
{
if(QueueEmpty(pq))
{
printf("队列为空,无法完成该操作\n");
}
el
duilie.rar_队列_队列C
版权申诉
15 浏览量
2022-09-24
06:44:33
上传
评论
收藏 2KB RAR 举报
APei
- 粉丝: 65
- 资源: 1万+
最新资源
- 数据文件之数据库业务监控
- 6.1 07.静态路由及默认路由基本配置.topo
- 计算机网络期末考判断题题库
- NX二次开发UF-CAM-ask-clear-plane-usage 函数介绍
- Windows服务监控工具 ManageEngine-ServiceMonitor 运维工具监控MySQL, MSSQL
- java基于 ssm + jsp 考研指导平台系统源码 带毕业论文
- AD域管理工具 ManageEngine-ADManager-Plus-Tools 运维工具监控Windows AD域控
- 计算机网络期末考选择题题库
- 机器学习课程设计猫狗图像识别检测分类项目源码+数据集+说明文档.zip
- Windows管理工具 任务管理器、获取计算机上安装的哪些软件、远程关机/重启计算机
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈