MymyX 2020-05-29 17:13 采纳率: 100%
浏览 289
已采纳

大佬能帮下忙吗? 单链表出现的读取访问权限冲突

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

typedef struct LNode {
    int elem;
    struct LNode* next;
}Node, * List;

List init() {
    List list = (List)malloc(sizeof(Node));
    list->elem = 0;   list->next = NULL;
    return list;
}

int length(List list) {
    return list->elem;
}

bool isEmpty(List list) {
    return list->next == NULL;
}

void add(List list, int elem) {
    Node node = { elem,NULL };
    node.next = list->next;
    list->next = &node;
    list->elem++;
}

void append(List list, int elem) {
    Node node = { elem,NULL };
    List cur = (List)malloc(sizeof(Node));
    cur = list->next;
    while (cur != NULL) {
        cur = cur->next;
    }//结束while语句后,cur是一个nullptr
    cur = &node;
    list->elem++;
}


int* travel(List list) {
    int* num = (int*)malloc(sizeof(int) * length(list));//初始化num数组
    int i = 1;
    if (isEmpty(list)) {
        printf("链表为空!");
        num = NULL;
    }
    else {
        List cur = (List)malloc(sizeof(Node));
        if (!cur) {
            printf("申请内存失败!");
            exit(0);
        }
        cur = list->next;
        while (cur != NULL) {
            printf("链表第%d个节点为:%d\n", i, cur->elem);
            num[i - 1] = cur->elem;
            i++;
            cur = cur->next;
        }
    }
    return num;
}

int main() {
    List list = init();
    add(list, 3);
    add(list, 2);
    add(list, 1);
    append(list, 4);
    printf("链表是否为空:%d\n", isEmpty(list));
    printf("链表长度为:%d\n", length(list));
    travel(list);
    return 0;
}

图片说明

  • 写回答

1条回答 默认 最新

  • bobhuang 2020-05-29 19:35
    关注

    add 函数中node是局部变量,函数结束后对应的变量空间就失效了,会在后续的执行中被篡改。要用malloc申请一个Node变量空间,才能真正add一个有效的Node.
    append函数, cur在malloc赋值后直接赋值成list->next,内存泄漏了。而整个while以cur==NULL结束,没有真正找到append的点,应该以NULL==cur->next 结束。

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

报告相同问题?

悬赏问题

  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog