链表输出的问题
本帖最后由 a327904410 于 2021-11-15 20:10 编辑#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct node {
ElemType data;
struct node* next;
}Node;
int InitNode(Node* L) {
L = (Node*)malloc(sizeof(Node));
L->next = L;
return 1;
}
// 尾插
int InsNode(Node* L, ElemType x, int i) {
int j = 1;
Node* pre = L, * p = pre->next, * s;
if (i <= 0)
return 0;
while (p != L && j < i) {
j++;
pre = p; p = p->next;
}
if (p == L && i > j + 1)
return 0;
else {
s = (Node*)malloc(sizeof(Node));
s->data = x;
s->next = pre->next;
pre->next = s;
return 1;
}
}
//输出线性表运算算法
void DispList(Node* L) {
Node* p = L->next;
while (p != L) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
int main() {
int i;
Node L;
InitNode(&L);
InsNode(&L, 1, 1);
InsNode(&L, 3, 2);
InsNode(&L, 1, 3);
InsNode(&L, 5, 4);
InsNode(&L, 4, 5);
InsNode(&L, 2, 6);
DispList(&L);
return 0;
} 大意了,最后输出肯定错的,可能打得急了没检查到。但我目前想知道上面显示的错误{:10_245:} int main() {
int i;
Node L={0},*pL=&L;
InitNode(&L);
InsNode(&L, 1, 1);
InsNode(&L, 3, 2);
InsNode(&L, 1, 3);
InsNode(&L, 5, 4);
InsNode(&L, 4, 5);
InsNode(&L, 2, 6);
while (pL->next != NULL) {
pL = pL->next;
printf("%d ", pL->data);
}
return 0;
} jhq999 发表于 2021-11-15 19:26
想问下上面的报错是什么意思,感觉每次输出都会有这类报错。上面代码是临时敲出来的,之前敲过一些单链表输出也会有这种情况出现 jhq999 发表于 2021-11-15 19:26
我修改了下内容,问下这个错误怎么解决。。。是不是内存分配出现问题? 本帖最后由 jhq999 于 2021-11-15 20:59 编辑
a327904410 发表于 2021-11-15 20:11
我修改了下内容,问下这个错误怎么解决。。。是不是内存分配出现问题?
L->next没初始化,里面是随意的指针地址,最后表尾p = p->next;后p就是随意指针
养成指针初始化的好习惯,要不bug早晚找上门,
如果你记性好当我没说 jhq999 发表于 2021-11-15 20:54
L->next没初始化,里面是随意的指针地址,最后表尾p = p->next;后p就是随意指针
养成指针初始化的好习 ...
刚刚调试了一下,发现在尾插的时候表尾好像没指向表头,在输出的时候表尾的下一位也是没指向表头。不知道是不是这个原因导致的程序错误,虽然能输出结果。大佬方便帮我改下代码吗,看了其他人写的单链表还是不懂怎么修改。{:10_266:} 本帖最后由 jhq999 于 2021-11-16 06:51 编辑
a327904410 发表于 2021-11-16 00:01
刚刚调试了一下,发现在尾插的时候表尾好像没指向表头,在输出的时候表尾的下一位也是没指向表头。不知道 ...
单链表结尾next一般都是空指针(也就是结束标志),这样用于循环查找时判断已经撸了一遍。如果表尾接表头是个圈而不是链没有结尾,你在查找时就是死循环。
看3楼已经给你答案了 jhq999 发表于 2021-11-16 06:46
单链表结尾next一般都是空指针(也就是结束标志),这样用于循环查找时判断已经撸了一遍。如果表尾接表头 ...
这个我懂,只不过我写的是循环单链表,正常来说表尾指向表头就代表结束的{:10_266:} 本帖最后由 jhq999 于 2021-11-16 15:10 编辑
a327904410 发表于 2021-11-16 12:56
这个我懂,只不过我写的是循环单链表,正常来说表尾指向表头就代表结束的
明白了
int InitNode(Node* L) {
//L = (Node*)malloc(sizeof(Node));//画蛇添足,L已经有实例了不需要申请内存,
//申请了新内存空间只不过是让形参的指针指向新内存,形参和实参再也没有关系
L->next = L;
return 1;
}
或者
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct node {
ElemType data;
struct node* next;
}Node;
int InitNode(Node**L) {//////////////
*L = (Node*)malloc(sizeof(Node));
(*L)->next = *L;
return 1;
}
// 尾插
int InsNode(Node* L, ElemType x, int i) {
int j = 1;
Node* pre = L, * p = pre->next, * s;
if (i <= 0)
return 0;
while (p != L && j < i) {
j++;
pre = p; p = p->next;
}
if (p == L && i > j + 1)
return 0;
else {
s = (Node*)malloc(sizeof(Node));
s->data = x;
s->next = pre->next;
pre->next = s;
return 1;
}
}
//输出线性表运算算法
void DispList(Node* L) {
Node* p = L->next;
while (p != L) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
int main() {
int i;
Node *L=NULL;/////////
InitNode(&L);//////////
InsNode(L, 1, 1);
InsNode(L, 3, 2);
InsNode(L, 1, 3);
InsNode(L, 5, 4);
InsNode(L, 4, 5);
InsNode(L, 2, 6);
DispList(L);
return 0;
} jhq999 发表于 2021-11-16 15:01
明白了
或者
看来我对指针了解还是不够,得去补补课了。谢谢大佬的改正{:10_266:} jhq999 发表于 2021-11-15 20:54
L->next没初始化,里面是随意的指针地址,最后表尾p = p->next;后p就是随意指针
养成指针初始化的好习 ...
这句话现在懂了,看了几天关于动态内存申请视频。因为我是敲C/C++书本的代码,之前不懂指针要初始化,以为都是创建好然后再赋值
页:
[1]