2011-09-11 2 views
0

Только что началось с создания связанного списка в C. Получение ошибки времени выполнения в коде для returnLastNode. Откуда мне знать? Хорошо работает, когда он закомментирован.Задача (ы) со связанным списком

Вопрос №1 Что я делаю неправильно?

Код для моей returnLastNode функции

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 с используемым.

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 и всего return n; в части if (n->next == NULL). Так лучше вариант кода может выглядеть следующим образом:

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' только тогда, когда связанный список не пуст). Но даже если я проверил на наличие пустых списков, я забыл инициализировать узел для 'first' и поэтому работал в 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; 
} 

Было бы лучше. Что касается отладки, это просто практика.

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 anyway :)

Смежные вопросы