已经测试完成,无bug
LinkNode.h(主要用来做父类,节点的定义)
#include <iostream>
using namespace std;
# ifndef INCLUDE_LINKEDLIST_H_
# define INCLUDE_LINKEDLIST_H_
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:
List() {
first = new LinkNode<T>(0,NULL);
}
List(const T&x)
{
first=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>*Search(T x) ;//搜索含数据x的元素
LinkNode<T>*Locate(int i);//搜索第i个元素的地址
T*getData(int i); //取出第i个元素的数值
void setData(int i,T&x);//用x修改i位置的数值
bool Insert(int i,T&x) ;//在第i个元素后插入x元素
bool Remove(int i,T&x) ;//删除第i个元素,x返回该元素的值
bool IsEmpty()const{ //这里用常函数到底是用来干嘛的
//判断链表是否为空
return first->link==NULL ?true:false;
}
bool IsFull()const
{
return false;// 好家伙,直接返回错误了,还判断个鬼啊
}
void Sort();//排序函数
void createlist(T end);
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>*desptr=first=new LinkNode<T>;
while(srcptr->link!=NULL)//逐个节点复制
{
value=srcptr->link->data;
desptr->link=new LinkNode<T> (value);
desptr=desptr->link;
srcptr=srcptr->link;
}
};
template <class T>
void List<T>::makeEmpty()//将链表置为空
{
LinkNode<T>*q; //建
while(first->link!=NULL)
{
//当链表不为空时,删除节点
q=first->link;//指
first->link=q->link;//摘
delete q; //删
}
};
template <class T>
int List<T>::Length()const//计算带附加节点的链表长度
{
LinkNode<T>*p=first->link;//从头节点开始