链表不通过函数修改(C编程)

链表不通过函数修改(C编程),c,linked-list,C,Linked List,我有以下代码: #include <stdio.h> #include <stdlib.h> struct node { int value; struct node* next; }; typedef struct node Sequence; Sequence* init() { Sequence* s = NULL; return s; } void insertFirstElement(Sequence* s, int

我有以下代码:

#include <stdio.h>
#include <stdlib.h>


struct node {
    int value;
    struct node* next;
};

typedef struct node Sequence;


Sequence* init() {

    Sequence* s = NULL;
    return s;
}

void insertFirstElement(Sequence* s, int e) {

    if (s == NULL) {

        s = (Sequence*)malloc(sizeof(Sequence));
        s->value = e;
        s->next = NULL;
        return;
    }
}


int main(int argc, const char * argv[]) {

    Sequence* s = NULL;
    s = (Sequence*)malloc(sizeof(Sequence));
    s->value = 5;
    s->next = NULL;

    if (s == NULL) {

        printf("Doesn't work!\n");
    }
    else {

        printf("It works!\n");
    }

    Sequence* s2 = init();
    insertFirstElement(s2, 5);

    if (s2 == NULL) {

        printf("Doesn't work!\n");
    }
    else {

        printf("It works!\n");
    }

    return 0;
}
所以我不明白为什么我不能通过'insertFirstElement'函数修改我的链表。为什么函数调用后不更新“序列”?为什么它仍然是空的?有人能帮我吗

提前感谢。

在线

s = (Sequence*)malloc(sizeof(Sequence));

用新序列替换给定的序列。接收指向序列的地址,然后用指向新序列的新地址替换该地址。您需要更改s所指向的序列,而不更改s所指向的位置,以便以一种将反映在函数外部的方式修改序列。

您可以在
insertFirstElement
函数中按值传递指针。从函数返回后,指针的地址保持不变。您需要将指针传递给指针,这样

void insertFirstElement(Sequence** s, int e) {

    if (*s == NULL) {

        *s = (Sequence*)malloc(sizeof(Sequence));
        (*s)->value = e;
        (*s)->next = NULL;
        return;
    }
}
相应地,调用函数,
insertFirstElement(s2,5)修改为

insertFirstElement(&s2,5)

在函数void insertFirstElement(序列*s,int e)

由于linkedlist将被修改,因此请使用“按引用调用”(您使用的是“按值调用”方法)


请尝试使用void insertFirstElement(序列**s,int e)

,因为在
insertFirstElement
中,您的
s
在本地被修改,就是这样,分配不会被传回。你有一个内存泄漏(你正在malloc'ing,然后再也没有释放它)函数修改变量的一个副本,该副本在函数退出时被遗忘。请所有从标题中知道问题所在的人举手:)我认为使用动态初始化直接修改参数,而且是一个指针。
void insertFirstElement(Sequence** s, int e) {

    if (*s == NULL) {

        *s = (Sequence*)malloc(sizeof(Sequence));
        (*s)->value = e;
        (*s)->next = NULL;
        return;
    }
}