【问题标题】:Linked list implementation segmentation fault链表实现分段错误
【发布时间】:2015-03-18 18:18:19
【问题描述】:

我已经完成了链接列表的基本实现,但它在取消注释注释行时给出了分段错误,否则它工作正常。 我无法理解为什么它会给出错误。 请给我一些帮助

void insert(Node **head, Symbol sym) {
    Node *temp, *p = *head;;
    Symbol a = sym;
    temp = (Node *)malloc(sizeof(Node));
    temp->value = a;
    temp->next = NULL;

    if (p == NULL)
        *head = temp;
    else {
        while (p->next != NULL)
            p = p->next;
        p->next = temp;
    }
}

void printList(Node *head) {
    Node *p = head;
    if(p == NULL) return;
    while (p != NULL) {
        printf("%d ", p->value);
        p = p->next;
    }
    printf("\n");
}
int main() {
    Node *List, *list2;
    insert(&List, 0);
    insert(&List, 1);

    //insert(&list2, 2);
    //insert(&list2, 3);

    printList(List);
    return 0;
}

【问题讨论】:

  • 请使用gdb 之类的调试器并单步执行。
  • Node *List=NULL, *list2=NULL;
  • 除了个人开发或应用程序,每个节点的额外字节数和每个函数的处理步骤需要保持在低水平。人们是否应该不使用 GObject 库中的 GList 或类似的东西

标签: c pointers linked-list


【解决方案1】:

你没有初始化指向节点的初始指针

Node *List, *list2;

Node *List = NULL, *list2 = NULL;

考虑到变量list2 没有在您展示的程序中使用。

函数insert的另一种写法如下

void insert( Node **head, Symbol sym ) 
{
    Node *temp = malloc( sizeof( Node ) );

    if ( temp != NULL )
    {
        temp->value = sym;
        temp->next  = NULL;

        while ( *head ) head = &( *head )->next;
        *head = temp;
    }
}

【讨论】:

  • @Paul Ogilvie 这是否意味着我可能不会给出自己的答案?:)
  • 如果您引用 Bluepix 来为他提供解决方案的功劳,那就太好了。
  • @Paul Ogilvie 哦,对不起。当我写我的帖子时,我还没有看到 cmets。:)
猜你喜欢
  • 2012-06-10
  • 1970-01-01
  • 2020-01-26
  • 1970-01-01
  • 2013-10-05
  • 2020-09-30
  • 2013-10-05
  • 2021-01-17
  • 1970-01-01
相关资源
最近更新 更多