纸上情话 2024-12-30 08:59 采纳率: 100%
浏览 10
已结题

c语言链表存储数据报错

img

img

img


用链表存储数组数据,显示插入一个数据的函数,然后运用该函数存储数组数据,代码如上,为什么错了,咋改呢?

  • 写回答

3条回答 默认 最新

  • 道友老李 JWE233286一种基于机器视觉的水表指针读数识别及修正的方法 专利发明者 2024-12-30 09:00
    关注
    让【道友老李】来帮你解答,本回答参考通义千问大模型编写,并整理提供,如果还有疑问可以点击头像关注私信或评论。
    如果答案让您满意,请采纳、关注,非常感谢!
    根据你提供的图片,我可以看到你的代码是用C语言实现的链表操作。为了帮助你更好地理解和解决问题,我会逐步分析你的代码,并指出其中的问题,最后给出修改后的代码。

    问题分析

    1. 结构体定义

      typedef struct Node {
         int data;
         struct Node *next;
      } Node, *LinkList;
      
    2. 插入函数

      void Insert(LinkList L, int x) {
         LinkList s = (LinkList)malloc(sizeof(Node));
         s->data = x;
         s->next = L->next;
         L->next = s;
      }
      
    3. 主函数

      int main() {
         LinkList L = (LinkList)malloc(sizeof(Node));
         L->next = NULL;
      
         int a[] = {1, 2, 3, 4, 5};
         for (int i = 0; i < 5; i++) {
             Insert(L, a[i]);
         }
      
         // 打印链表
         LinkList p = L->next;
         while (p != NULL) {
             printf("%d ", p->data);
             p = p->next;
         }
      
         return 0;
      }
      

    问题点

    1. 头节点问题

      • 你在创建链表时,L 是一个头节点,但你没有初始化 L->data。虽然这不是必须的,但为了清晰起见,可以初始化。
      • 你在插入元素时,直接将新节点插入到 L->next 之后,这样会导致所有节点都插入到头节点之后,而不是在链表的末尾。
    2. 内存泄漏

      • 你在 main 函数中分配了头节点 L,但在程序结束时没有释放它。虽然这个小例子中不会造成严重问题,但在实际应用中应该养成良好的内存管理习惯。

    修改后的代码

    #include <stdio.h>
    #include <stdlib.h>
    
    // 定义链表节点结构体
    typedef struct Node {
        int data;
        struct Node *next;
    } Node, *LinkList;
    
    // 插入函数
    void Insert(LinkList L, int x) {
        LinkList s = (LinkList)malloc(sizeof(Node));
        if (s == NULL) {
            printf("Memory allocation failed\n");
            exit(1);
        }
        s->data = x;
        s->next = L->next;
        L->next = s;
    }
    
    // 主函数
    int main() {
        // 创建头节点
        LinkList L = (LinkList)malloc(sizeof(Node));
        if (L == NULL) {
            printf("Memory allocation failed\n");
            exit(1);
        }
        L->next = NULL;
    
        // 初始化数组
        int a[] = {1, 2, 3, 4, 5};
    
        // 插入数据
        for (int i = 0; i < 5; i++) {
            Insert(L, a[i]);
        }
    
        // 打印链表
        LinkList p = L->next;
        while (p != NULL) {
            printf("%d ", p->data);
            p = p->next;
        }
        printf("\n");
    
        // 释放链表
        while (L != NULL) {
            LinkList temp = L;
            L = L->next;
            free(temp);
        }
    
        return 0;
    }
    

    解释

    1. 头节点初始化

      • 头节点 Ldata 字段可以不使用,但为了清晰起见,可以初始化为一个特定值(如 -1)。
      • Insert 函数中,新节点总是插入到头节点之后,这是正确的。
    2. 内存管理

      • main 函数中,我们在程序结束前释放了所有分配的内存,避免了内存泄漏。
    3. 错误处理

      • Insert 函数和 main 函数中,增加了对 malloc 返回值的检查,以确保内存分配成功。

    通过这些修改,你的代码应该能够正确地创建和打印链表。希望这对你有帮助!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 1月8日
  • 已采纳回答 12月31日
  • 创建了问题 12月30日