在c++的世界里溺水的小emo 2022-02-16 15:48 采纳率: 100%
浏览 36
已结题

单链表实现(c++)出错,但不知道是哪里

感谢各位了

#include<iostream>
using namespace std;

typedef struct Node
{
    Node *next;
    int data;
    friend class LinkList;
}Node;

class LinkList
{
    public:
        LinkList();
        ~LinkList(){
            cout<<"析构成功"; 
        }
        void creaList(int n);        //创建空间为n的单链表 
        void pushlist(int k,int e);          //在位置k插入数据e 
        int poplist(int l);          //删除l位置的数据,并返回value 
        void output();
    private:
        Node *head;
        int LinkListsize;
};
LinkList::LinkList()
{
    head->data=0;
    head->next=NULL;
}
void LinkList::creaList(int n)
{
    Node *p,*s;
    int i;
    s=head;
    for(i=0;i<n;i++)
    {
        p=new Node;
        p->data=0;
        p->next=s->next;
        s->next=p;
    }
    LinkListsize=n;
}
void LinkList::pushlist(int k,int e)
{
    if(k>LinkListsize-1)
    {
        cout<<"链表已满,发生越界错误";
        return; 
    }
    Node *s,*p;
    int i;
    s=new Node;
    s->data=e;
    p=head;
    for(i=0;i<k;i++)
    {
        p=p->next;
    }
    s->next=p->next;
    p->next=s;
}
int LinkList::poplist(int l)
{
    Node *s,*p;
    s=head;
    p=head;
    int i;
    for(i=0;i<l-1;i++)
    {
        s=s->next;
        p=p->next;
    }
    int q;
    p=p->next;
    s->next=p->next;
    q=p->data;
    delete p;
    return q;
}
void LinkList::output()
{
    Node *s;
    int i;
    int q;
    for(i=1;i<LinkListsize;i++)
    {
        q=s->data;
        cout<<q<<endl;
        s=s->next;
    }
}
int main()
{    
    LinkList list;
    int num;
    cin>>num;
    list.creaList(num);
    int i;
    for(i=0;i<num;i++)
    {
        list.pushlist(i,i+1);
    }
    list.output();
    return 0;
 } 

  • 写回答

3条回答 默认 最新

  • 关注

    你这代码错误太多了。
    (1)构造函数中,head没有初始化
    (2)create函数中,创建了n个节点,这n个节点都没有用到,应该不是题目的本意
    (3)pushlist函数中,节点数没有+1
    (4)poplist函数中,节点数量没有-1,删除节点的逻辑也不对
    (5)poplist函数中,删除节点前,应该先判断位置是否越界,否则会导致程序崩溃
    (6)output函数,s没有初始化,for循环的条件应该是<=
    代码修改如下:

    img

    代码:

    #include<iostream>
    using namespace std;
    
    typedef struct Node
    {
        Node *next;
        int data;
        friend class LinkList; //这一句没用,可以删掉
    }Node;
    
    class LinkList
    {
    public:
        LinkList();
        ~LinkList(){
            cout<<"析构成功"; 
        }
        void creaList(int n);        //创建空间为n的单链表   
        void pushlist(int k,int e);          //在位置k插入数据e 
        int poplist(int l);          //删除l位置的数据,并返回value 
        void output();
    private:
        Node *head;
        int LinkListsize;
    };
    LinkList::LinkList()
    {
        head = new Node;//修改1,需要先给head申请空间
        head->data=0;
        head->next=NULL;
        LinkListsize = 0; //修改2,这里初始化链表长度
    }
    
    void LinkList::creaList(int n)
    {
        Node *p,*s;
        int i;
        s=head;
        for(i=0;i<n;i++)
        {
            p=new Node;
            p->data=0;
            p->next=s->next;
            s->next=p;
        }
        LinkListsize=n;
    }
    
    void LinkList::pushlist(int k,int e)
    {
        if(k>LinkListsize-1) 
        {
            cout<<"链表已满,发生越界错误";
            return; 
        }
        Node *s,*p;
        int i;
        s=new Node;
        s->data=e;
        p=head;
        for(i=0;i<k;i++)
        {
            p=p->next;
        }
        s->next=p->next;
        p->next=s;
        LinkListsize++; //修改2,调整大小
    }
    int LinkList::poplist(int l)
    {
        Node *s,*p;
        //修改3,先判读l是否越界
        if(l<0 || l >= LinkListsize)
        {
            printf("该位置越界\n");
            return -1;
        }
    
        s=head;
        p=head->next; //修改4
        int i;
        for(i=0;i<l-1;i++)
        {
            s=s->next;
            p=p->next;
        }
        //修改5
        int q = p->data; //p即为需要删除的节点
        s->next=p->next; 
        delete p;
        //修改6
        LinkListsize--; //调整大小
        return q;
    }
    void LinkList::output()
    {
        Node *s = head->next; //修改7
        int i;
        int q;
        for(i=1;i<=LinkListsize;i++) //修改8 应该是<=
        {
            q=s->data;
            cout<<q<<endl;
            s=s->next;
        }
    }
    int main()
    {    
        LinkList list;
        int num;
        cin>>num;
        list.creaList(num);
        int i;
        for(i=0;i<num;i++)
        {
            list.pushlist(i,i+1); 
        }
        list.output();
        return 0;
    } 
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 2月24日
  • 已采纳回答 2月16日
  • 创建了问题 2月16日

悬赏问题

  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么