大致看了一下,你这个程序的问题是内存管理方面的问题。
而且你的程序在内存方面问题比较大。
1、一个临时对象开辟(new)了一个内存空间,没有及时释放,导致生命周期结束,最后没有就没有办法去释放掉;还有一个临时变量开辟了多次也没有释放。
比如 成员函数create(int n)中
LNode *p;
ElemType x;
int i=1;
while(i<=n)
{
cout<<"请输入第"< cin>>x;
p=new LNode;//这里开辟了空间,后面没有释放
p->data=x;
p->next=head->next;
head->next=p;
i++;
}
临时变量p开辟了多次内存,每次都没有释放。
解决方法,可以考虑用成员指针变量pNode替代局部需要开辟的内存的地方。
2 内存管理另一个有效解决方法是。
在一个指针变量(比如 LNode * pNode )初始化的时候指向NULL,
new 和delete要配套使用,delete之后试该指针指向NULL,这样就可以避免被删掉的指针再次被删掉。
例如:
LNode *pNode=NULL;
//........函数代码
pNode=new LNode();//这里开辟给pNode开辟空间之后,pNode就不指向NULL了
//......函数代码
if(pNode!=NULL)//如果不指向NULL就执行下面代码
{
delete pNode;//如果开辟了数组空间就delete []pNode;
pNode=NULL;
}
是del函数出错了,
while(q!=NULL&&q->data!=x)
{
p=q;
q=q->next;
}
if(q->data==x)
{
y=q->data;
p->next=q->next;
delete q;
cout<<"成功删除元素!"<
else
{
cout<<"欲删除的元素不存在!"<
}
这里出了while循环后若p=NULL的话,你再去用if(p->data==x)就会出现指针错误,还有,你在函数最后返回一个Y,可是那个Y没有初使化也会出错,因此我帮你改了一下,下面是全部的代码,只改了del函数,你看下行不行
#include
using namespace std;
typedef int ElemType;
struct LNode
{
ElemType data;
LNode *next;
};
class LinkList
{
private:
LNode *head;
public:
LinkList();
~LinkList();
void create(int n);
void insert();
ElemType del();
void display();
};
LinkList::LinkList()
{
head=new LNode;
head->next=NULL;
head->data=0;
}
LinkList::~LinkList()
{
LNode *p=head->next;
while(p!=NULL)
{
head->next=p->next;
delete p;
p=head->next;
}
delete head;
cout<<"链表已经删除!"<
void LinkList::display()
{
LNode *p;
p=head->next;
while(p!=NULL)
{
cout<
p=p->next;
}
cout<
void LinkList::create(int n)
{
LNode *p;
ElemType x;
int i=1;
while(i<=n)
{
cout<<"请输入第"< cin>>x;
p=new LNode;
p->data=x;
p->next=head->next;
head->next=p;
i++;
}
cout<<"链表建成!"<
void LinkList::insert()
{
int i;
cout<<"请输入要插入元素的位置:"<
cout<<"要插入的元素:"<
cin>>x;
LNode *p,*q,*s;
int k=1;
p=head;
q=p->next;
while(k {
p=q;
q=q->next;
k++;
}
if(k==i)
{
s=new LNode;
s->data=x;
p->next=s;
s->next=q;
cout<<"记录成功插入!"<
else
cout<<"插入失败!"<
}
ElemType LinkList::del()
{
cout<<"请输入要删除的元素:"<
cin>>x;
LNode *p,*q;
ElemType y=1;
int k=1;
p=head;
q=p->next;
while(q!=NULL&&q->data!=x)
{
p=q;
q=q->next;
}
if(q==NULL)
cout<<"欲删除的函数不存在"<
{
y=q->data;
p->next=q->next;
delete q;
cout<<"成功删除元素!"<
return y;
}
void main()
{
int n;
cout<<"请输入链表元素的个数:"<
LinkList L;
L.create(n);
L.display();
L.del();
L.display();
L.insert();
L.display();
system("pause");
}