关于#c语言#的问题,如何解决?

有没有人帮我看看问题出在哪啊,在链表初始化的时候把头结点的next赋值为NULL之后,出了方法体就变成别的地址了,同样的我插入一条数据进去也会变成别的数据


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

typedef struct linkList {    //定义单链表节点类型
    int num;    //每个节点存放一个数据
    struct linkList* next;    //指针指向下一个节点
}linkList;

int InitList(linkList* L) {    //初始化链表    
    //L=NULL;    //不带头结点的初始化
    //头结点初始化:
    L = (linkList*)malloc(sizeof(linkList));//分配一个头结点
    if (L == NULL) {    //内存不足,分配失败
        return 0;
    }
    L->next = NULL;    //头结点之后暂时没有节点
    return 1;
}


void headInsert(linkList* L, int num) {    //在头部插入数据
    linkList* n = (linkList*)malloc(sizeof(linkList));
    n->num = num;
    n->next = L->next;
    L->next = &n;
}

void printList(linkList* L) {
    //int j = 0;    //现在指针指向的位置
    L++;
    while (L->next != NULL)
    {
        printf("%d\n", L->num);
        L++;
    }
}

int main() {
    linkList L;    //声明一个指向链表的指针
    if (InitList(&L)) {//初始化一个空表
        printf("链表初始化成功\n");
    }
    else {
        printf("链表初始化失败\n");
    }


    headInsert(&L, 5);//插入数据
    printList(&L);
    return 0;
}

基于new bing修改参考:
这个问题的原因是在 InitList() 函数中,你使用指针修改了头结点的地址,但在 main() 函数中没有使用指向头结点的指针来操作链表。也就是说,在 InitList() 函数中,L 是指向头结点的指针,而在 main() 函数中,L 是链表的头部,两者并不是同一个变量。

你可以修改代码,在 InitList() 函数中返回指向头结点的指针,然后在 main() 函数中使用这个指针来操作链表。以下是修改后的代码:

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

typedef struct linkList {
    int num;
    struct linkList* next;
}linkList;

linkList* InitList() {
    linkList* L = (linkList*)malloc(sizeof(linkList));
    if (L == NULL) {
        printf("内存分配失败\n");
        return NULL;
    }
    L->next = NULL;
    return L;
}

void headInsert(linkList* L, int num) {
    linkList* n = (linkList*)malloc(sizeof(linkList));
    n->num = num;
    n->next = L->next;
    L->next = n;
}

void printList(linkList* L) {
    linkList* p = L->next;
    while (p != NULL)
    {
        printf("%d\n", p->num);
        p = p->next;
    }
}

int main() {
    linkList* L = InitList();
    if (L != NULL) {
        printf("链表初始化成功\n");
    }
    else {
        printf("链表初始化失败\n");
        return 0;
    }

    headInsert(L, 5);
    printList(L);

    return 0;
}


在上述代码中,修改了 InitList() 函数的返回值为指向头结点的指针。在 main() 函数中创建一个指向头结点的指针 L,并将其传递给其他函数。这样,在 headInsert() 和 printList() 函数中,就可以使用指向头结点的指针来操作链表了。