1、
循环队列的操作和实现C语言
学习—————好资料
循环队列的基本操作都可以实现,后面有代码。
代码:
#include
2、 int creat_queue(Queue*q); int en_queue(Queue*q,int e); int out_queue(Queue*q,int*e); int destroy_queue(Queue*q); int length_queue(Queue*q); void main() { Queue q; int m,n,i,e,f,f1,k=0; int a1,a2,a3,a4,a5,a6;//用来接函数返回值 int *e1,*e2; q.base=NULL; e1=e2=&k;//对于指针最好这样初始化定义
3、一下,因为只声明是没有分陪内存的,不能直接用*e printf("----------------循环队列的基本操作---------------\n"); printf("----------------1.创建一个空队列-----------------\n"); printf("----------------2.单次入队列---------------------\n"); printf("----------------3.单次出队列---------------------\n"); printf("----------------4
4、集体入队列---------------------\n"); printf("----------------5.集体出队列---------------------\n"); printf("----------------6.队列元素个数-------------------\n"); printf("----------------7.销毁队列-----------------------\n"); printf("----------------0.退出---------------------------\n"); loop: print
5、f("请选择:"); scanf("%d",&m); switch(m) { case 1: a1=creat_queue(&q); if(a1==0) { printf("队列已经存在,请先销毁原来队列!\n"); break;} printf("OK!队列创建成功!\n"); break; case 2: printf("请输入要入队列的元素(整型):"); scanf("%d",&e); a
6、2=en_queue(&q,e); if(a2==-1) { printf("队列不存在,请先创建队列!\n"); break; } else if(a2==0) { printf("入队失败!因为队列满了!\n"); break; } else { printf("OK!入队成功!\n"); break; } case 3: a3=out_queue(&q,e1); if(a3==-1) { pri
7、ntf("队列不存在,请先创建队列!\n"); break; } else if(a3==0) { printf("出队失败!因为队列为空!\n"); break; } else{ printf("OK!出队成功"); printf("出队元素为:%d\n",*e1); break; } case 4: printf("请输入您要入队列的个数:"); scanf("%d",&n);
8、for(i=0;i 9、队列不存在,请先创建!\n");
break;}
else if(f==1)
{ printf("存不下这个元素了,因为队列已经满了!\n");
break;
}
else
printf("OK!集体入队列成功!\n");
break;
case 5: printf("OK!集体出队列为:");
while(1)
{ a6=out_queue(&q,e2);
if(a6==-1)
{printf("队列不存在!请先创建队列!\n"); 10、
break;}
else if(a6==0)
{ if(f1!=1) //新加一个f1标志位,若f1=1表示不是一开始就为空的
printf("队列本来就为空!\n");
break;
}
else { f1=1;
printf(" %d",*e2);}
}
printf("\n");
break;
case 6: 11、 a5=length_queue(&q);
if(a5==-1)
{ printf("队列不存在,请先创建!\n");
break;}
printf("队列长度为:%d\n",a5);
break;
case 7: a4=destroy_queue(&q);
if(a4==0)
{ printf("队列本来就不存在!\n");
break;
}
else printf("OK!队列销毁成功!\n");
break;
12、 case 0: exit(0);
default: printf("输入错误!");
}
printf("请继续操作!\n");
goto loop;
}
int creat_queue(Queue*q)
{ if (q->base!=NULL)//队列已经存在,要先销毁
return 0;
q->base=(int*)malloc(MAX_SIZE*sizeof(int));
q->front=q->rear=0;
q->full=0;
return 1;
}
int en_queue 13、Queue*q,int e)
{ if(q->base==NULL)
return -1;//是队列不存在
else if(q->full==1&&q->front==q->rear)
return 0;//入队前考虑队列是否满了
else {
q->base[q->rear]=e;
q->rear=(q->rear+1)%MAX_SIZE;//实现循环,如果rear+1满了并不是真正的满了,可以循环
if(q->front==q->rear)
q->full=1;
return 1;}
}
i 14、nt out_queue(Queue*q,int*e)
{ if(q->base==NULL)
return -1;//是队列不存在
if(q->full==0&&q->front==q->rear)
return 0; //出队前考虑队列是否为空
else {
*e=q->base[q->front];
q->front=(q->front+1)%MAX_SIZE;//修改front位置
if(q->front==q->rear)
q->full=0;//如果出队后两位置相同则队为空了
return 1;
15、}
}
int destroy_queue(Queue*q)
{
if(q->base==NULL)
return 0;//是队列不存在
free(q->base);
q->base=NULL;
return 1;
}
int length_queue(Queue*q)
{ if(q->base==NULL)
return -1;//是队列不存在
else
if(q->full==1&&q->front==q->rear)
return MAX_SIZE;//满队列时
else
return(q->rear-q->front+MAX_SIZE)%MAX_SIZE;
//很重要的式子,因为rear不是一直比front大的,
//如果rear比front小,要加上队列容量
}
精品资料






