我需要生成一个填充随机数的数组,然后将数组成员从最后到第一个添加到队列中。我使用函数 dodajURed()
将单个数字添加到队列中,并使用 poljeURed()
将数组成员添加到队列中。
由于标签不是英文,因此这里有一个快速引用指南:
cvor = 节点
红色=队列
ulaz = 前面
izlaz = 后部
新=新
在主程序中,我用随机生成的数字填充数组,打印数组,然后调用 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);
}
}
最佳答案
问题不在于递归函数。通过一些快速调试测试(printf),我发现问题出在这一行:
else(red->ulaz)->sljed = novi;
问题是您试图访问填充有 NULL 的“ulaz”字段(在 init_red 中)。 因此,您需要检查 'ulaz' 是否为 NULL:
if((red->ulaz)!=NULL)
(red->ulaz)->sljed = novi;
或者您缺少插入“ulaz”的值。
如果您需要其他东西,请询问。
关于c - 为什么程序在递归地从数组添加到队列时崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44259871/