yixi2768 2023-05-22 19:29 采纳率: 100%
浏览 12
已结题

关于#c语言#的问题,如何解决?

有没有人帮我看看问题出在哪啊,在链表初始化的时候把头结点的next赋值为NULL之后,出了方法体就变成别的地址了,同样的我插入一条数据进去也会变成别的数据


#include <stdio.h>
#include <stdlib.h>

typedef struct linkList {    //定义单链表节点类型
    int num;    //每个节点存放一个数据
    struct linkList* next;    //指针指向下一个节点
}linkList;

int InitList(linkList* L) {    //初始化链表    
    //L=NULL;    //不带头结点的初始化
    //头结点初始化:
    L = (linkList*)malloc(sizeof(linkList));//分配一个头结点
    if (L == NULL) {    //内存不足,分配失败
        return 0;
    }
    L->next = NULL;    //头结点之后暂时没有节点
    return 1;
}


void headInsert(linkList* L, int num) {    //在头部插入数据
    linkList* n = (linkList*)malloc(sizeof(linkList));
    n->num = num;
    n->next = L->next;
    L->next = &n;
}

void printList(linkList* L) {
    //int j = 0;    //现在指针指向的位置
    L++;
    while (L->next != NULL)
    {
        printf("%d\n", L->num);
        L++;
    }
}

int main() {
    linkList L;    //声明一个指向链表的指针
    if (InitList(&L)) {//初始化一个空表
        printf("链表初始化成功\n");
    }
    else {
        printf("链表初始化失败\n");
    }


    headInsert(&L, 5);//插入数据
    printList(&L);
    return 0;
}
  • 写回答

1条回答 默认 最新

  • 语言-逆行者 2023-05-22 19:33
    关注

    基于new bing修改参考:
    这个问题的原因是在 InitList() 函数中,你使用指针修改了头结点的地址,但在 main() 函数中没有使用指向头结点的指针来操作链表。也就是说,在 InitList() 函数中,L 是指向头结点的指针,而在 main() 函数中,L 是链表的头部,两者并不是同一个变量。

    你可以修改代码,在 InitList() 函数中返回指向头结点的指针,然后在 main() 函数中使用这个指针来操作链表。以下是修改后的代码:

    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct linkList {
        int num;
        struct linkList* next;
    }linkList;
    
    linkList* InitList() {
        linkList* L = (linkList*)malloc(sizeof(linkList));
        if (L == NULL) {
            printf("内存分配失败\n");
            return NULL;
        }
        L->next = NULL;
        return L;
    }
    
    void headInsert(linkList* L, int num) {
        linkList* n = (linkList*)malloc(sizeof(linkList));
        n->num = num;
        n->next = L->next;
        L->next = n;
    }
    
    void printList(linkList* L) {
        linkList* p = L->next;
        while (p != NULL)
        {
            printf("%d\n", p->num);
            p = p->next;
        }
    }
    
    int main() {
        linkList* L = InitList();
        if (L != NULL) {
            printf("链表初始化成功\n");
        }
        else {
            printf("链表初始化失败\n");
            return 0;
        }
    
        headInsert(L, 5);
        printList(L);
    
        return 0;
    }
    
    
    

    在上述代码中,修改了 InitList() 函数的返回值为指向头结点的指针。在 main() 函数中创建一个指向头结点的指针 L,并将其传递给其他函数。这样,在 headInsert() 和 printList() 函数中,就可以使用指向头结点的指针来操作链表了。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 5月30日
  • 已采纳回答 5月22日
  • 创建了问题 5月22日

悬赏问题

  • ¥15 Opencv(C++)异常
  • ¥15 VScode上配置C语言环境
  • ¥15 汇编语言没有主程序吗?
  • ¥15 这个函数为什么会爆内存
  • ¥15 无法装系统,grub成了顽固拦路虎
  • ¥15 springboot aop 应用启动异常
  • ¥15 matlab有关债券凸性久期的代码
  • ¥15 lvgl v8.2定时器提前到来
  • ¥15 qtcp 发送数据时偶尔会遇到发送数据失败?用的MSVC编译器(标签-qt|关键词-tcp)
  • ¥15 cam_lidar_calibration报错