关于链表的问题
一个题目要求函数,写了两三天还是写不出来。原来的类全是模板写的,一部分功能是直接抄书例题的。因为写不出来,所以把代码简化了,重写了这题需要的功能,不过还是错了。
Line是个线性类,按顺序存储数据。
Chain是个链表类,每个节点ChainNode保存数据和下一个节点的地址。
题目要求是写一个函数调用Insert()和Take()将Line对象的数据放入Chain对象里。
下面代码debug时在Transfrom里面的Insert函返回的非常奇怪,返回主函数的上面的Insert()去了,即使把上面的调用Insert函数去掉。代码执行完毕后还是会错了。
还有我这vc++在debug时碰到cout和new就弹出来一堆东西像内存地址,汇编代码,需要文件之类的东西无法再继续下去了.
#include <iostream>
using namespace std;
class Chain;
class Line
{
friend Chain;
public:
Line(int M=10);
~Line()
{delete []element;}
int Length()
{return length;}
void Take(int k,int& x);
Line& Insert(int k,int x);
void Output(ostream& out);
private:
int length;
int Max;
int *element;
};
Line::Line(int M)
{
Max=M;
element=new int[Max];
length=0;
}
void Line::Take(int k,int& x)//第k个位置,拿出x
{
x=element[k];
}
Line& Line::Insert(int k,int x)//第k个位置,放入x
{
int i;
if(k>=length)
{
Max=2*Max;
int *n=new int[Max];
for(i=0;i<length;i++)
n[i]=element[i];
delete []element;
element=n;
}
for(i=length;i>=k-1;i--)
element[i+1]=element[i];
element[k]=x;
length++;
return *this;
}
void Line::Output(ostream& out)
{
for(int i=0;i<length;i++)
out<<element[i]<<" ";
cout<<endl;
}
ostream& operator<<(ostream& out, Line& x)
{
x.Output(out);
return out;
}
class Chain;
class ChainIterator;
class ChainNode
{
friend Chain;
friend class ChainIterator;
private:
int data;
ChainNode *link;
};
class Chain
{
public:
Chain(){first=0;}
~Chain();
int Length();
Chain& Insert(int k,int x);
void Output(ostream& out) ;
Chain& Transform(Line x);
private:
ChainNode *first;
};
Chain::~Chain()
{
ChainNode *t;
while(first)
{
t=first->link;
delete first;
first=t;
}
}
int Chain::Length()//返回长度
{
int i=0;
ChainNode *t=first;
while(t)
{
t=t->link;
i++;
}
delete t;
return i;
}
Chain& Chain::Insert(int k,int x)//第k个位置,插入x
{
ChainNode *t;
t=new ChainNode;
t->data=x;
t->link=0;
if(k==0) first=t;
else
{
ChainNode *p=first;
for(int i=1;i<k&&p;i++)
p=p->link;
p->link=t;
}
return *this;
}
Chain& Chain::Transform(Line x)
{
int t;
for(int i=0;i<x.Length();i++)
{
x.Take(i,t);
Insert(i,t); //从上一行拿出数据存进去应该是没问题的
}
return *this;
}
void Chain::Output(ostream& out)
{
ChainNode *current;
for(current=first;current;current=current->link)
out<<current->data<<" ";
cout<<endl;
}
ostream& operator<<(ostream&out,Chain& x)
{
x.Output(out);
return out;
}
int main()
{
Chain a;
int i;
for(i=0;i<10;i++)
a.Insert(i,i+1);//下面的Tranform里的Insert会返回到这个位置是怎么回事?
cout<<a;
i=a.Length();
cout<<i<<endl;
Line l;
l.Insert(0,3).Insert(1,2).Insert(2,12).Insert(3,21).Insert(4,4);
cout<<l;
Chain b;
b.Transform(l); //这个函数出问题了
cout<<b;
return 0;
}