鱼C论坛

 找回密码
 立即注册
查看: 1176|回复: 6

数据结构单链表查询请教

[复制链接]
发表于 2023-7-22 16:45:49 | 显示全部楼层 |阅读模式

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

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

x
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

typedef struct Lnode {
        int data;
        struct Lnode* next;
}node, * linklist;

linklist Createnode2(linklist& L)
{
        L = (linklist)malloc(sizeof(Lnode));
        int x;
        Lnode* s, * r = L;
        scanf("%d", &x);
        while (x != 9999)
        {
                s = (linklist)malloc(sizeof(Lnode));
                s->data = x;
                r->next = s;
                r = s;
                scanf("%d", &x);
        }
        r->next = NULL;

        return L;
}
linklist getelem(linklist L, int i)
{
        int j = 1;
        linklist p = L->next;
        if (i == 0)
        {
                return L;
        }
        if (i < 1)
        {
                return NULL;
        }
        if (p && j < i)
        {
                p = p->next;
                j++;
        }
        return p;
}


void Printnode(linklist& L)
{
        L = L->next;
        while (L != NULL)
        {
                printf("%3d", L->data);
                L = L->next;
        }


}

int main()
{
        linklist L;
        linklist search;
        Createnode2(L);
        Printnode(L);
        search = getelem(L,2);
        if (search != NULL)
        {
                printf("按序号查找成功\n");
                printf("%d\n",search->data);
        }
}

代码为数据结构单链表的查找,Createnode2()是尾插法, 在编译时,代码执行至getelem()查找函数这里提示linklist p = L->next;这一语句有问题,显示L->next为空指针,为什么会显示为空指针呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-7-22 16:46:25 | 显示全部楼层
问题分析:
程序中的getelem函数用于查找链表中指定位置的节点,但在代码执行时出现问题。具体来说,问题出现在语句linklist p = L->next;,提示L->next为空指针。

问题原因:
出现这个问题的可能原因是在调用getelem函数时,传入的链表L可能为空,或者链表的第一个节点L->next为空。

解决方法:
检查是否正确创建链表并传递给getelem函数。确保链表不为空并且至少有一个有效的节点。

修改建议:
在主函数中调用Createnode2函数创建链表L,然后再调用getelem函数进行查找。同时,可以对getelem函数进行一些改进,使其更加健壮和易于使用。

以下是修改后的代码示例:
#include <stdio.h>#include <stdlib.h>typedef struct Lnode {    int data;    struct Lnode* next;} node, * linklist;linklist Createnode2(){    linklist L = (linklist)malloc(sizeof(Lnode));    int x;    Lnode* s, * r = L;    scanf("%d", &x);    while (x != 9999)    {        s = (linklist)malloc(sizeof(Lnode));        s->data = x;        r->next = s;        r = s;        scanf("%d", &x);    }    r->next = NULL;    return L;}linklist getelem(linklist L, int i){    if (i < 0)    {        return NULL;    }        int j = 0;    linklist p = L;    while (p && j < i)    {        p = p->next;        j++;    }    return p;}void Printnode(linklist L){    L = L->next;    while (L != NULL)    {        printf("%3d", L->data);        L = L->next;    }}int main(){    linklist L;    linklist search;    L = Createnode2();    Printnode(L);    search = getelem(L, 2);    if (search != NULL)    {        printf("\n按序号查找成功\n");        printf("%d\n", search->data);    }    else    {        printf("\n按序号查找失败\n");    }        return 0;}
你可以尝试使用修改后的代码运行,看看问题是否得到解决。如果还有其他问题,请随时提问。

球一个最佳答案谢谢啦!这对我非常重要!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-22 18:25:57 | 显示全部楼层
根据你提供的代码,出现`L->next`为空指针的原因是在调用`Createnode2(L)`函数时没有传递链表头指针的地址,导致链表头指针`L`仍然是一个空指针。

为了解决这个问题,你可以修改`main`函数中调用`Createnode2(L)`函数的部分如下:
int main(){    linklist L = NULL;    linklist search;    Createnode2(&L); // 传递链表头指针的地址    Printnode(L);    search = getelem(L, 2);    if (search != NULL)    {        printf("按序号查找成功\n");        printf("%d\n", search->data);    }    return 0;}
首先,在`main`函数中将链表头指针`L`初始化为`NULL`。然后,在调用`Createnode2(&L)`函数时,将`L`的地址传递给函数,以便在函数内部修改`L`的值(注意加上取地址符号`&`)。这样就能正确地创建链表,并且链表头指针`L`不再是空指针。

希望能解决你的问题!如果还有其他疑问,请随时提问。求给个最佳答案,非常感谢

此回答源于ChatGPT,若有不正确之处,请多包容
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-22 20:03:35 | 显示全部楼层
根据你提供的代码,出现 L->next 为空指针的原因是在调用 Createnode2(L) 函数时没有传递链表头指针的地址,导致链表头指针 L 仍然是一个空指针。

为了解决这个问题,你可以修改 main 函数中调用 Createnode2(L) 函数的部分如下:
[code]int main()
{
    linklist L = NULL;
    linklist search;
    Createnode2(&L); // 传递链表头指针的地址
    Printnode(L);
    search = getelem(L, 2);
    if (search != NULL)
    {
        printf("按序号查找成功\n");
        printf("%d\n", search->data);
    }

    return 0;
}
   

首先,在 main 函数中将链表头指针 L 初始化为 NULL 。然后,在调用 Createnode2(&L) 函数时,将 L 的地址传递给函数,以便在函数内部修改 L 的值(注意加上取地址符号 & )。这样就能正确地创建链表,并且链表头指针 L 不再是空指针。

希望能解决你的问题!如果还有其他疑问,请随时提问。求给个最佳答案,非常感谢

此回答源于ChatGPT,若有不正确之处,请多包容
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-22 20:04:55 | 显示全部楼层
在你的代码中,我注意到没有调用  Createnode2  函数来创建链表。因此,当执行  getelem  函数时,链表  L  是空指针,因此访问  L->next  会导致空指针错误。

要解决这个问题,可以在  main  函数中调用  Createnode2  函数来创建链表,并将返回的链表指针赋值给  L ,即:
[code]L = Createnode2(L);
   

在这之后, L  就不再为空指针,而是指向了创建好的链表头节点。这样在调用  getelem  函数时就不会出现空指针错误了。

此外,还需要注意,在  Printnode  函数中可能存在潜在的问题。你传递的参数是  linklist& L ,但在函数中修改  L  的指向,并没有对原始指针产生实际影响。为了修复这个问题,你可以将  Printnode  函数的参数改为  linklist L ,这样只会对传入的链表副本进行操作,不会影响主函数中的链表指针。求给个最佳答案,非常感谢

此回答源于ChatGPT,若有不正确之处,请多包容
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-23 13:38:09 | 显示全部楼层
本帖最后由 yinda_peng 于 2023-7-23 13:39 编辑

这一段
linklist getelem(linklist L, int i)
{
        int j = 1;
        linklist p = L->next;
        if (i == 0)
        {
                return L;
        }
        if (i < 1)
        {
                return NULL;
        }
        if (p && j < i)
        {
                p = p->next;
                j++;
        }
        return p;
}
是不是应该把最后一个if改为
while (p && j < i)
{
    p = p->next;
    j++;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-23 21:40:36 | 显示全部楼层
我找到问题了,主要原因是我在Print函数里加了引用,所以L值被改变了,当然也有一处把while写成了if,谢谢大家来复帮我找问题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-24 01:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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