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

时间:2017-05-30 10:35:52

标签: c arrays recursion queue

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

2 个答案:

答案 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;
    //...

如果队列为空,则需要设置数据成员izlazulaz,以便两者都指向新分配的对象。

此声明

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;
}