鱼C论坛

 找回密码
 立即注册
查看: 2434|回复: 11

[已解决]链表输出的问题

[复制链接]
发表于 2021-11-15 19:12:10 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 a327904410 于 2021-11-15 20:10 编辑

屏幕截图 2021-11-15 200915.png
#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;
}
最佳答案
2021-11-16 15:01:25
本帖最后由 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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-11-15 19:24:17 | 显示全部楼层
大意了,最后输出肯定错的,可能打得急了没检查到。但我目前想知道上面显示的错误
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-15 19:26:48 | 显示全部楼层
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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-15 19:38:25 | 显示全部楼层

想问下上面的报错是什么意思,感觉每次输出都会有这类报错。上面代码是临时敲出来的,之前敲过一些单链表输出也会有这种情况出现
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-15 20:11:05 | 显示全部楼层

我修改了下内容,问下这个错误怎么解决。。。是不是内存分配出现问题?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-15 20:54:42 | 显示全部楼层
本帖最后由 jhq999 于 2021-11-15 20:59 编辑
a327904410 发表于 2021-11-15 20:11
我修改了下内容,问下这个错误怎么解决。。。是不是内存分配出现问题?


L->next没初始化,里面是随意的指针地址,最后表尾p = p->next;后p就是随意指针
养成指针初始化的好习惯,要不bug早晚找上门,
如果你记性好当我没说
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-16 00:01:16 | 显示全部楼层
jhq999 发表于 2021-11-15 20:54
L->next没初始化,里面是随意的指针地址,最后表尾p = p->next;后p就是随意指针
养成指针初始化的好习 ...

刚刚调试了一下,发现在尾插的时候表尾好像没指向表头,在输出的时候表尾的下一位也是没指向表头。不知道是不是这个原因导致的程序错误,虽然能输出结果。大佬方便帮我改下代码吗,看了其他人写的单链表还是不懂怎么修改。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-16 06:46:12 | 显示全部楼层
本帖最后由 jhq999 于 2021-11-16 06:51 编辑
a327904410 发表于 2021-11-16 00:01
刚刚调试了一下,发现在尾插的时候表尾好像没指向表头,在输出的时候表尾的下一位也是没指向表头。不知道 ...


单链表结尾next一般都是空指针(也就是结束标志),这样用于循环查找时判断已经撸了一遍。如果表尾接表头是个圈而不是链没有结尾,你在查找时就是死循环。
看3楼已经给你答案了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-16 12:56:08 | 显示全部楼层
jhq999 发表于 2021-11-16 06:46
单链表结尾next一般都是空指针(也就是结束标志),这样用于循环查找时判断已经撸了一遍。如果表尾接表头 ...

这个我懂,只不过我写的是循环单链表,正常来说表尾指向表头就代表结束的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-16 15:01:25 | 显示全部楼层    本楼为最佳答案   
本帖最后由 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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-16 19:11:17 | 显示全部楼层

看来我对指针了解还是不够,得去补补课了。谢谢大佬的改正
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-19 00:35:54 | 显示全部楼层
jhq999 发表于 2021-11-15 20:54
L->next没初始化,里面是随意的指针地址,最后表尾p = p->next;后p就是随意指针
养成指针初始化的好习 ...

这句话现在懂了,看了几天关于动态内存申请视频。因为我是敲C/C++书本的代码,之前不懂指针要初始化,以为都是创建好然后再赋值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-23 01:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表