c语言循环队列的错误修改

时间:2013.11.02 发布人:adity**ulkarni

c语言循环队列的错误修改

已解决问题

谷歌adity**ulkarni用户在2013.11.02提交了关于“秦岭c语言循环队列的错误修改”的提问,欢迎大家涌跃发表自己的观点。目前共有1个回答,最后更新于2024-07-28T14:35:26。#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>

#definemaxqsize10
#defineoverlow0
#defineerror0
#defineok1

typedefstruct{
char*base;
intfront;
intrear;
}sqqueue;

intinitqueue_sq(sqqueue*q){//初始化顺序队
q->base=(char*)malloc(maxqsize*sizeof(char));
if(!q->base)
returnoverlow;//存储分配失败
q->front=q->rear=0;
returnok;
}

intenqueue_sq(sqqueue*q,chare){//e插入队尾作为新元素
if((q->rear+1)%maxqsize==q->front)
returnerror;//存储分配失败
q->base[q->rear]=e;
q->rear=(q->rear+1)%maxqsize;
returnok;
}

intdequeue_sq(sqqueue*q,char*e){//出队,返回首元素e的值
if(q->front==q->rear)
returnerror;
*e=q->base[q->front];
q->front=(q->front+1)%maxqsize;
returnok;
}

intqueuelength_sq(sqqueue*q)//求对长
{
return(q->rear-q->front+maxqsize)%maxqsize;
}

intqueuetr**erse_sq(sqqueueq,int(*visit)()){//遍历顺序循环队
inti,n;
n=queuelength_sq(&q);
for(i=0;i<n;i++)
visit(q.base+i);
returnok;
}

intvisit(char(q.base)){
printf("%c",*(q.base));
returnok;
}

intmain(){
sqqueueq;
chare;
inti,n,m;
initqueue_sq(&q);
printf("inputthe**mberofthedatas:");
scanf("%d",&n);
for(i=0;i<n;i++){
fflush(stdin);
printf("enterthequeue:");
scanf("%c",&e);
if(!enqueue_sq(&q,e)){
printf("thequeueisfull!\n");
bre**;
}
}
printf("tr**ersethequeuenow:");
queuetr**erse_sq(q,int(*e));
printf("\nthelengthofthequeueis%d\n",queuelength_sq(&q));
printf("inputthe**mberofthedatastoout:");
scanf("%d",&m);
for(i=0;i<m;i++){
printf("outputthefirstdatainthequeue:");
dequeue_sq(&q,&e);
printf("%c\n",e);
}
printf("tr**ersethequeuenow:");
queuetr**erse_sq(q,(*visit));
printf("\nthelengthofthequeueis%d\n",queuelength_sq(&q));
}希望大家能够帮助她。

详细问题描述及疑问:#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>

#definemaxqsize10
#defineoverlow0
#defineerror0
#defineok1

typedefstruct{
char*base;
intfront;
intrear;
}sqqueue;

intinitqueue_sq(sqqueue*q){//初始化顺序队
q->base=(char*)malloc(maxqsize*sizeof(char));
if(!q->base)
returnoverlow;//存储分配失败
q->front=q->rear=0;
returnok;
}

intenqueue_sq(sqqueue*q,chare){//e插入队尾作为新元素
if((q->rear+1)%maxqsize==q->front)
returnerror;//存储分配失败
q->base[q->rear]=e;
q->rear=(q->rear+1)%maxqsize;
returnok;
}

intdequeue_sq(sqqueue*q,char*e){//出队,返回首元素e的值
if(q->front==q->rear)
returnerror;
*e=q->base[q->front];
q->front=(q->front+1)%maxqsize;
returnok;
}

intqueuelength_sq(sqqueue*q)//求对长
{
return(q->rear-q->front+maxqsize)%maxqsize;
}

intqueuetr**erse_sq(sqqueueq,int(*visit)()){//遍历顺序循环队
inti,n;
n=queuelength_sq(&q);
for(i=0;i<n;i++)
visit(q.base+i);
returnok;
}

intvisit(char(q.base)){
printf("%c",*(q.base));
returnok;
}

intmain(){
sqqueueq;
chare;
inti,n,m;
initqueue_sq(&q);
printf("inputthe**mberofthedatas:");
scanf("%d",&n);
for(i=0;i<n;i++){
fflush(stdin);
printf("enterthequeue:");
scanf("%c",&e);
if(!enqueue_sq(&q,e)){
printf("thequeueisfull!\n");
bre**;
}
}
printf("tr**ersethequeuenow:");
queuetr**erse_sq(q,int(*e));
printf("\nthelengthofthequeueis%d\n",queuelength_sq(&q));
printf("inputthe**mberofthedatastoout:");
scanf("%d",&m);
for(i=0;i<m;i++){
printf("outputthefirstdatainthequeue:");
dequeue_sq(&q,&e);
printf("%c\n",e);
}
printf("tr**ersethequeuenow:");
queuetr**erse_sq(q,(*visit));
printf("\nthelengthofthequeueis%d\n",queuelength_sq(&q));
}期待您的答案,我不知道说什么才好,除了谢谢 !

希望以下的回答,能够帮助你。

第1个回答

用户名:bobby.m126.com  

彻底修改好了,请看:
#include<s331215问答tdio.h>
#include<stdlib.h>
#include<mallo紧机c.h>

#defin甚医映好如确emaxqsize10
#defineoverlow0
#织州德协defineerror0
#defineok1

typedefstruct
{
char代笔视*base;
intfront;
intrear;
}sqqueue;

intin坏他析守使院itqueue_sq(sqqueue*q)
{//初始化顺序队
q->base=(char*)malloc(maxqsize*sizeof(c利波har));
if(!q->base)
returnoverlow;/占长导致树/存储分配失败
q->front=q->rear=0;
returnok;
}

intenqueue_sq(sqqueue*q,chare)
{//e插入队尾作为新元素
if((q->rear+1)%maxqsize==q->front)
returnerror;//存储分配失败
q反省神->base[q->rear]=e;
q->rear=(q->rear+1)%maxqsize;
returnok;
}

intdequeue_他歌育景微远术督sq(sqqueue*q,char*e)
{//出队,返回首元素e的值
if(q->front==q->rear)
returnerror;
*e=q->base[q->front];
q->front=(q->front+1)%maxqsize;
returnok;
}

intqueuelength_s罗施群跳q(sqqueue*q)//质求对长
{
retur协低转心孙呼停践始装清n(q->rear-q->front+maxqsize)%maxqsize;
}

//intqueuetr**erse_sq(sqqueueq,int(*visit)())//这里的参数visit应该跟下面的函数visit格式一致
intqueuetr**erse_sq(sqqueueq,int(*visit)(char*))
{//遍历顺序循环队
inti,n;

n=queuel穿期蛋ength_sq(&q);
for(i=0;i<n;i++)
//visit(q.ba情se+i);//应该从front遍历到rear,而不是从base开始,直接遍历N个元素
visit(q.base+(q.front+i)%maxqsize);
returnok;
}

//#--庆民-----------伯针肉跳之----这个函数写的问获机附的品依备仍题有问题
/*intvisit(char(q.base))
{
printf("%c",*(q.base));
returnok;
}*/
//#--示动策问费雷松烟喜煤-------------------------------
intvisit(char*base)
{
printf("%c",*base);
returnok;
}

intmain()
{
sqqueueq;
chare;
inti,n,m;

initqueue_sq(&q);
printf("inputthe**mberofthedatas:");
scanf("%d",&n);
for(i=0;i<n;i++)
{
//fflush(stdin);//用下面几句代码,替换fflush
intc;

if(feof(stdin)||ferror(stdin))
{
bre**;
}
while((c=getchar())!='\n'&&c!=EOF);

printf("enterthequeue:");
scanf("%c",&e);
if(!enqueue_sq(&q,e))
{
printf("thequeueisfull!\n");
bre**;
}
}
printf("tr**ersethequeuenow:");
//queuetr**erse_sq(q,int(*e));//不知道你这样写,有什么意图,应该是下面这句的吧?
queuetr**erse_sq(q,(*visit));
printf("\nthelengthofthequeueis%d\n",queuelength_sq(&q));
printf("inputthe**mberofthedatastoout:");
scanf("%d",&m);
for(i=0;i<m;i++)
{
printf("outputthefirstdatainthequeue:");
dequeue_sq(&q,&e);
printf("%c\n",e);
}
printf("tr**ersethequeuenow:");
queuetr**erse_sq(q,(*visit));
printf("\nthelengthofthequeueis%d\n",queuelength_sq(&q));
getchar();getchar();//暂停一下
}