Вы никогда не проверяете, является ли 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) поставляются со встроенными отладчиками).