鱼C论坛

 找回密码
 立即注册
查看: 1400|回复: 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为空指针,为什么会显示为空指针呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

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

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

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

以下是修改后的代码示例:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. typedef struct Lnode {
  4.     int data;
  5.     struct Lnode* next;
  6. } node, * linklist;
  7. linklist Createnode2()
  8. {
  9.     linklist L = (linklist)malloc(sizeof(Lnode));
  10.     int x;
  11.     Lnode* s, * r = L;
  12.     scanf("%d", &x);
  13.     while (x != 9999)
  14.     {
  15.         s = (linklist)malloc(sizeof(Lnode));
  16.         s->data = x;
  17.         r->next = s;
  18.         r = s;
  19.         scanf("%d", &x);
  20.     }
  21.     r->next = NULL;
  22.     return L;
  23. }
  24. linklist getelem(linklist L, int i)
  25. {
  26.     if (i < 0)
  27.     {
  28.         return NULL;
  29.     }
  30.    
  31.     int j = 0;
  32.     linklist p = L;
  33.     while (p && j < i)
  34.     {
  35.         p = p->next;
  36.         j++;
  37.     }
  38.     return p;
  39. }
  40. void Printnode(linklist L)
  41. {
  42.     L = L->next;
  43.     while (L != NULL)
  44.     {
  45.         printf("%3d", L->data);
  46.         L = L->next;
  47.     }
  48. }
  49. int main()
  50. {
  51.     linklist L;
  52.     linklist search;
  53.     L = Createnode2();
  54.     Printnode(L);
  55.     search = getelem(L, 2);
  56.     if (search != NULL)
  57.     {
  58.         printf("\n按序号查找成功\n");
  59.         printf("%d\n", search->data);
  60.     }
  61.     else
  62.     {
  63.         printf("\n按序号查找失败\n");
  64.     }
  65.    
  66.     return 0;
  67. }
复制代码

你可以尝试使用修改后的代码运行,看看问题是否得到解决。如果还有其他问题,请随时提问。

球一个最佳答案谢谢啦!这对我非常重要!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

为了解决这个问题,你可以修改`main`函数中调用`Createnode2(L)`函数的部分如下:
  1. int main()
  2. {
  3.     linklist L = NULL;
  4.     linklist search;
  5.     Createnode2(&L); // 传递链表头指针的地址
  6.     Printnode(L);
  7.     search = getelem(L, 2);
  8.     if (search != NULL)
  9.     {
  10.         printf("按序号查找成功\n");
  11.         printf("%d\n", search->data);
  12.     }
  13.     return 0;
  14. }
复制代码

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

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

此回答源于ChatGPT,若有不正确之处,请多包容
小甲鱼最新课程 -> https://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,若有不正确之处,请多包容
小甲鱼最新课程 -> https://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,若有不正确之处,请多包容
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

这一段
  1. linklist getelem(linklist L, int i)
  2. {
  3.         int j = 1;
  4.         linklist p = L->next;
  5.         if (i == 0)
  6.         {
  7.                 return L;
  8.         }
  9.         if (i < 1)
  10.         {
  11.                 return NULL;
  12.         }
  13.         if (p && j < i)
  14.         {
  15.                 p = p->next;
  16.                 j++;
  17.         }
  18.         return p;
  19. }
复制代码

是不是应该把最后一个if改为
  1. while (p && j < i)
  2. {
  3.     p = p->next;
  4.     j++;
  5. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-22 14:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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