带有链接列表的问题

时间:2011-09-11 13:39:45

标签: c linked-list

刚开始在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 个答案:

答案 0 :(得分: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 :(得分:2)

在解除引用之前,您永远不会检查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 :(得分: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无论如何:)

答案 3 :(得分:0)

Gdb和Valgrind非常适合调试