感谢各位了
#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循环的条件应该是<=
代码修改如下:
代码:
#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进行循环会出问题。