C语言编写链表,有两个错误如何解决,哭了T—T

本人23考研,正在复习数据结构,今天在练习链表的时候,发生了两个问题,求各位帮忙看一看T_T

第一个问题:打印结点的时候,发现尾指针指向的是-858993460。。在初始化链表的方法InitList(LinkList *L)中给头结点的next设为NULL,并且通过printf确认过头结点的next确实是0,但到其他方法里,链表头结点的next会变成-858993460,我查了查好像是未初始化,我感觉应该没问题,初始化的链表通过指向指针的指针传回了main(),再传给其他方法不应该没初始化,而且可以正常插入节点,打印节点,只不过最后尾指针确指向-858993460,很奇怪

第二个问题:如果一切正常,执行到最后会报错Run-Time Check Failure #2 - Stack around the variable 'list' was corrupted. 其中list是我的链表变量名,我查了查说是溢出啥的,但如果只进行初始化链表的 方法,其他方法全部注释,还是会报这个错误

逻辑应该是没问题的,但网课上的代码算是伪代码,语法不太严谨,写到C语言里就出现这种问题哭了T—T


```c
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
typedef struct LNode {
    int data;
    struct LNode* next;
}LNode,*LinkList;

bool InitList(LinkList *L) {
    L = (LNode*)malloc(sizeof(LNode));
    LNode* p = L;
    if (p == NULL) return false;
    p->next = NULL;
    if (p->next == NULL)  printf("尾结点后是NULL %d\n",p->next);
    else printf("尾结点后不是NULL\n");
    return true;
}

void ListPrint(LinkList *L) {
    LNode* p = L;
    while (p) {
        p = p->next;
        printf("%d ",p->data);
    }
}

bool ListInsert(LinkList *L,int index,int e) {
    if (index < 1) return false;
    LNode* p = L;
    int i = 0;
    while (p && i < index - 1) {
        p = p->next;
        i++;
    }
    if (!p || i > index - 1) return false;
    LNode* q = (LNode*)malloc(sizeof(LNode));
    if (q == NULL) return false;
    q->data = e;
    q->next = p->next;
    if (p->next == NULL)  printf("尾结点后是NULL\n");
    else printf("尾结点后是%d\n",p->next);
    p->next = q;
    return true;

}

int main() {
    LinkList list;
    if (InitList(&list)) printf("初始化成功!\n");
    else printf("初始化失败!\n");
    for (int i = 0; i < 2; i++)
    {
        ListInsert(&list, i + 1, i + 2);
    }
    ListPrint(&list);
    return 0;
}

```


#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
typedef struct LNode {
    int data;
    struct LNode* next;
}LNode,*LinkList;

bool InitList(LinkList &L) {    /////////使用引用&  这样修改了L之后达到了初始化效果
    L = (LNode*)malloc(sizeof(LNode));
    L->next = NULL;
    if (L == NULL) return false;
    return true;
}
void ListPrint(LinkList &L) {   /////////使用引用&
    LNode* p = L->next;         //修改
    while (p) {
        printf("%d ",p->data);
        p = p->next;
    }
}
bool ListInsert(LinkList &L,int index,int e) {  ///////////使用引用&
    if (index < 1) return false;
    LNode* p = L;
    int i = 0;
    while (p && i < index - 1) {
        p = p->next;
        i++;
    }
    if (!p || i > index - 1) return false;
    LNode* q = (LNode*)malloc(sizeof(LNode));
    if (q == NULL) return false;
    q->data = e;
    q->next = p->next;
    if (p->next == NULL)  printf("尾结点后是NULL\n");
    else printf("尾结点后是%d\n",p->next);
    p->next = q;
    return true;
}
int main() {
    LinkList list;
    if (InitList(list)) printf("初始化成功!\n");     //传递参数
    else printf("初始化失败!\n");
    for (int i = 0; i < 2; i++)
    {
        ListInsert(list, i + 1, i + 2);     //传递参数
    }
    ListPrint(list);
    return 0;
}

引用&是C++中的,但是用在数据结构中十分的好用。建议使用。这也就是我的修改。
如果不使用引用,就传递指针的指针,这样在函数体内部就要注意,这也是你的错误之处,在函数体内部出错了。

你为什么不按照课本来写呢,你用的什么教材呢?