2015-12-20 118 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