Проблема (и) со связанным списком - PullRequest
0 голосов
/ 11 сентября 2011

Только что начал с создания Связанного списка в 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 Как новичку следует отлаживать ошибки времени выполнения?

Также приветствуются любые другие предложения.:)

Ответы [ 4 ]

2 голосов
/ 11 сентября 2011

Вы никогда не проверяете, является ли n значением NULL, перед разыменованием его. Это означает, что ваш код будет зависать при использовании в пустом списке. Также вы можете избавиться от переменной 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) поставляются со встроенными отладчиками).

2 голосов
/ 11 сентября 2011
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 голос
/ 11 сентября 2011
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;
}

Было бы намного лучше ... Способность отладки - это то, что вы приобретаете со временем, единственный способ повысить ее - это сесть рядом с кем-то, кто знает, что лучше отлаживать, чем вы, и учиться у него, хороший способ, возможно, лучше еще медленнее просто отлаживать как сумасшедший и пытаться выздороветь самостоятельно. удачи в любом случае:)

0 голосов
/ 11 сентября 2011

Gdb и Valgrind довольно хороши для отладки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...