2012-02-09 2 views
-1

프로그램에서 링크 된 목록을 만들어야합니다. 내 프로그램에서 malloc()을 사용하여 힙에 목록이 할당되었지만 방문하려고 시도했지만 segmetation 오류가 발생합니다.링크 된 목록을 할당 한 후 세그먼테이션 오류가 발생했습니다.

편집 : 나는이 줄에서 SIGSEGV를 얻을 "동안 (! (노드 ->의 nodeType == 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

범위를 좁혀주세요 - 어떤 줄에서 세그먼트 오류가 발생합니까? –

+0

SEGV가있는 경우 코어가 생겨서 어디에서 죽었는지 알 수 있습니까? – Useless

답변

1

지금까지 내가 말할 수있는 문제는 라인 연결된 목록에서 assignement 전에

node = newNodeXInterval(TYPE_END_LIST, 0); 

, 마지막 노드에 node 점을 함께하고, 이전 노드는 node 동일의 next 포인터를 가지고 . 할당 후, node은 유형이 TYPE_END_LIST 인 새로 생성 된 노드를 가리키고 있지만 이전 노드는 next 포인터가 변경되지 않았습니다 (즉 원래 값은 node입니다). 즉, 새로 생성 된 노드가 목록의 일부가 아니므로 다음 node->nodeType == TYPE_END_LIST의 루프가 true로 평가되지 않으며 결국 null 포인터의 역 참조가 끝납니다. 명부. 회선을

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

으로 변경하십시오.

관련 문제