谁能帮我测试一下这个链表

taifeng123 2008-12-01 02:03:55
#include<iostream>

using namespace std;

//enum bool{false,true};

template<class T>
class LinearList
{
public:
LinearList();
~LinearList();
virtual int Size()const=0;
virtual int Length()const=0;
virtual int Search(T& x)const=0;
virtual int Locate(int i)const=0;
virtual T* getData(int i)const=0;
virtual void setData(int i,T& x)=0;
virtual bool Insert(int i,T& x)=0;
virtual bool Remove(int i,T& x)=0;
virtual bool IsEmpty()const=0;
virtual bool Isfull()const=0;
virtual void Sort()=0;
virtual void input()=0;
virtual void output()=0;
virtual LinearList<T>operator=(LinearList<T>& L)=0;
};
template<class T>
struct LinkNode
{
T data;
LinkNode<T> * link;
LinkNode(LinkNode<T>* ptr=NULL) {link=ptr;}
LinkNode(const T& item,LinkNode<T>* ptr=NULL) {data=item,link=ptr;}
};

template<class T>
class List:public LinearList<T>
{
public:
List(){first=new LinkNode<T>;}
List(const T& x) {frist=new LinkNode<T>(x);}
List(List<T>& L);
~List() {makeEmpty();}
void makeEmpty(); //将链表置为空表
int Length()const; //计算链表的长度
LinkNode<T>* getHead()const {return first;} //返回附加头结点地址
void setHead(LinkNode<T>* p) {first=p;} //设置附加头结点地址
LinkNode<T>* Serch(T x); //搜索含数据x的元素
LinkNode<T>* Locate(int i); //搜素第i个元素的地址
T* getData(int i); //取出第i个元素的值
void setData(int i,T& x); //用x修改第i个元素的值
bool Intert(int i,T& x); //在第i个元素后插入x
bool Remove(int i,T& x); //删除第i个元素,x返回该元素的值
bool IsEmpty()const //判断表空否?空则返回true
{
return first->link==NULL?true:false;}
}
bool Isfull()const { return false;} //判断表满否?不满则返回false
void Sort(); //排序
void input(); //输入
void output(); //输出
List<T>& operator=(List<T>& L); //重载函数:赋值
protected:
LinkNode<T> *first; // 链表的头指针
};
template<class T>
List<T>::List(List<T>& L
{
T value;
LinkNode<T>* srcptr=L.getHead();
LinkNode<T>* destptr=first=new LinkNode<T>;
while(srcptr->link!=NULL)
{
value=srcptr->link->data;
destptr=link= new LinkNode<T>(value);
destptr=destptr->link;
srcptr=srcptr->link;
}
destptr->link=NULL;
};

template<class T>
void List<T>::makeEmpty() //将链表置为空表
{
LinkNode<T>* p;
if(first!=NULL)
{
p=first->link;
first->link=p->link;
delete p;
}
}

template<class T>
int List<T>::Length()const //计算链表的长度
{
LinkNode<T>* p=first->link;
int count;
while(p!=NULL)
{
p=p->link;
count++;
}
return count;
}

template<class T>
LinkNode<T>* List<T>::Serch(T x) //搜索含数据x的元素
{
LinkNode<T>*p=first->link;
while(p!=NULL)
{
if(p->data==x)
break;
else p=p->link;
}
return p;
}

template<class T>
LinkNode<T>* List<T>::Locate(int i) //搜素第i个元素的地址
{
if(i<0)
return NULL;
LinkNode<T>*p=first->link;int k=0;
while(p!=NULL&&k<i)
{
p=p->link;
k++
}
return p;
}

template<class T>
T* List<T>::getData(int i) //取出第i个元素的值
{
if(i<0)
return NULL;
LinkNode<T>* p=Locate(i);
if(p==NULL)
return NULL;
else return &p->data;
}

template<class T>
void List<T>::setData(int i,T& x) //用x修改第i个元素的值
{
if(i<0)
return NULL;
LinkNode<T>* p=Locate(i);
if(p==NULL)
return NULL;
else &p->data=x;
}

template<class T>
bool List<T>::Insert(int i,T& x) //在第i个元素后插入x
{
if(i<0)
return NULL;
LinkNode<T>* p=Locate(i);
if(p==NULL)
return false;
LinkNode<T>* s=new LinkNode<T>(x);
if(s==NULL)
{
cerr<<"存储分配错误!"<<endl;
exit(1);
}
s->link=p->link;
p->link=s;
return true;
}

template<class T>
bool List<T>::Remove(int i,T& x); //删除第i个元素,x返回该元素的值
{
LinkNode<T>* p=Locate(i-1);
if(p==NULL||p=first)
return false;
LinkNode<T>* s;
s=p->link;
p->link=s->link;
x=s->data;
delete s;
return true;
}

template<class T>
void List<T>::Sort(); //排序
{
LinkNode<T>* p=first;
if(p==NULL||p=first)
cerr<<"空链表或链表太短";
while(p!=NULL)
{
p=p->link;
}
}

template<class T>
void List<T>::input() //输入
{
LinkNode<T>* p=first->link;
while(p!=NULL)
{
cin>>p->data;
cout<<endl;
p=p->link;
}
}

template<class T>
void List<T>::output() //输出
{
LinkNode<T>* p=first->link;
while(p!=NULL)
{
cout<<p->data<<endl;
p=p->link;
}
}

template<class T>
List<T>& List<T>::operator=(List<T>& L) //重载函数:赋值
{
if(this==&L)
return *this;
else
{
T value;
LinkNode<T>* p=L.getHead();
LinkNode<T>* s=first=new LinkNode<T>;
while(p->link!=NULL)
{
value=p->link->data;
s->link=new LinkNode<T>(value);
s=s->link;
p=p->link;
}
s->link==NULL;
return *this;
}
}

void main()
{

}
...全文
125 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
taifeng123 2008-12-02
  • 打赏
  • 举报
回复
我的链表中的
enum bool{false,true};
在下面怎么用不了。
elegant87 2008-12-01
  • 打赏
  • 举报
回复
我以前写了一个!也是模板的!你参考一下就会了!
程序还是自己写的好啊!

//带头结点的建表,判空,删除,插入,找x相同值的结点数,就地逆置,用一主函数实现
#include <iostream>

using namespace std;

template <class ElemType>
class List
{
public:
List();
void InitList();//建表
void Show() const;//输出链表
bool IsEmpty();//判空
void Delete(int i);//删除
void Insert(ElemType e,int i);//插入
void FindEqual(int x);//找x相同的节点数
List<int> *Getnode (int n);//取任意节点
void Reverse();//逆置
~List();
private:
ElemType elem;
List *head;//头指针
List *next;//后继
int length;
};

template <class ElemType>
List<ElemType>::List()
{
elem=0;
head=NULL;
next=NULL;
length=0;
}

template <class ElemType>
void List<ElemType>::InitList()
{
List*p1,*p2;
head=new List;
p1=head;
p2=new List;
int count=0;
cout<<"请输入数值(-1 to quit): ";
cin>>p2->elem;
while(p2->elem!=-1)
{
p1->next=p2;
p1=p2;
++count;
p2=new List;
cin>>p2->elem;
}
p1->next=NULL;
length=count;
}

template <class ElemType>
void List<ElemType>::Show() const
{
if(head!=NULL)
{
List *p=head->next;
cout<<"显示链表的值为: ";
while(p)
{
cout<<p->elem<<" ";
p=p->next;
}
cout<<endl;
}
else
cout<<"表为空表!"<<endl;
}

template <class ElemType>
bool List<ElemType>::IsEmpty()
{
if(length==0)
return true;
else
return false;
}

template <class ElemType>
void List<ElemType>::Insert(ElemType e,int i)
{
if(!IsEmpty())
{
List *p=head;
int j=0;
while(p && j<i-1)
{
p=p->next;
++j;
}
if(!p || j>i-1)
cout<<"插入失败!"<<endl;
else
{
List *s=new List;
s->elem=e;
s->next=p->next;
p->next=s;
++length;
cout<<"插入成功!"<<endl;
}
}
else
cout<<"不能插入,表为空表!"<<endl;
}

template <class ElemType>
void List<ElemType>::Delete(int i)
{
int e;
if(!IsEmpty())
{
List *p=head;
int j=0;
while(p && j<i-1)
{
p=p->next;
++j;
}
if(!p && j>i-1)
cout<<"删除失败!"<<endl;
else
{
e=p->next->elem;
p->next=p->next->next;
--length;
cout<<"删除成功!"<<endl;
cout<<"删除的元素是"<<e<<endl;
}
}
else
cout<<"不能删除,表为空表!"<<endl;
}
template <class ElemType>
void List<ElemType>::FindEqual(int x)
{
if(!IsEmpty())
{
List *p;
int i=0;
bool flag=false;
for(p=head->next;p!=NULL;p=p->next)
{
++i;
if(p->elem==x)
{
flag=true;
cout<<"第"<<i<<"个节点的值与"<<x<<"相等"<<endl;
}
}
if(!flag)
cout<<"没有与"<<x<<"相同的值!"<<endl;
}
else
cout<<"表为空表!"<<endl;
}

template <class Elemtype>
List<int> * List<Elemtype>::Getnode(int n)
{
int i=0;
List* p;
p=head;
while(p && i<n)
{
p=p->next;
++i;
}
return p;
}

template <class ElemType>
void List<ElemType>::Reverse()
{
int center=length/2,i;
ElemType temp;
List *p1,*p2;
p1=head;
for(i=length;i>center;--i)
{
p2=Getnode(i);
temp=p1->next->elem;
p1->next->elem=p2->elem;
p2->elem=temp;
p1=p1->next;
}
cout<<"逆置成功!"<<endl;
//Show();
}

template <class ElemType>
List<ElemType>::~List()
{
while(head!=NULL)
{
delete head;
head=head->next;
}
}

int main()
{
char ch;
List<int> obj;
int e,i;
cout<<"\t\t1.创建表"<<endl;
cout<<"\t\t2.插入值"<<endl;
cout<<"\t\t3.删除值"<<endl;
cout<<"\t\t4.相同值"<<endl;
cout<<"\t\t5.输出表"<<endl;
cout<<"\t\t6.逆置表"<<endl;
cout<<"\t\t0.退出"<<endl;
do
{
cout<<"请选择操作: ";
cin>>ch;
switch(ch)
{
case '1':
obj.InitList();
break;
case '2':
cout<<"请输入要插入的值: ";
cin>>e;
cout<<"请输入要插入的位置: ";
cin>>i;
obj.Insert(e,i);
break;
case '3':
cout<<"请输入要删除的节点: ";
cin>>i;
obj.Delete(i);
break;
case '4':
cout<<"请输入要查找相同的值: ";
cin>>i;
obj.FindEqual(i);
break;
case '5':
obj.Show();
break;
case '6':
obj.Reverse();
break;
case '0':
cout<<"\t操作完毕!"<<endl;
break;
default :
cout<<"输入错误,请重新输入: ";
break;
}
}while(ch!='0');
system("pause");
return 0;
}


elegant87 2008-12-01
  • 打赏
  • 举报
回复
帮顶了!
zgy1353246 2008-12-01
  • 打赏
  • 举报
回复
很多问题啊
wudeshou82666 2008-12-01
  • 打赏
  • 举报
回复
mark
aaajj 2008-12-01
  • 打赏
  • 举报
回复
调试,可以学很多的
taifeng123 2008-12-01
  • 打赏
  • 举报
回复
那个括号不匹配了,都匹配的
cyj626 2008-12-01
  • 打赏
  • 举报
回复
up
sagegz 2008-12-01
  • 打赏
  • 举报
回复
晕了...括号都不匹配...
taifeng123 2008-12-01
  • 打赏
  • 举报
回复
全部测一下
lq20051610211 2008-12-01
  • 打赏
  • 举报
回复
要测什么?链表的插入,删除?
kier2 2008-12-01
  • 打赏
  • 举报
回复
又是链表,又是模板的,看晕了!!
lsd1025 2008-12-01
  • 打赏
  • 举报
回复
这个得你自已用的时候测吧?
ysuliu 2008-12-01
  • 打赏
  • 举报
回复
有点长,帮顶了

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧