颂. 2022-01-06 22:30 采纳率: 80%
浏览 53
已结题

C语言编写链表,有两个错误如何解决,哭了T—T

本人23考研,正在复习数据结构,今天在练习链表的时候,发生了两个问题,求各位帮忙看一看T_T

第一个问题:打印结点的时候,发现尾指针指向的是-858993460。。在初始化链表的方法InitList(LinkList *L)中给头结点的next设为NULL,并且通过printf确认过头结点的next确实是0,但到其他方法里,链表头结点的next会变成-858993460,我查了查好像是未初始化,我感觉应该没问题,初始化的链表通过指向指针的指针传回了main(),再传给其他方法不应该没初始化,而且可以正常插入节点,打印节点,只不过最后尾指针确指向-858993460,很奇怪

第二个问题:如果一切正常,执行到最后会报错Run-Time Check Failure #2 - Stack around the variable 'list' was corrupted. 其中list是我的链表变量名,我查了查说是溢出啥的,但如果只进行初始化链表的 方法,其他方法全部注释,还是会报这个错误

逻辑应该是没问题的,但网课上的代码算是伪代码,语法不太严谨,写到C语言里就出现这种问题哭了T—T


```c
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
typedef struct LNode {
    int data;
    struct LNode* next;
}LNode,*LinkList;

bool InitList(LinkList *L) {
    L = (LNode*)malloc(sizeof(LNode));
    LNode* p = L;
    if (p == NULL) return false;
    p->next = NULL;
    if (p->next == NULL)  printf("尾结点后是NULL %d\n",p->next);
    else printf("尾结点后不是NULL\n");
    return true;
}

void ListPrint(LinkList *L) {
    LNode* p = L;
    while (p) {
        p = p->next;
        printf("%d ",p->data);
    }
}

bool ListInsert(LinkList *L,int index,int e) {
    if (index < 1) return false;
    LNode* p = L;
    int i = 0;
    while (p && i < index - 1) {
        p = p->next;
        i++;
    }
    if (!p || i > index - 1) return false;
    LNode* q = (LNode*)malloc(sizeof(LNode));
    if (q == NULL) return false;
    q->data = e;
    q->next = p->next;
    if (p->next == NULL)  printf("尾结点后是NULL\n");
    else printf("尾结点后是%d\n",p->next);
    p->next = q;
    return true;

}

int main() {
    LinkList list;
    if (InitList(&list)) printf("初始化成功!\n");
    else printf("初始化失败!\n");
    for (int i = 0; i < 2; i++)
    {
        ListInsert(&list, i + 1, i + 2);
    }
    ListPrint(&list);
    return 0;
}

```

  • 写回答

2条回答 默认 最新

  • 正在学C++ 2022-01-06 23:08
    关注
    
    #include<stdio.h>
    #include<stdlib.h>
    #include<stdbool.h>
    typedef struct LNode {
        int data;
        struct LNode* next;
    }LNode,*LinkList;
    
    bool InitList(LinkList &L) {    /////////使用引用&  这样修改了L之后达到了初始化效果
        L = (LNode*)malloc(sizeof(LNode));
        L->next = NULL;
        if (L == NULL) return false;
        return true;
    }
    void ListPrint(LinkList &L) {   /////////使用引用&
        LNode* p = L->next;         //修改
        while (p) {
            printf("%d ",p->data);
            p = p->next;
        }
    }
    bool ListInsert(LinkList &L,int index,int e) {  ///////////使用引用&
        if (index < 1) return false;
        LNode* p = L;
        int i = 0;
        while (p && i < index - 1) {
            p = p->next;
            i++;
        }
        if (!p || i > index - 1) return false;
        LNode* q = (LNode*)malloc(sizeof(LNode));
        if (q == NULL) return false;
        q->data = e;
        q->next = p->next;
        if (p->next == NULL)  printf("尾结点后是NULL\n");
        else printf("尾结点后是%d\n",p->next);
        p->next = q;
        return true;
    }
    int main() {
        LinkList list;
        if (InitList(list)) printf("初始化成功!\n");     //传递参数
        else printf("初始化失败!\n");
        for (int i = 0; i < 2; i++)
        {
            ListInsert(list, i + 1, i + 2);     //传递参数
        }
        ListPrint(list);
        return 0;
    }
    

    引用&是C++中的,但是用在数据结构中十分的好用。建议使用。这也就是我的修改。
    如果不使用引用,就传递指针的指针,这样在函数体内部就要注意,这也是你的错误之处,在函数体内部出错了。

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

报告相同问题?

问题事件

  • 系统已结题 1月14日
  • 已采纳回答 1月6日
  • 创建了问题 1月6日

悬赏问题

  • ¥20 蓝牙耳机怎么查看日志
  • ¥15 Fluent齿轮搅油
  • ¥15 八爪鱼爬数据为什么自己停了
  • ¥15 交替优化波束形成和ris反射角使保密速率最大化
  • ¥15 树莓派与pix飞控通信
  • ¥15 自动转发微信群信息到另外一个微信群
  • ¥15 outlook无法配置成功
  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏