单链表中重复元素的删除;单链表的就地逆置.(一)

2014-11-24 08:58:26 · 作者: · 浏览: 0
[cpp]
/**a. 编写文件LinkNode.h和Linklist.h,定义单链表类模板Linklist,以及其上的TailInsert、遍历及初始化等操作。
b. 利用带头结点的单链表结构,在Linklist.h文件中添加两个成员函数:
(1) Delete(Linklist &L)用于实现单链表中重复元素的删除;
(2) Reverse(Linklist &L)用于实现单链表的就地逆置(即在原表的存储空间实现元素的逆置)。
编写算法Print(const int &)用于实现数据元素的输出。
*/ www.2cto.com
#include
#include"LinkList.h"
using namespace std;
void print(const int& e)
{
cout< }
int main()
{
LinkList lt;
int array[12] = {2,3,3,4,5,5,7,8,8,9,10,23};
for(int i = 0;i <= 11;i++)
{
cout< lt.Append(array[i]);
}
cout< lt.Reverse();
lt.Traverse(print);
cout< lt.Delete();
lt.Traverse(print);
return 0;
}
/***************头文件***************/
#include
template
struct LinkNode
{
T data;
LinkNode *next;
};

template
class LinkList
{
public:
LinkList();
LinkList(const LinkList&);
~LinkList();
bool IsEmpty()const{return len<=0;}
int Length()const{return len;}
void Clear();
bool GetElem(T&,int)const;
bool SetElem(const T&,int);
int LocateElem(const T&)const;
int LocatePrior(const T&)const;
int LocateNext(const T&)const;
bool Insert(const T&,int);
bool Append(const T&);
bool Delete(T&,int);
void Traverse(void(*visit)(const T&))const;
LinkList& operator=(const LinkList&);
void Delete();
void Reverse();

private:
int len;
LinkNode *head;
LinkNode *tail;
void CopyFrom(const LinkList&);
};
using namespace std;
template
LinkList::LinkList()//默认构造函数
{
len=0;
head=tail=new LinkNode;
head->next=NULL;
}
template
LinkList::LinkList(const LinkList& r)//拷贝构造函数
{
CopyFrom(r);
}
template
LinkList::~LinkList()//析构函数
{
Clear();
delete head;
}
template
void LinkList::Clear()//清空链表
{
LinkNode* p=head->next,*q;
while(p)
{
q=p->next;
delete p;
p=q;
}
tail=head;
head->next=NULL;
len=0;
}
template
bool LinkList::GetElem(T&e,int i)const//获得第i位的元素
{
if(i<1 || i>len)
return false;
LinkNode *p=head->next;
int k=1;
while(k {
p=p->next;
k++;
}
e=p->data;
return true;
}
template
bool LinkList::SetElem(const T&e,int i)//设置第i位置的元素为e
{
if(i<1 || i>len)
return false;
LinkNode *p=head->next;
int k=1;
while(k {
p=p->next;
k++;
}
p->data=e;
return true;
}
template
int LinkList::LocateElem(const T&e)const
{
int i=1;
LinkNode *p=head->next;
while(p && p->data!=e)
{
i++;
p=p->next;
}
if(p)
return i;
return 0;
}
template
int LinkList::LocatePrior(const T&e)const
{
int i=LocateElem(e);
if(i>1)
return i-1;
else
return 0;
}
template
int LinkList::LocateNext(const T&e)const
{
int i=LocateElem(e);
if(i>=1 && i return i+1;
else
return 0;
}
template
bool LinkList::Insert(const T&e,int i)
{
LinkNode *p,*q;
int k=1;
if(i<1 || i>len+1)
return false;
q=new LinkNode;
q->data=e;
p=head;
while(k {
p=p->next;
k++;
}
q->next=p->nex