这应该是一个内存泄露问题,求解!!
看代码
#include<iostream>
#include<stdlib.h>
#include<time.h>
using namespace std;
template<class T>
class link
{
public:
T element;
link<T> *next;
link(const T& elemval, link * nextval=NULL);
link(link * nextval=NULL);
~link();
};
template<class T>
class list
{
private:
link<T>*head;
link<T>*tail;
link<T>*curr;
public:
list(); //构造函数
~list(); //析构函数
void clear(); //清空
void insert(const T &); //在当前位置插入
void append(const T&); //在尾部追加
T remove(); //移除
void setFirst(); //把当前结点置前
void next(); //将游标指向下一个结点
void prev(); //将游标指向前一个结点
int length(); //计算单链表长度
void setPos(const int); //设置节点位置
void setValue(const T&); //设置当前值
T currValue();
bool isEmpty(); //判断是否为空
bool find(const T&); //查找
void Display(); //遍历
};
template<class T>
link<T>::link(const T& elemval, link * nextval)
{
element = elemval;
next = nextval= NULL;
}
template<class T>
link<T>::link(link * nextval)
{
next = nextval= NULL;
}
template<class T>
link<T>::~link(){}
template<class T>
void list<T>::Display()
{
link<T> *p=head;
cout<<head->element<<" ";
while(p!=NULL)
{
cout<<p->element<<" ";
p=p->next;
}
cout<<endl;
}
template<class T>
list<T>::list()
{
tail=head=curr=new link<T>;
}
template<class T>
list<T>::~list()
{
clear();
}
template<class T>
void list<T>::clear()
{
link<T> *p=head->next;
while(p!=NULL)
{
link<T> *q=p;
p=p->next;
delete q;
}
head->next=NULL;
}
template<class T>
void list<T>::insert(const T & t)
{
link<T> *q;
if((curr!=tail)&&(curr!=NULL))
{
q=new link<T>(t,NULL);
q->next=curr->next;
curr->next=q;
}
if(curr==tail)
curr->next=new link<T>(t,NULL);
tail=curr->next;
}
template<class T>
void list<T>::append(const T &item)
{
tail=tail->next=new link<T>(item,NULL);
}
template<class T>
T list<T>::remove()
{
T i=curr->next->element;
link<T> *p=curr->next;
curr->next=p->next;
if(tail==p)
tail=curr;
delete p;
return i;
}
template<class T>
void list<T>::setFirst()
{
curr=head;
}
template<class T>
void list<T>::next()
{
curr=curr->next;
}
template<class T>
void list<T>::prev()
{
link<T> *p=head;
if((curr==NULL)||(curr==p->next))
{
curr=NULL;
}
while((p->next!=NULL)&&(p->next!=curr))
p=p->next;
curr=p;
}
template<class T>
int list<T>::length()
{
int i=0;
link<T>*p=head->next;
while(p!=NULL)
{
p=p->next;
i++;
}
return i;
}
template<class T>
void list<T>::setPos(const int pos)
{
curr=head;
int i=0;
while((curr!=NULL)&&(i<pos))
{
curr=curr->next;
i++;
}
}
template<class T>
void list<T>::setValue(const T& val)
{
curr->element=val;
}
template<class T>
T list<T>::currValue()
{
return curr->element;
}
template<class T>
bool list<T>::isEmpty()
{
if(head->next=!NULL)
{
return true;
}
else
{
return false;
}
}
template <class T>
bool list<T>::find(const T &value)
{
curr=head->next;
while(curr)
{
if(curr->element==value)
{
return true;
}
curr=curr->next;
}
return false;
}
int main()
{
list<int>list1;
int a[10],n;
for (int i=0;i<10;i++)
{
srand(time(0));
a[i]=rand()%100+1;
for (int k=0;k<i;k++)
if (a[k]==a[i])
{
i--;
break;
}
}
for(int j=0;j<10;j++)
list1.append( a[j]);
cout<<"判断链表是否为空:";
if(list1.isEmpty())
{
cout<<"链表不为空 "<<endl;
cout<<"则此链表为:";
list1.Display();
}
else
cout<<"链表为空 "<<endl;
cout<<"查找链表中值为n的数据:";
cin>>n;
if(list1.find(n))
cout<<"该数据在链表中。"<<endl;
else
cout<<"该数据不在链表中!"<<endl;
cout<<"确定当前指针的位置为n:";
cin>>n;
list1.setPos(n);
cout<<"当前指针位置的值为:";
cout<<list1.currValue()<<endl;
cout<<"在当前指针后插入一个数据n:";
cin>>n;
list1.insert(n);
list1.setFirst();
cout<<"此时链表数据为:";
list1.Display();
cout<<"确定当前指针的位置为n:";
cin>>n;
list1.setPos(n);
cout<<"当前指针位置的值为:";
cout<<list1.currValue()<<endl;
list1.next();
cout<<"移动后指针指的数据为:"<<list1.currValue()<<endl;
cout<<"链表长度为:";
cout<<list1.length()<<endl;
cout<<"确定当前指针的位置为n:";
cin>>n;
list1.setPos(n);
cout<<"当前指针位置的值为:";
cout<<list1.currValue()<<endl;
list1.prev();
cout<<"移动后指针指的数据为:"<<list1.currValue()<<endl;
list1.setFirst();
cout<<"此时链表数据为:";
list1.Display();
cout<<"确定当前指针的位置为n:";
cin>>n;
list1.setPos(n);
cout<<"当前指针位置的值为:";
cout<<list1.currValue()<<endl;
cout<<"替换当前指针位置的值n: ";
cin>>n;
cout<<"替换后的值为:";
list1.setValue(n);
cout<<list1.currValue()<<endl;
cout<<"移除当前指针后边的值为:"<<list1.remove()<<endl;
list1.setFirst();
cout<<"此时链表数据为:";
list1.Display();
return 0;
}
编译器不报错,但就是运行不下来,看了好多遍,无从下手,求助各位高手..谢了..
[解决办法]
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。
[解决办法]
我编译一下,报错了:head->next=!NULL这一行错了。可以运行,就是很慢,运行中有错。你自己看看,不懂再问把。