C语言 关于数据结构队列的问题 高分悬赏 各位高手请慢慢看

先给出头文件
#include<stdio.h>
#define queuesize 40
typedef struct squeue
{
int queue[queuesize];
int front,tear;
}seqqueue;
void initqueue(seqqueue *s)
{
s->front=s->tear=0;
}
int queueempty(seqqueue s)
{
if(s.front==s.tear)
return 1;
else
return 0;
}
int enterqueue(seqqueue *s,int x)
{
if(s->tear==queuesize)
return 0;
s->queue[s->tear];
s->tear=s->tear+1;
return 1;
}
int deletequeue(seqqueue *s,int *e)
{
if(s->front==s->tear)
return 0;
else
{
*e=s->queue[s->front];
s->front=s->front+1;
return 1;
}
}
int gethead(seqqueue *s,int *e)
{
if(s->front==s->tear)
return 0;
else
{
*e=s->queue[s->front];
return 1;
}
}
int numqueue(seqqueue *l,int e)
{
e=l->tear-l->front;
return e;
}

然后是程序代码
#include<stdio.h>
#include"seqqueue.h"
#include<stdlib.h>
void main()
{
int n,i,j,k=0,*e=NULL,*f=NULL,o=0,*p=NULL;
seqqueue *l;
l=(seqqueue *)malloc(sizeof(seqqueue));
printf("请输入杨辉三角的行数:");
scanf("%d",&n);
printf("你输出的行数为:%d \n",n);
initqueue(l);
enterqueue(l,1);
printf("%d\n",l->queue[l->front]);
for(i=0;i<n;i++)
{

for(j=0;j<k;j++)
{
deletequeue(l,e);
if(gethead(l,f)==0);
*f=0;
*e=*e+*f;
enterqueue(l,*e);
}
k++;
enterqueue(l,1);
p=&l->queue[l->front];
for(i=0;i<l->tear;i++,p++)
printf("%d ",*p);
printf("\n");
}
}
编写此程序的目的是为了写出杨辉三角,但是不要求每行的排列问题。。同学看看 为毛编译过了,就是运行不了啊 我改来改去3个小时了。。。实在无奈求解
不要拿书上的方法来,我要用我自己的思维解答,同学们就在我这个程序的基础上修改下把

就几个明显的错误提一下
1. 函数 enterqueue中
s->queue[s->tear];
这句没有实际操作,估计应该是 s->queue[s->tear] = x; 用于在队列最后添加一个新的元素

2. 主函数中,大约21行左右
for(j=0;j<k;j++)
{
deletequeue(l,e);
if(gethead(l,f)==0) // 这里多了一个分号,导致判断后没有任何动作可之心,删之
*f=0;
*e=*e+*f;
enterqueue(l,*e);
}

3. 主函数大约30行左右,打印输出
for(j=0;j<l->tear;j++,p++) // 这里不可用i作循环变量,否则干扰外循环i
printf("%d ",*p);

4. deletequeue(l,e);
if(gethead(l,f)==0) // 多了分号
*f=0;
*e=*e+*f;
从语句目的看,是希望从deletequeue和gethead函数中,得到e或者f的地址,但是 1)由于传递的是指针的值,所以即使函数中修改了,主函数中无法得到新的地址;2)这两个函数体中,并没有设置地址的代码,总之,e 和 f 是没有可操作地址的

5. 最重要一点,没有看懂解题思路是什么。
即使按照删一个节点,再添两个节点的想法,也应该从队列的后面开始,这样间隔相加,并放在后移一个位置上,不至于影响后续计算。而这段程序从前开始修改队列,那新的节点产生,不就干扰后面的计算了?

所以,建议先说明一下解题思路,这样便于解决程序中的各种问题。
温馨提示:内容为网友见解,仅供参考
第1个回答  2012-08-21
我经过编译和调试,发现有些地方,可能存在BUG,但没有理解楼主的思路,不敢贸然改动,只用★标注在下面:
#include<stdio.h>
#define queuesize 40
typedef struct squeue
{
int queue[queuesize];
int front,tear;
}seqqueue;
void initqueue(seqqueue *s)
{
s->front=s->tear=0;
}
int queueempty(seqqueue s)
{
if(s.front==s.tear)
return 1;
else
return 0;
}
int enterqueue(seqqueue *s,int x)//★x在这个函数中没有用到!
{
if(s->tear==queuesize)
return 0;
s->queue[s->tear];//★这是一条空语句,没有任何意义,是不是丢了“=x“??
s->tear=s->tear+1;
return 1;
}
int deletequeue(seqqueue *s,int *e)
{
if(s->front==s->tear)
return 0;
else
{
*e=s->queue[s->front];
s->front=s->front+1;
return 1;
}
}
int gethead(seqqueue *s,int *e)
{
if(s->front==s->tear)
return 0;
else
{
*e=s->queue[s->front];
return 1;
}
}
int numqueue(seqqueue *l,int e)
{
e=l->tear-l->front;
return e;
}

然后是程序代码
#include<stdio.h>
#include"seqqueue.h"
#include<stdlib.h>
void main()
{
int n,i,j,k=0,*e=NULL,*f=NULL,o=0,*p=NULL;
seqqueue *l;
l=(seqqueue *)malloc(sizeof(seqqueue));
printf("请输入杨辉三角的行数:");
scanf("%d",&n);
printf("你输出的行数为:%d \n",n);
initqueue(l);
enterqueue(l,1);
printf("%d\n",l->queue[l->front]);
for(i=0;i<n;i++)
{

for(j=0;j<k;j++)
{
deletequeue(l,e);//★e第一次使用时,还没有指向任何值,只是NULL,必定出错。
if(gethead(l,f)==0);//★f第一次使用时,还没有指向任何值,只是NULL,必定出错。
*f=0;
*e=*e+*f;
enterqueue(l,*e);
}
k++;
enterqueue(l,1);
p=&l->queue[l->front];
for(i=0;i<l->tear;i++,p++)
printf("%d ",*p);
printf("\n");
}
}

楼主辛苦啦。
第2个回答  2012-08-21
首先,要肯定同学你有自己的思维。并且把它写成了一个c程序
但是。1.一套 i,j,k,o,p 害我都想骂 **%@#¥&…………*¥
2.能空一下行,逻辑之间缩进一个吗
3.混沌的代码是否要注释
4.你不是一个合格的内存管理者。请先不要乱用指针。
5.解决一个问题。越简单的方法越奏效。(显然你想练习一下结构体和指针吧。)
第3个回答  2012-08-21
说实话,楼主的编程习惯让我很不爽。第一个问题是因为空指针,第一次循环就崩掉了,而且几乎所有的指针都有空指针的问题,并且空指针不是唯一的问题。还有你的逻辑太复杂,我承认我看不懂了……这个程序按照一般的逻辑(不是书上的,我自己想的)根本用不到那么多变量。建议楼主先整理一下思路。截图传不上去,第一次循环时deletequeue函数出错了,第二个参数时NULL。
第4个回答  2012-08-21
程序有点多,一时看不完,不过经过调试,发现deletequeue(l,e);这里第一次运行的时候,e没有赋值。
第5个回答  2012-08-21
数据没入队列。

Warning: Invalid argument supplied for foreach() in /www/wwwroot/aolonic.com/skin/templets/default/contents.html on line 45
相似回答
大家正在搜