#include<stdio.h>
#include<stdlib.h>
typedef struct Queue{ //队列节点
int data;
struct Queue * pNext;
}Queue,*pQueue;
typedef struct{ //头指针和尾指针
pQueue front;
pQueue rear;
}LinkedQueue;
int flag=0;//用来记录是否初始化
void show();
int InitQueue(LinkedQueue &Q);
int CreatQueue(LinkedQueue &Q);
int ShowQueue(LinkedQueue Q);
int DestroyQueue(LinkedQueue &Q);
int ClearQueue(LinkedQueue &Q);
int IsEmpy(LinkedQueue Q);
int QueueLength(LinkedQueue Q);
int GetHead(LinkedQueue Q);
int EnQueue(LinkedQueue &Q);
int DeQueue(LinkedQueue &Q);
int main()
{
#include<stdlib.h>
typedef struct Queue{ //队列节点
int data;
struct Queue * pNext;
}Queue,*pQueue;
typedef struct{ //头指针和尾指针
pQueue front;
pQueue rear;
}LinkedQueue;
int flag=0;//用来记录是否初始化
void show();
int InitQueue(LinkedQueue &Q);
int CreatQueue(LinkedQueue &Q);
int ShowQueue(LinkedQueue Q);
int DestroyQueue(LinkedQueue &Q);
int ClearQueue(LinkedQueue &Q);
int IsEmpy(LinkedQueue Q);
int QueueLength(LinkedQueue Q);
int GetHead(LinkedQueue Q);
int EnQueue(LinkedQueue &Q);
int DeQueue(LinkedQueue &Q);
int main()
{
int i,num;
LinkedQueue Q;
show();
printf("请选择:\n");
do
{
scanf("%d",&i);
switch(i)
{
case 1:{
InitQueue(Q);
printf("初始化成功!");
break;
}
case 2:{
if(flag)
{
DestroyQueue(Q);
}
else
printf("请先初始化!\n");
break;
}
case 3:{
if(flag)
{
ClearQueue(Q);
}
else
printf("请先初始化!\n");
break;
}
case 4:{
if(flag)
{
IsEmpy(Q);
}
else
printf("请先初始化!\n");
break;
}
case 5:{
if(flag)
{
QueueLength(Q);
}
else
printf("请先初始化!\n");
break;
}
case 6:{
if(flag)
{
GetHead(Q);
}
else
printf("请先初始化!\n");
break;
}
case 7:{
if(flag)
{
EnQueue(Q);
}
else
printf("请先初始化!\n");
break;
}
case 8:{
if(flag)
{
DeQueue(Q);
}
else
printf("请先初始化!\n");
break;
}
case 9:{
num=InitQueue(Q);
if(num==1)
CreatQueue(Q);
break;
}
case 10:{
if(flag)
{
ShowQueue(Q);
}
else
printf("请先初始化!\n");
break;
}
case 11:{
exit(0);
break;
}
default:
printf("输入不合法:\n");
break;
}
printf("请继续:\n");
} while(1);
return 0;
}
LinkedQueue Q;
show();
printf("请选择:\n");
do
{
scanf("%d",&i);
switch(i)
{
case 1:{
InitQueue(Q);
printf("初始化成功!");
break;
}
case 2:{
if(flag)
{
DestroyQueue(Q);
}
else
printf("请先初始化!\n");
break;
}
case 3:{
if(flag)
{
ClearQueue(Q);
}
else
printf("请先初始化!\n");
break;
}
case 4:{
if(flag)
{
IsEmpy(Q);
}
else
printf("请先初始化!\n");
break;
}
case 5:{
if(flag)
{
QueueLength(Q);
}
else
printf("请先初始化!\n");
break;
}
case 6:{
if(flag)
{
GetHead(Q);
}
else
printf("请先初始化!\n");
break;
}
case 7:{
if(flag)
{
EnQueue(Q);
}
else
printf("请先初始化!\n");
break;
}
case 8:{
if(flag)
{
DeQueue(Q);
}
else
printf("请先初始化!\n");
break;
}
case 9:{
num=InitQueue(Q);
if(num==1)
CreatQueue(Q);
break;
}
case 10:{
if(flag)
{
ShowQueue(Q);
}
else
printf("请先初始化!\n");
break;
}
case 11:{
exit(0);
break;
}
default:
printf("输入不合法:\n");
break;
}
printf("请继续:\n");
} while(1);
return 0;
}
void show()
{
printf("***************************************************************\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("***************************************************************\n");
}
{
printf("***************************************************************\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("***************************************************************\n");
}
int InitQueue(LinkedQueue &Q)
{
Q.front=Q.rear=(pQueue)malloc(sizeof(Queue));
if(!Q.front)//相当于if(Q.front == NULL)
{
printf("初始化失败!\n");
return 0;
}
Q.front->pNext=NULL;//说明该队列为空,头指针指向第一个有效元素的下一个元素
flag=1;//设置为1说明初始化成功
return 1;
}
{
Q.front=Q.rear=(pQueue)malloc(sizeof(Queue));
if(!Q.front)//相当于if(Q.front == NULL)
{
printf("初始化失败!\n");
return 0;
}
Q.front->pNext=NULL;//说明该队列为空,头指针指向第一个有效元素的下一个元素
flag=1;//设置为1说明初始化成功
return 1;
}
int QueueLength(LinkedQueue Q)
{
int i=0;
while(Q.front->pNext)//相当于while(Q.front->pNext != NULL)
{
i++;
Q.front=Q.front->pNext;
}
printf("队列的长度是:%d\n",i);
return 1;
}
{
int i=0;
while(Q.front->pNext)//相当于while(Q.front->pNext != NULL)
{
i++;
Q.front=Q.front->pNext;
}
printf("队列的长度是:%d\n",i);
return 1;
}
int DeQueue(LinkedQueue &Q)
{
if(!Q.front->pNext)
{
printf("队列为空!\n");
return 0;
}
pQueue p;
p=Q.front->pNext;//每次删除一个元素时记得把该元素先保存,方便以后释放空间,就像交换两个变量一样,先把其中一个变量保存
Q.front->pNext=p->pNext;//前指针后移
printf("删除成功!\n");
free(p);
return 1;
}
int EnQueue(LinkedQueue &Q)
{
pQueue p;
p=(pQueue)malloc(sizeof(Queue));//分配一个链表节点的内存空间
if(!p)
{
printf("插入失败!\n");
return 0;
}
printf("请输入一个整数:");
scanf("%d",&p->data);
p->pNext=NULL;
Q.rear->pNext=p;//将尾指针链接到新节点上 ,因为尾指针指向最后一个有效元素
Q.rear=p;//移动尾指针 这两个步骤就像登山一样,先把挂钩挂上,再移动身体
return 1;
}
int GetHead(LinkedQueue Q)
{
if(Q.front->pNext==NULL)
{
printf("队列为空!\n");
return 0;
}
Q.front=Q.front->pNext;//因为头指针指向第一个有效元素的下一个元素
printf("队头为:%d\n",Q.front->data);
return 1;
}
{
if(!Q.front->pNext)
{
printf("队列为空!\n");
return 0;
}
pQueue p;
p=Q.front->pNext;//每次删除一个元素时记得把该元素先保存,方便以后释放空间,就像交换两个变量一样,先把其中一个变量保存
Q.front->pNext=p->pNext;//前指针后移
printf("删除成功!\n");
free(p);
return 1;
}
int EnQueue(LinkedQueue &Q)
{
pQueue p;
p=(pQueue)malloc(sizeof(Queue));//分配一个链表节点的内存空间
if(!p)
{
printf("插入失败!\n");
return 0;
}
printf("请输入一个整数:");
scanf("%d",&p->data);
p->pNext=NULL;
Q.rear->pNext=p;//将尾指针链接到新节点上 ,因为尾指针指向最后一个有效元素
Q.rear=p;//移动尾指针 这两个步骤就像登山一样,先把挂钩挂上,再移动身体
return 1;
}
int GetHead(LinkedQueue Q)
{
if(Q.front->pNext==NULL)
{
printf("队列为空!\n");
return 0;
}
Q.front=Q.front->pNext;//因为头指针指向第一个有效元素的下一个元素
printf("队头为:%d\n",Q.front->data);
return 1;
}
int IsEmpy(LinkedQueue Q)
{
if(Q.front->pNext==NULL){//对列为空的判断标志是没有第一个有效元素
printf("队列为空!\n");
}
else {
printf("队列非空!\n");
}
return 1;
}
int ClearQueue(LinkedQueue &Q)
{
Q.front->pNext=Q.rear->pNext=NULL;
return 1;
}
int DestroyQueue(LinkedQueue &Q)
{
pQueue p,q;
p=Q.front->pNext;
while(p)
{
q=p;//用p保存第一个有效元素
p=p->pNext;//移动指针
free(q);//释放q
}
Q.front=Q.rear=NULL;//先释放链表节点内存,再将两个指针变量设置尾空
free(Q.front);
free(Q.rear);
printf("队列已销毁!\n");
flag=0;
return 1;
}
int ShowQueue(LinkedQueue Q)
{
if(Q.front->pNext==NULL){
printf("队列为空!");
return 0;
}
pQueue p;
p=Q.front->pNext;//将p指向第一个有效元素
printf("队列元素是:\n");
while(p)//相当于while(p!=NULL)
{
printf("%d\t",p->data);
p=p->pNext;
}
printf("\n");
return 1;
}
int CreatQueue(LinkedQueue &Q)
{
int n,i;
printf("请输入队列长度:\n");
scanf("%d",&n);
pQueue p;
for(i=0;i<n;i++)
{
p=(pQueue)malloc(sizeof(Queue));//循环一次分配一个节点内存空间
if(!p)
{
printf("创建失败!\n");
flag=0;
return 0;
}
printf("请输入第%d个元素:",i+1);
scanf("%d",&(p->data));
p->pNext=NULL;
Q.rear->pNext=p;
Q.rear=p;
}
return 1;
}
{
if(Q.front->pNext==NULL){//对列为空的判断标志是没有第一个有效元素
printf("队列为空!\n");
}
else {
printf("队列非空!\n");
}
return 1;
}
int ClearQueue(LinkedQueue &Q)
{
Q.front->pNext=Q.rear->pNext=NULL;
return 1;
}
int DestroyQueue(LinkedQueue &Q)
{
pQueue p,q;
p=Q.front->pNext;
while(p)
{
q=p;//用p保存第一个有效元素
p=p->pNext;//移动指针
free(q);//释放q
}
Q.front=Q.rear=NULL;//先释放链表节点内存,再将两个指针变量设置尾空
free(Q.front);
free(Q.rear);
printf("队列已销毁!\n");
flag=0;
return 1;
}
int ShowQueue(LinkedQueue Q)
{
if(Q.front->pNext==NULL){
printf("队列为空!");
return 0;
}
pQueue p;
p=Q.front->pNext;//将p指向第一个有效元素
printf("队列元素是:\n");
while(p)//相当于while(p!=NULL)
{
printf("%d\t",p->data);
p=p->pNext;
}
printf("\n");
return 1;
}
int CreatQueue(LinkedQueue &Q)
{
int n,i;
printf("请输入队列长度:\n");
scanf("%d",&n);
pQueue p;
for(i=0;i<n;i++)
{
p=(pQueue)malloc(sizeof(Queue));//循环一次分配一个节点内存空间
if(!p)
{
printf("创建失败!\n");
flag=0;
return 0;
}
printf("请输入第%d个元素:",i+1);
scanf("%d",&(p->data));
p->pNext=NULL;
Q.rear->pNext=p;
Q.rear=p;
}
return 1;
}