2012-02-09 87 views
-1

我需要在我的程序中创建一个链表。在我的程序中,列表被分配在malloc()的堆上,比我试图访问它,但我得到了一个segmetation错误;分配链表后分段错误

编辑:我得到SIGSEGV在这条线 “而((节点 - >节点类型== TYPE_END_LIST)!){”

struct dagNode *createList(int k); 
    struct dagNode *newNodeXInterval(int type, int val); 


    struct dagNode *createList(int k){ 
    struct dagNode *head, *node; 
    printf("\nList %d = ", k); 
    head = newNodeXInterval(TYPE_EDGE_OR_GAP, getVal(k,1)); 
    node = head; 
    int i; 
    for (i=1; i<LENGTH_OF(k); i++){ 
      node->next = newNodeXInterval(TYPE_XTEST, getRightPointOf(k,i)); 
      node = node->next; 
      node->next = newNodeXInterval(TYPE_EDGE_OR_GAP, getVal(k,i+1)); 
      node = node->next; 
      }  
    node = newNodeXInterval(TYPE_END_LIST, 0); 
    node = head;  // i think that here there is the error 
    printf("%d", node->val); i=0; 
        while(!(node->nodeType == TYPE_END_LIST)){ 
         printf("%d ", i); 
         node = node->next;} 
    return head;} 


    struct dagNode *newNodeXInterval(int type, int val){ 
     struct dagNode *node = (struct dagNode *) malloc(sizeof(struct dagNode)); 
     if (type == TYPE_EDGE_OR_GAP){ 
     *node = (struct dagNode) {(val<0)? TYPE_GAP:TYPE_EDGE, val, NULL, NULL, NULL}; 
     } 
     else{ 
     *node = (struct dagNode) {type, val, NULL, NULL, NULL}; 
     } 
     return node; } 

主叫功能将获得列表的头部。

+0

请缩小这个范围 - 在哪条线上出现分段故障? – 2012-02-09 14:31:08

+0

如果你有一个SEGV,大概你可以得到一个核心并且看到_exactly_它死了的地方? – Useless 2012-02-09 14:31:36

回答

1

据我所知道的,问题是与线

node = newNodeXInterval(TYPE_END_LIST, 0); 

的assignement之前,node指向最后一个节点在你的链表,而前一个节点都有next指针等于node 。分配后,node指向新创建的类型为TYPE_END_LIST的节点,但前一个节点的指针保持不变(即仍保留原始值node)。换句话说,您新创建的节点不是列表的一部分,因此以下while()循环中的条件node->nodeType == TYPE_END_LIST永远不会计为true,并且您在结束时会最终取消引用空指针名单。改行

node->next = newNodeXInterval(TYPE_END_LIST,0);  

应该解决这个问题。