2011-09-11 6 views
0

C에서 링크 된 목록을 생성하기 시작했습니다. returnLastNode의 코드에서 런타임 오류가 발생했습니다. 내가 어떻게 알아? 댓글을 달았을 때 잘 돌아갑니다.링크 된 목록의 문제점

질문 1 내가 뭘 잘못하고 있니? 내 returnLastNode 기능

코드 사용 struct의의

struct Node* returnLastNode(struct LinkedList *ll) { 
    struct Node *n = ll->first; 
    struct Node *result; 
    while(1) { 
     if(n->next == NULL) { 
      result = n; 
      break; 
     } else { 
      n = n->next; 
     } 
    } 
    return result; 
} 

정의.

struct Node { 
    int val; 
    struct Node *next; 
}; 

struct LinkedList { 
    struct Node *first; 
}; 

LinkedList.h 여기, 필요한 경우/관심이있는 경우.

https://github.com/MoonStruckHorrors/LinkedListC/blob/master/LinkedList.h

초보자가 런타임 오류를 디버깅하는 방법을 질문 # 2?

또한 다른 의견도 환영합니다. :)

답변

2

역 참조하기 전에 nNULL인지 확인하지 마십시오. 즉 빈 목록에 사용하면 코드가 충돌합니다. 또한 변수 result을 제거하고 if (n->next == NULL) 부분의 return n; 만 제거 할 수 있습니다. 그래서 코드의 더 나은 버전은 다음과 같습니다

struct Node* returnLastNode(struct LinkedList *ll) { 
    struct Node *n = ll->first; 

    // checking if n is NULL here 
    while(n) { 
     if(n->next == NULL) 
      return n; 

     n = n->next; 
    } 

    return NULL; // n was NULL immediately so there is no end node 
} 

런타임 오류를 디버깅에 관해서는, 당신은 데이터를 간단한 일들이 무엇인지 확인하기 위해 printf을 사용할 수 있으며, 더 복잡한 것들에 대한 당신이 gdb 같은 디버거를 사용할 수 있습니다 (또는 때때로 IDE (예 : Visual Studio)에는 통합 디버거가 제공됨).

+1

팁 주셔서 감사합니다. 내 삽입 함수 (링크 된 목록이 비어 있지 않은 경우에만'returnLastNode' 사용)에서 빈 목록을 확인했습니다. 하지만 거기서 빈 목록을 검사했지만, '첫 번째'노드를 초기화하는 것을 잊어 버렸기 때문에 NULL에서 작동합니다. – MoonStruckHorrors

2
struct Node* returnLastNode(struct LinkedList *ll) { 
    struct Node *n = ll->first; 
    struct Node *result = n; 
    while(n != NULL) 
    { 
     result = n; 
     n = n -> next; 
    } 
    return result; 
} 

더 좋을 것입니다. 디버깅은 단지 연습에 불과합니다.

0

GDB와 Valgrind의에 의해 그것을

1
typedef struct Node_t { 
    int val; 
    struct Node *next; 
}Node; 

typedef struct LinkedList_t { 
    struct Node *first; 
}LinkedList; 

전화를 디버깅 꽤 멋진 :

 returnLastNode(SomeLinkedList.first); 

Node* returnLastNode(Node *p) { 
    while (p && p->next) p=p->next; 
    return p; 
} 

이 방법이 더 좋을 것이다 ... 능력을 디버깅하면 시간을 얻을 뭔가 할 수있는 유일한 방법입니다 부스트는 당신이 더 잘 디버깅 할 줄 아는 사람 옆에 앉아서 좋은 방법으로 더 좋은 방법은 아마도 더 좋은 방법은 더 미친 듯이 디버깅하고 스스로 더 나아 지려고 시도하는 것입니다. 어쨌든 goodluck :)

관련 문제