//------------------------------------------ClassLinkList.h------------------------------------------
template <class T> class linkList;
template <class T>
class Link
{
friend class linkList<T>;
private:
T data; // 用于保存结点元素的内容
Link<T> * next; // 指向后继结点的指针
public:
Link(const T info,Link<T>* nextValue=NULL)
{
data=info;
next=nextValue;
}
Link(Link<T>* nextValue)
{
next=nextValue;
}
};
template <class T>
class linkList
{
private:
Link<T> *head, *tail; // 单链表的头、尾指针
Link<T> *setPos(const int i); // 返回线性表指向第p个元素的指针值
public:
linkList(int s); // 构造函数
~linkList(); // 析构函数
bool isEmpty(); // 判断链表是否为空
void clear(); // 将链表存储的内容清除,成为空表
int length(); // 返回此顺序表的当前实际长度
bool append(const T value); // 在表尾添加一个元素value,表的长度增1
bool insert(const int i, const T value); // 在位置i上插入一个元素value,表的长度增1
bool myDelete(const int i); // 删除位置i上的元素,表的长度减 1
bool getValue(const int i, T& value); // 返回位置i的元素值
bool getPos(int &i, const T value); // 查找值为value的元素,返回第1次出现的位置
void output();
};
template <class T> //输出链表
void linkList<T>::output()
{
int i;
Link<T> *p=head;
int size=length();
cout<<"the length of linkList is "<<size<<endl;
for(i=0;i<size;i++)
{
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
template <class T> // 函数返回值是找到的结点指针,线性表的元素类型为T
Link<T> * linkList <T>:: setPos(int i)
{
if(i<0||i>=length())
{
cout<<"错误!所要查找的位置不存在!"<<endl;
return false;
}
else
{
if(i==0)
return head;
else
{
int count = 0;
Link <T> *p=head;
while (p != NULL && count <i)
{
p = p-> next;
count++;
}
return p; // 指向第 i 结点,i=0,1,2,…,当链表中结点数小于i时返回NULL
}
}
}
template <class T>
linkList <T>::linkList(int s) //构造函数
{
T value;
int count=0;
cout<<"You should input "<<s<<" datas!"<<endl
<<"please input the first data(end with enter):";
cin>>value;
head=tail=new Link<T>(value);
while(count<s-1)
{
cout<<"please input the next data(end with enter):";
cin>>value;
append(value);
count++;
}
}
template <class T>
linkList<T>::~linkList() //析构函数
{
Link<T> *p,*q;
p=head;
while(p!=NULL)
{
q=p->next;
delete p;
p=q;
}
cout<<"调用析构函数"<<endl;
}
template <class T> //判断链表是否为空
bool linkList<T>::isEmpty()
{
if(head==NULL)
return true;
else
return false;
}
template <class T> //清空链表
void linkList<T>::clear()
{
Link<T> *p,*q;
p=head;
while(p!=NULL)
{
q=p->next;
delete p;
p=q;
}
head=NULL;
}
template <class T> //返回当前链表的长度
int linkList<T>::length()
{
Link<T> *p=head;
int count=0;
if(p==NULL)
return count;
else
{
while (p!=NULL)
{
p=p->next;
count++;
}
return count;
}
}
template <class T>
bool linkList<T>::append(const T value) //向链表尾端添加一个节点
{
Link<T> *p=new Link<T>(value);
tail->next=p;
tail=p;
return true;
}
template <class T> //插入数据内容为value的新结点作为第i个结点
bool linkList<T> :: insert(const int i, const T value)
{
Link<T> *p, *q;
if ((p = setPos(i -1)) == NULL)
{ // p 是第i个结点的前驱
cout << " 非法插入点"<<endl;
return false;
}
q = new Link<T>(value, p->next);
p->next = q;
if (p == tail) // 插入点在链尾,插入结点成为新的链尾
tail = q;
return true;
}
template <class T> // 删除位置为i的节点
bool linkList<T>:: myDelete(const int i)
{
Link<T> *p, *q;
if ((p = setPos(i-1)) == NULL || p == tail)
{ // 待删结点不存在,即给定的i大于当前链中元素个数
cout << " 非法删除点 " <<endl;
return false;
}
q = p->next; // q是真正待删结点
if (q == tail)
{ // 待删结点为尾结点,则修改尾指针
tail = p;
p->next = NULL;
delete q;
}
if (q != NULL)
{ // 删除结点q 并修改链指针
p->next = q->next;
delete q;
}
return true;
}
template <class T>
bool linkList<T>::getValue(const int i, T& value) //返回位置为i的节点中的值
{
Link<T> *p=setPos(i);
if(p==NULL)
{
cout<<"错误!所要进行查询的节点不存在。"<<endl;
return false;
}
else
{
value=p->data;
return true;
}
}
template <class T>
bool linkList<T>::getPos(int& i,const T value) //返回值为value的第一个节点
{
T data;
for(i=0;i<length();i++)
{
getValue(i,data);
if(data==value)
{
return true;
break;
}
}
cout<<"所要查找的值不存在!"<<endl;
return false;
}
//------------------------------------------------main fun.cpp---------------------------------------------------
#include "iostream"
#include "ClassLinkList.h"
using namespace std;
int main()
{
cout<<"--------------初始化链表---------------"<<endl;
linkList<int> link(6);
link.output();
cout<<"-----------检验链表是否为空------------"<<endl;
if(link.isEmpty())
cout<<"链表为空!"<<endl;
else
cout<<"链表不为空!"<<endl;
cout<<"-----------链表末尾添加节点------------"<<endl;
link.append(7);
link.output();
cout<<"--------在第六节点位置添加节点---------"<<endl;
link.insert(6,1);
link.output();
cout<<"-------------删除第三节点--------------"<<endl;
link.myDelete(3);
link.output();
cout<<"-----------返回第六节点的值------------"<<endl;
int value;
link.getValue(6,value);
cout<<"the value which you find is "<<value<<endl;
link.output();
cout<<"----返回所要查找的值出现的第一位置-----"<<endl;
int position;
link.getPos(position,1);
cout<<"the value you find first appeaed in position "<<position<<endl;
link.output();
cout<<"----------------清空链表----------------"<<endl;
link.clear();
if(link.isEmpty())
cout<<"链表为空!"<<endl;
else
cout<<"链表不为空!"<<endl;
link.output();