首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

C++静态链表内存异常(代码求修改)

2012-04-12 
C++静态链表内存错误(代码求修改)#includeiostreamusing namespace stdtemplateclass Telemclass Lis

C++静态链表内存错误(代码求修改)
#include<iostream>
using namespace std;
template<class Telem> 
class List 
{
public:
virtual void clear() = 0;
virtual int leng() = 0;
virtual Telem gete(int i) = 0;
virtual int loct(Telem& el) = 0;
virtual bool inst(int loc,Telem& el) = 0;
virtual Telem dele(int loc) = 0;
virtual bool full() = 0;
virtual bool empt() = 0;
virtual void inver() = 0;
};
template<class Telem>
class StList:public List<Telem>
{
struct Tcomp
{
Telem data;
int cur;
};
Tcomp *sls;
int av,st;
int maxlen;
public:
StList();
StList(Telem a[],int n);
~StList(){delete[]sls; };
void clear();
Telem gete(int i);
int leng(){return av;};
int loct(Telem &el);
//Tcomp* index(int n);
bool inst(int loc,Telem &el);
Telem dele(int loc);
bool full(){return av==(maxlen-1);};
bool empt(){return av==0;};
void inver();
};
template<class Telem> StList<Telem>::StList()
{
maxlen = 100;
sls = new Tcomp[100];
st = 1;
for(int i=1;i<100;i++)
{
sls[i].cur=i+1;
}
sls[99].cur = -1;
av = 0;
}
template<class Telem> StList<Telem>::StList(Telem a[],int n)
{
int i;
maxlen = n+100;
  sls = new Tcomp[n+100];
sls[0].cur = 1;
for(i = 0; i<n-1;i++)
{
sls[i+1].data = a[i];
sls[i+1].cur = i+2;
}
sls[n].data = a[n-1];
sls[n].cur = -1;
for(i=0;i<98;i++)
{
sls[n+i+1].cur =n+i+2;
}
av = n;
st = n+1;
}
template<class Telem> void StList<Telem>::clear()
{
delete[]sls;
sls = new Tcomp[100];
for(int i=0;i<100;i++)
{
sls[i].cur=i+1;
}
sls[999].cur = -1;
av = 0;
}
/*template<class Telem> Tcomp* StList<Telem>::index(int i)
{

}*/
template<class Telem> Telem StList<Telem>::gete(int i)
{
try
{
if(i>av||i<=0)
{
throw 1;
}
}
catch (int a)
{
cout<<"查找不到"<<endl;
}
int n=sls[0].cur;
i--;
while(i--)
{
n=sls[n].cur;
}
return sls[n].data;
}
template<class Telem> int StList<Telem>::loct(Telem&el)
{
int n = sls[0].cur;
int i=1; 
//cout<<sls[0].cur<<endl;
while(i<=av&&sls[n].data!=el)
{
n=sls[n].cur;
//cout<<sls[n].data<<endl;
i++;
}
try
{
if(sls[n-1].cur==-1)
{
throw 1;
}
}
catch (int i)
{
cout<<"找不到"<<endl;
}

return i;
}
template<class Telem> bool StList<Telem>::inst(int loc,Telem&el)
{
int m,n;
if(loc<=0||loc>av)
{
return false;
}
if(loc==1)
{
m=sls[st].cur;
sls[st].data = el;
sls[st].cur=sls[0].cur;
sls[0].cur=st;
st = m;
}
else 

m = sls[st].cur;
sls[st].data = el;
n = sls[0].cur;
loc=loc-2;
while(loc--)
{
n=sls[n].cur;
}
sls[st].cur = sls[n].cur;
sls[n].cur = st;
st = m;}
av++;
return true;
}
template<class Telem> Telem StList<Telem>::dele(int loc)
{
int m,n;
Telem a;
try
{
if(loc<=0||loc>av)
{
throw 1;
}
}
catch (int i)
{
cout<<"无法删除"<<endl;
}
if(loc==1)
{
m=sls[0].cur;
a=sls[m].data;
sls[0].cur=sls[m].cur;
}
else
{
n = sls[0].cur;


loc=loc-2;
while(loc--)
{
n=sls[n].cur;
}
m=sls[n].cur;
a=sls[m].data;
sls[n].cur=sls[m].cur;
}
sls[m].data=NULL;
sls[m].cur=st;
st=m;
av--;
return a;
}
template<class Telem> void StList<Telem>::inver()
{
int n=sls[0].cur;
Tcomp m,p;

while(n!=-1)
{
m =sls[n];
p = sls[m.cur];
m.cur=sls[0].cur;
sls[0].cur=n;
n=p.cur;
}
 
}
int main()
{
int a[10]={9,8,7,5,4,3,2,1,0,6};
int c=4,d=10;
StList<int> b(a,10);

/*cout<<b.gete(10)<<endl;
cout<<b.leng()<<endl;
cout<<b.loct(c)<<endl;*/
cout<<b.inst(10,d)<<endl;
cout<<b.dele(10)<<endl;
/*cout<<b.full()<<endl;
cout<<b.empt()<<endl;*/
for(int i=1;i<=10;i++)
{cout<<b.gete(i)<<" ";}
cout<<endl;
b.inver();
for(int i=1;i<=10;i++)
{cout<<b.gete(i)<<" ";}
cout<<endl;
return 0;
}


[解决办法]
inver有问题,修改如下:

C/C++ code
template<class Telem> void StList<Telem>::inver(){  int n=sls[0].cur,n0,n2; //n0=前一节点号, n=当前节点号, n2=下一节点号  Tcomp m;  m = sls[n];  n0 = -1;  while(n!=-1)  {    n2 = m.cur;    sls[n].cur = n0;    m = sls[n2];    n0 = n;    n = n2;  }  sls[0].cur = n0;} 

热点排行