這是頭文件:
#include
using namespace std;
template
class KNOTE
{
public:
A data;
KNOTE * next;
KNOTE(A data,KNOTE * next);
virtual ~KNOTE();
};
template
KNOTE::KNOTE(A data,KNOTE * next)
{
this->data=data;
this->next=next;
}
template
KNOTE::~KNOTE()
{
delete next;
}
template
class LI
{
private:
KNOTE * headp;
public:
LI();
~LI();
KNOTE * GETP(int pos);
int length();
bool CLEAR();
bool SETV(int pos,A v);
bool GETV(int pos,A & v);
bool INSERT(int pos,A v);
bool DELETE(int pos,A & v);
};
template
LI::LI()
{
headp=new KNOTE(0,NULL);
}
template
LI::~LI()
{
A temp;
while(length()>0)
{
DELETE(1,temp);
}
}
template
int LI::length()
{
int len=0;
KNOTE * tempp=headp->next;
while(tempp!=NULL)
{
len++;
tempp=tempp->next;
}
return len;
}
template
KNOTE * LI::GETP(int pos)
{
KNOTE * tempp=headp;
if(poslength())
return NULL;
else
{
int cur=0;
while(cur!=pos)
{
tempp=tempp->next;
cur++;
}
return tempp;
}
}
template
bool LI::SETV(int pos,A v)
{
KNOTE * tempp;
if(poslength())
return false;
else
{
tempp=GETP(pos);
tempp->data=v;
return true;
}
}
template
bool LI::GETV(int pos, A & v)
{
KNOTE * tempp;
if(poslength())
return false;
else
{
tempp=GETP(pos);
v=tempp->data;
return true;
}
}
template
bool LI::CLEAR()
{
KNOTE * tempp1=headp->next;
KNOTE * tempp2;
while(tempp1!=NULL)
{
tempp2=tempp1->next;
delete temp1;
temp1=temp2;
}
}
template
bool LI::INSERT(int pos,A v)
{
if(poslength()+1)
return false;
else
{
KNOTE * pre_p;
KNOTE * new_p;
pre_p=GETP(pos-1);
new_p=new KNOTE(v,pre_p->next);
pre_p->next=new_p;
return true;
}
}
template
bool LI::DELETE(int pos,A &v)
{
if(poslength())
return false ;
else
{
KNOTE * pre_p;
KNOTE * temp_p;
pre_p=GETP(pos-1);
//KNOTE * pre_p1=headp->next;
temp_p=pre_p->next;
pre_p->next=temp_p->next;
v=temp_p->data;
//KNOTE * pre_p2=headp->next;
delete temp_p;
//KNOTE * pre_p3=headp->next;
return true;
}
}
以下是主函數
#include "head.h"
int main()
{
LI aa;
int v;
for(int i=1;i<=10;i++)
{
aa.INSERT(1,i+2);
}
for(int i=1;i<=10;i++)
{
aa.GETV(i,v);
cout<<v<<endl;
}
return 0;
}
程序可以運行並輸出結果,但是結束時程序報錯“簡單鏈表.exe 中的 0x01281a47 處未處理的異常: 0xC0000005: 讀取位置 0xfeeefef6 時發生訪問沖突”。疑惑:為什麼在 DELETE中 temp_p=pre_p->next;已經對頭指針指針域改變,但deletetemp_p後還是會報錯?求大神回答
暈,看了半天,總算知道了
template<class A>
KNOTE<A>::~KNOTE()
{
//delete next;
}
這裡你把next釋放了,不應該釋放。你注釋掉,就好了。