2015-12-20 161 views
0

我在添加到動態鏈接列表時遇到了一些問題。基本上,我的第一個節點似乎被覆蓋。下面是代碼:添加到鏈接列表中C

struct palNode { 
    int number; 
    int pointer_index; 
    char* solving_array; 
    int solved; 
    struct palNode* next; 
} 

,這裏是我的加入方法:

struct palNode* add_palNode_from_keyboard(struct palNode* head, int num, int pos){ 
    struct palNode* newnode = (struct palNode*) malloc(1 * sizeof(struct palNode)); 

    struct palNode* current_node = head; 

    if (current_node == NULL) 
    { 
     head = newnode; 
    } 
    else 
    { 
     while ((*current_node).next != NULL) 
     { 
      current_node = (*current_node).next; 
     } 
     (*current_node).next = newnode; 
    } 

    (*newnode).number = num; 
    (*newnode).pointer_index = pos; 

    (*newnode).next = NULL; 

    printf("Operation completed\n"); 

    return newnode; 
} 

這裏是我的問題:什麼是我做錯了什麼?有沒有更正確的做法?我見過其他類似的問題,但我還是不明白他們

+2

[請參閱爲什麼不投的malloc'的返回值這個討論()'和'C'中的家庭。](http://stackoverflow.com/q/605845/2173917)。 –

+0

另外,'1 * sizeof(struct palNode)'確實是不必要的。請注意,您也可以寫* sin(x)^ 2 + cos(x)^ 2 *或* exp(0)*,但僅僅因爲您可以這並不意味着您必須這樣做。 ''(* newnode).number'你不需要解除'newnode',只需'newnode-> number'就可以了。 –

+0

'回報newnode;' - >'返回頭;',在callerside'頭= add_palNode_from_keyboard(...' – BLUEPIXY

回答

1

如果列表最初是空的,你設置head到新節點,但是指針head按值傳遞所以改變它不會在調用出現功能。

您需要在頭指針的地址通過和修改,這樣的變化出現在函數外:

struct palNode* add_palNode_from_keyboard(struct palNode** head, int num, int pos){ 
    // no cast needed here, and no need to multiply by 1 
    struct palNode* newnode = malloc(sizeof(struct palNode)); 

    struct palNode* current_node = *head; 

    if (current_node == NULL) 
    { 
     *head = newnode; 
    } 
    ... 
+0

感謝您對malloc的提示的事情是,我不能修改的功能: '結構palNode * add_palNode_from_keyboard(結構palNode **頭,INT NUM,INT POS)' 同樣,當IM返回它就像沒有連接當我添加多個節點/?任何想法例如,它後返回第一個節點,但一無所獲。 – Username

+0

@Username你可能需要提供更多的代碼,你要返回新的節點,那當然是最後一個節點,你不知道如何在調用函數中保留頭節點。不能像推薦的那樣改變函數簽名,你需要一些討厭的代碼,比如'newnode = add_palNode_from_keyboard(head,num,pos); if(head == NULL)head = newnode;'。 – Persixty