有没有人帮我看看问题出在哪啊,在链表初始化的时候把头结点的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() 函数中,就可以使用指向头结点的指针来操作链表了。