cloud___fly 2022-11-25 20:26 采纳率: 100%
浏览 14
已结题

链表中l->head是nullptr

链表:引发了访问权限错误,l->head是nullptr

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

typedef struct Node {
    int val;
    struct Node* next;
}Node;

typedef struct List {
    Node* head;
    int len;
}List;


Node* initNode(int val)
{
    Node* n = (Node*)malloc(sizeof(Node));
    n->val = val;
    n->next = NULL;

    return n;
}

void freeNode(Node* n)
{
    if (n)
    {
        free(n);
    }
}

List* initList()
{
    List* l = (List*)malloc(sizeof(List));
    l->head = NULL;
    l->len = 0;

    return l;
}

void freeList(List* l)
{
    if (!l) {}
    else
    {
        Node* p = l->head;
        Node* k = NULL;
        while (p)
        {
            k = p;
            p = p->next;
            freeNode(k);
        }
        free(l);
    }
}

//插入节点到链表//
int insertNode(List* l, int idx, Node* n)
{
    if (!l)
    {
        return 0;
    }
    if (idx<0 || idx>l->len)
    {
        return 0;
    }
    Node* p = (Node*)&(l->head);
    while (idx--)
    {
        p = p->next;
    }
    n->next = p->next;
    p->next = n;

    l->len++;
    return 1;
}
//插入数值到链表//
int insertVal(List* l, int idx, int val)
{
    //生成一个新节点//
    Node* n = initNode(val);
    insertNode(l, idx, n);
    if (!insertNode(l, idx, n))
    {
        freeNode(n);
        return 0;
    }

    return 1;
}



//删除节点//
int erase(List* l, int idx)
{
    if (!l)
    {
        return 0;
    }
    if (idx < 0 || idx >= l->len)
    {
        return 0;
    }
    //找到插入节点的前一个位置//
    Node* p = (Node*) & (l->head);
    while (idx--)
    {
        p = p->next;
    }

    Node* k = p->next;
    p->next = p->next->next;

    freeNode(k);
    l->len--;

    return 1;
}



int main()
{
    void showList(List* l);
    
    srand(time(0));

    int cnt = 20;

    List* l = initList();

    while (cnt--)
    {
        int val = rand() % 100;
        int opt = rand() % 4;
        int idx = rand() % (l->len + 3) - 1;

        switch (opt)
        {
        case 0:
        case 1:
        case 2:
            printf("insert %d at %d,res=%s\n", val, idx, insertVal(l, idx, val) ? "SUC" : "ERR");
            break;
        case 3:
            printf("erase at %d,res=%s\n", idx, erase(l, idx) ? "SUC" : "ERR");
            break;
        }
        showList(l);
    }
    freeList(l);

    return 0;
}

void showList(List* l)
{
    if (!l) {}
    else
    {
        Node* p = l->head->next;
        printf("List:[");
        while (p)
        {
            printf("%d->", p->val);
            p = p->next;
        }
        printf("NULL]\n");
    }

}


引发了未经处理的异常:读取访问权限冲突。

l->head 是 nullptr。

怎么修改才能使上面的程序运行,以及原因

img

  • 写回答

1条回答 默认 最新

  • 快乐鹦鹉 2022-11-25 20:35
    关注
     insertNode(l, idx, n);
        if (!insertNode(l, idx, n))
    
    

    干嘛要调用两次insertNode呢?

    if (idx<0 || idx>l->len)
    {
    return 0;
    }
    这要求第一个节点增加时,idx必须是0,因为l->len肯定是0。但main中,int idx = rand() % (l->len + 3) - 1;不能保证idx是0啊

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

报告相同问题?

问题事件

  • 系统已结题 12月3日
  • 已采纳回答 11月25日
  • 修改了问题 11月25日
  • 创建了问题 11月25日

悬赏问题

  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
  • ¥15 lammps拉伸应力应变曲线分析
  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛
  • ¥15 请问Lammps做复合材料拉伸模拟,应力应变曲线问题
  • ¥30 python代码,帮调试,帮帮忙吧
  • ¥15 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建