No Code(睡觉版) 2024-03-01 10:57 采纳率: 33.3%
浏览 13

执行单链表的初始化、插入以及遍历操作的报错

想执行单链表的初始化、插入以及遍历操作,这是我自己写的算法,但是编译器一直报错,有没有人能帮忙看下是什么问题啊,谢谢


#include<iostream>
#define maxsize 200
struct Lnode{//声明定义一个新的链表
    int data;
    struct Lnode *next;
}Lnode,*Linklist;
/*int Initlist_L(Linklist &L)//初始化链表(带头结点的链表)
{
    L = (Lnode *)malloc(sizeof(Lnode));
    L->next = null;
    //如果链表的头指针指向的头结点的指针域为空,则链表为空,注意是指针域不是数据域,因为如果是数据域,头结点的数据域是有可能存放其他数据的
    return 0;
}*/
bool Initlist(Linklist &L){
    L = (Lnode *)malloc(sizeof(Lnode));//分配一个头节点,此头结点不存储数据。
    if(L=NULL)        //内存不足,分配失败
        return false;
    L->next = NULL;  //头节点之后暂时还没有节点
    return true;
}
int IsEmpty_Linklist(Linklist L)
{
    if(L->next == null)
        return 1;
    else 
        return 0;
}
/*插入操作:在i位置插入e元素,此处是带头结点的单链表的情况*/
/*不应该直接插入结点吗,只有e元素和位置,应该申请一个结点然后再作插入的操作吧*/
void scanLinkList(Linklist L)
{
    int k = 0;//k元素用于计数
    Linklist p;
    p = L->next;//p指针指向L链表的第一个结点
    while(p)//如果p不为空,则循环遍历该单链表
    {
        p = p->next;//p指针不断下移指向下一个结点
        k++;//k作为链表长度不断加一
        cout<<p->data<<endl;//输出每个元素
    }
}
void InsertLinkList(Linklist &L,int i, int e)
{
    int k = 1;
    Linklist p;//申明一个头指针,指向第一个头结点
    //申明一个新结点,并且新结点存入e元素的值(n作为指针指向该新结点)
    Linklist n = new Lnode;//错误点1:需要给新结点分配存储空间
    n->next=NULL;
    n->data = e;
    while(k != i)//首先循环链表,找到第i个结点
    {
        p = p->next;
        k++;
    }
    n->next = p->next;//执行一个断链的操作,将新结点插入链表中
    p->next = n;
}
int main(){
    Linklist L;
    Initlist(L);
    InsertLinkList(L,1,1);
    scanLinkList(L);
}
  • 写回答

2条回答 默认 最新

  • 关注

    No Code(睡觉版) 上午好☀️☀️☀️️
    本答案参考通义千问

    你的代码中存在一些问题,我将它们列出来并提供相应的修复建议:

    1. 错误点1:InsertLinkList 函数中,你没有为新节点分配存储空间。你需要在创建新节点后立即进行 malloc 操作。
    // 修复后的代码
    Linklist n = new Lnode; // 分配新节点的空间
    n->next = NULL;
    n->data = e;
    
    1. 错误点2: 初始化链表函数 Initlist 返回的是 bool 类型,但函数体中的 if (L == NULL) 语句没有返回值。为了保持一致,你可以将 return false; 放在 if 语句内。
    bool Initlist(Linklist &L) {
        L = (Lnode *)malloc(sizeof(Lnode));
        if (L == NULL) {
            return false;
        }
        L->next = NULL;
        return true;
    }
    
    1. 错误点3:InsertLinkList 函数中,n->next = p->next; 这行操作是多余的,因为你已经设置了 n->next。删除这行代码即可。

    2. 错误点4:main 函数中,插入操作后应调用 scanLinkList 遍历链表。确保调用它之前链表已经被正确初始化。

    main() {
        Linklist L;
        if (!Initlist(L)) {
            std::cout << "Failed to initialize the list." << std::endl;
            return 1;
        }
        InsertLinkList(L, 1, 1);
        scanLinkList(L);
    }
    

    经过以上修改,你的代码应该可以正常运行。以下是修复后的完整代码:

    #include<iostream>
    #define maxsize 200
    struct Lnode {
        int data;
        struct Lnode *next;
    };
    
    bool Initlist(Linklist &L) {
        L = (Lnode *)malloc(sizeof(Lnode));
        if (L == NULL) {
            return false;
        }
        L->next = NULL;
        return true;
    }
    
    int IsEmpty_Linklist(Linklist L) {
        if (L->next == NULL)
            return 1;
        else
            return 0;
    }
    
    void scanLinkList(Linklist L) {
        int k = 0;
        Linklist p;
        p = L->next;
        while (p) {
            p = p->next;
            k++;
            std::cout << p->data << std::endl;
        }
    }
    
    void InsertLinkList(Linklist &L, int i, int e) {
        int k = 1;
        Linklist p;
        Linklist n = new Lnode;
        n->next = NULL;
        n->data = e;
    
        while (k != i) {
            p = p->next;
            k++;
        }
        p->next = n;
    }
    
    int main() {
        Linklist L;
        if (!Initlist(L)) {
            std::cout << "Failed to initialize the list." << std::endl;
            return 1;
        }
        InsertLinkList(L, 1, 1);
        scanLinkList(L);
        return 0;
    }
    
    评论

报告相同问题?

问题事件

  • 创建了问题 3月1日

悬赏问题

  • ¥15 用verilog实现tanh函数和softplus函数
  • ¥15 求京东批量付款能替代天诚
  • ¥15 slaris 系统断电后,重新开机后一直自动重启
  • ¥15 51寻迹小车定点寻迹
  • ¥15 谁能帮我看看这拒稿理由啥意思啊阿啊
  • ¥15 关于vue2中methods使用call修改this指向的问题
  • ¥15 idea自动补全键位冲突
  • ¥15 请教一下写代码,代码好难
  • ¥15 iis10中如何阻止别人网站重定向到我的网站
  • ¥15 滑块验证码移动速度不一致问题