我的程序将给定的前n个斐波那契数列中的奇数和偶数分别保存在链接列表中。它在C中。

分配头节点时,出现运行时错误,已停止响应。我找不到问题所在。甚至可能是我不确定的其他事情。

提前致谢

struct odd{
       int value;
       struct odd * next;
};

struct even{
       int value;
       struct even * next;
};

struct list{

       struct odd * oHead;
       struct odd * oCurrent;

       struct even * eHead;
       struct even * eCurrent;
};

typedef struct list * List;

void init(int i, List fib){ // allocates the linked list according to first i numbers of the Fibonacci sequence

     int evenCount;
     int oddCount;
     int j;

     /*Calculates the count of even and odd numbers */

     for( j = 0 ; j < evenCount ; j++){
           if(j == 0){
                    **fib->eHead->next = (struct even*)malloc(sizeof(struct even));**
                    fib->eCurrent = fib->eHead->next;
           }
           else{
                fib->eCurrent->next = (struct even*)malloc(sizeof(struct even));
                fib->eCurrent = fib->eCurrent->next;
           }
     }
     for( j = 0 ; j < oddCount ; j++){
           if(j == 0){
                    **fib->oHead->next = (struct odd*)malloc(sizeof(struct odd));**
                    fib->oCurrent = fib->oHead->next;

           }
           else{
               fib->oCurrent->next = (struct odd*)malloc(sizeof(struct odd));
               fib->oCurrent = fib->oCurrent->next;
           }
     }
}

main(){
   List fib
   init(15,fib);
}

最佳答案

我不知道为什么您没有设置evenCountoddCount,但是如果它们大于0,则此行

fib->eHead


正在取消引用NULL的指针。以下行未初始化

List fib;


那是对尚未初始化的List对象的指针的声明。如果您的typedef是...

typedef struct list List;


它将在堆栈上初始化一个空结构,但这不是您要执行的操作。如果您确实更改了类型声明,则仍在此使用指针

struct list{
       struct odd * oHead;
       struct odd * oCurrent;
       struct even * eHead;
       struct even * eCurrent;
};


因此存在相同的问题,在分配它们之前,您不能取消引用它们中的任何一个。

关于evenCountoddCount,您应该在函数中显式设置它们,否则您将具有未定义的行为。


  如果具有自动存储期限的对象未显式初始化,则其值不确定。
  
  如果具有静态存储持续时间的对象未初始化
  明确地,然后:
  
  如果具有指针类型,则将其初始化为空指针;如果有
  算术类型,它初始化为(正数或无符号)零;如果
  它是一个聚合,每个成员都被初始化(递归)
  根据这些规则;如果是成员,则第一个命名成员是
  根据这些规则初始化(递归)。

关于c - 链表斐波那契序列运行时错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36991219/

10-11 21:13