c - 为什么程序在递归地从数组添加到队列时崩溃?

标签 c arrays recursion queue

我需要生成一个填充随机数的数组,然后将数组成员从最后到第一个添加到队列中。我使用函数 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/

相关文章:

c - 二叉搜索树输出文件不是预期的输出数据

python - 分辨率列表(OpenCv、Python、相机)

python - 如何获取特定标签之前/之前的 n 个索引号?

java - 如何计算和级数 1+1/2...+1/n

c - 此实现中是否 promise 缓存失效

c - 带 fork 的管道和子创建

java - 将静态值分配给数组中前 10 个位置的更快方法

algorithm - 为什么计算斐波那契数列的复杂度是 2^n 而不是 n^2?

recursion - 在Racket博士中,如何编写Tetration函数

c - 为什么 fopen ("/dev/null", "w") 在 AIX 上返回标准文件描述符?