我需要生成一个填充了随机数的数组,然后将数组成员从最后一个添加到队列。我使用函数dodajURed()
将单个数字添加到队列中,并使用poljeURed()
将数组成员添加到队列中。
由于标签不是英文版,因此这里有一个快速参考指南:
cvor = node
red = queue
ulaz = front
izlaz =后方
novi = new
在主程序中,我用随机生成的数字填充数组,打印数组然后调用poljeURed()
函数。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
typedef struct cvor {
int element;
struct cvor *sljed;
} cvor;
typedef struct {
cvor *ulaz, *izlaz;
} Red;
void init_red(Red *red) {
red->ulaz = NULL;
red->izlaz = NULL;
}
int dodajURed(double broj, Red *red) {
cvor *novi;
if (!(novi=malloc(sizeof(cvor)))) return 0;
novi->element = broj;
if (!(red->izlaz)) red->izlaz = novi;
else (red->ulaz)->sljed = novi;
novi = red->ulaz;
return 1;
}
int poljeURed(int polje[], int n, Red *red) {
if (n<=0) return 1;
if (!(dodajURed(polje[n-1], red))) return 0;
else {
printf("Dodan u red: %d\n", polje[n-1]);
return poljeURed(polje, n-1, red);
}
}
int main(void) {
int i, polje[10];
int broj;
Red red;
srand((unsigned)time(NULL));
init_red(&red);
for(i=0; i<10; i++) {
broj = rand() % 11;
polje[i]=broj;
}
printf("Polje: ");
for(i=0; i<10; i++) {
printf("%d ", polje[i]);
}
printf("\n");
if (poljeURed(polje, 10, &red)) printf("Dodavanje uspjesno");
else printf("Dodavanje prekinuto");
return 0;
}
现在,程序使用随机数成功填充数组并调用poljeURed()
。第一次调用成功,我将数组的最后一个成员添加到队列中。但是程序只是在第二次调用(递归)时崩溃了。我怀疑我的递归出了问题,但是我不能指出究竟是什么问题。该程序与cmd中的GCC很好地编译。
int poljeURed(int polje[], int n, Red *red) {
if (n<=0) return 1;
if (!(dodajURed(polje[n-1], red))) return 0;
else {
printf("Dodan u red: %d\n", polje[n-1]);
return poljeURed(polje, n-1, red);
}
}
答案 0 :(得分:1)
问题不在于递归函数。通过一些快速调试测试(printf),我发现问题在于这一行:
else(red->ulaz)->sljed = novi;
问题是你试图访问填充了NULL的'ulaz'字段(在init_red中)。 所以你需要检查'ulaz'是否为NULL:
if((red->ulaz)!=NULL)
(red->ulaz)->sljed = novi;
或者您缺少插入'ulaz'的值。
如果您还需要别的东西,请询问。
答案 1 :(得分:0)
对于初学者来说,永远不要将英语单词与在程序中用作标识符的母语单词混合。这使得代码完全不清楚。仅使用英文单词作为标识符。
函数dodajURed
错误。
指针sljed
指向的已分配对象的数据成员novi
未设置为NULL。
所以你必须添加以下语句
int dodajURed(double broj, Red *red) {
cvor *novi;
if (!(novi=malloc(sizeof(cvor)))) return 0;
novi->element = broj;
novi->sljed = NULL;
//...
如果队列为空,则需要设置数据成员izlaz
和ulaz
,以便两者都指向新分配的对象。
此声明
novi = red->ulaz;
没有意义。
考虑到数据成员element
的类型为int
,但您尝试添加double
类型的队列值。
结果该功能看起来像
int dodajURed( int broj, Red *red )
{
cvor *novi;
if (!(novi=malloc(sizeof(cvor)))) return 0;
novi->element = broj;
novi->sljed = NULL;
if ( !red->izlaz )
{
red->izlaz = red->ulaz = novi;
}
else
{
red->ulaz = red->ulaz->sljed = novi;
}
return 1;
}