程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程綜合問答 >> 指針-簡單鏈表類的DELETE函數

指針-簡單鏈表類的DELETE函數

編輯:編程綜合問答
簡單鏈表類的DELETE函數

這是頭文件:
#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釋放了,不應該釋放。你注釋掉,就好了。

ssdut_209
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved