2012-10-19 28 views
1

這裏是我的代碼:段錯誤在我的鏈接列表實現

#include <stdio.h> 

typedef struct node_struct { 
    int data; 
    struct node_struct *next; 
} node; 

void push(node *top, int data) { 
    node *new_node = (node*) malloc(sizeof(node)); 
    new_node->data = data; 
    new_node->next = top; 
    top = new_node; 
} 

int main() { 
    node *top = (node*) malloc(sizeof(node)); 
    top->data = 1; 
    printf("Set data of top node to: %d\n", top->data); 

    push(top, 2); 
    printf("Pushed 2 to top, top->next->data = %d\n", top->next->data); 
} 

在第三屆最後一行(push(top, 2);)程序段錯誤,我想就行了top = new_node;

我剛學C(指針馬上)。

我做錯了什麼?

+0

在附註中,您沒有初始化頂端節點的'next'元素(分配後)。將它設置爲NULL以知道它是你列表的最後一個元素(因爲你的push函數將元素放在列表的頂部) – Zoneur

回答

5

這裏的問題是,您將指針傳遞給top元素,然後嘗試在函數內部設置指針,但它只是一個局部變量,並且對它的更改將不可見功能。

通過引用傳遞top指針代替,通過使用指針的指針:

void push(node **top, int data) { 
    node *new_node = malloc(sizeof(node)); 
    new_node->data = data; 
    new_node->next = *top; 
    *top = new_node; 
} 

... 

push(&top, 2); 

一種替代方法是從函數代替返回新的頂部:

node *push(node *top, int data) { 
    node *new_node = malloc(sizeof(node)); 
    new_node->data = data; 
    new_node->next = top; 
    return new_node; 
} 

... 

top = push(top, 2); 
+0

啊,謝謝! – user1527166

1

指針按值傳遞給push。因此,您對top所做的更改未反映在main中。如果你想改變top然後傳遞指針的地址:

#include <stdio.h> 

typedef struct node_struct { 
    int data; 
    struct node_struct *next; 
} node; 

void push(node **top, int data) { 
    node *new_node = (node*) malloc(sizeof(node)); 
    new_node->data = data; 
    new_node->next = *top; 
    *top = new_node; 
} 

int main() { 
    node *top = (node*) malloc(sizeof(node)); 
    top->data = 1; 
    printf("Set data of top node to: %d\n", top->data); 

    push(&top, 2); 
    printf("Pushed 2 to top, top->next->data = %d\n", top->next->data); 
} 

下面是相關C-FAQ