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

链表中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 12: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啊

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
    cloud___fly 2022-11-25 12:49

    那要怎么修改才能保证程序按原来的运行,而且出错的地方不是main函数,而是showList

    回复
    快乐鹦鹉 回复 cloud___fly 2022-11-25 12:59

    建议改用哨兵节点方式

    #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 = initNode(0);
        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)
        {
            return 0;
        }
        Node* p = l->head;
        while (idx-- && p->next != NULL)
        {
            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);
        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 = 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");
        }
    }
     
    
    

    1
    回复
    快乐鹦鹉 回复 快乐鹦鹉 2022-11-25 13:00

    img

    回复
    展开全部6条评论
编辑
预览

报告相同问题?

问题事件

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

悬赏问题

  • ¥15 没输出运行不了什么问题
  • ¥20 输入import torch显示Intel MKL FATAL ERROR,系统驱动1%,: Cannot load mkl_intel_thread.dll.
  • ¥15 点云密度大则包围盒小
  • ¥15 nginx使用nfs进行服务器的数据共享
  • ¥15 C#i编程中so-ir-192编码的字符集转码UTF8问题
  • ¥15 51嵌入式入门按键小项目
  • ¥30 海外项目,如何降低Google Map接口费用?
  • ¥15 fluentmeshing
  • ¥15 手机/平板的浏览器里如何实现类似荧光笔的效果
  • ¥15 盘古气象大模型调用(python)
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部