单链表实现(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;
 } 

你这代码错误太多了。
(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;
} 


具体错误现象是什么样的?编译错误还是运行错误?
28、29行是错误的,构造函数中head还没分配空间啊,怎么能给指针的元素赋值呢。
要么写成head = NULL;
要么 给head分配空间,28行前加一句head = new Node,然后再将data设置为0,next设置为空
====
构造函数错误导致main中一开始定义LinkList list;就导致程序崩溃了
====
另外pushlist和poplist函数中,你需要修正LinkListsize的值,一个加1,一个减去1.否则output函数用LinkListsize进行循环会出问题。

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632