template <class T>
Node<T>::Node(const T& item,Node<T> *ptr):data(item),next(ptr)
{}
template <class T>
Node<T>::~Node(void)
{}
template <class T>
Node<T> * Node<T>::NextNode(void) const
{
return next;
}
template <class T>
void Node<T>::InsertAfter(Node<T> *p)
{
p->next=next; //将当前结点的后继结点链接到结点 p 之后
next=p; //将结点 p 作为当前结点的后继结点
}
template <class T>
Node<T> * Node<T>::DeleteAfter(void)
{
Node<T> *ptr=next; //保存当前结点的后继结点
if(ptr==NULL) return NULL; //若没有后继结点,则返回空指针
next=ptr->next; //当前结点指向其原来的后继的后继,即 ptr 的后继
return ptr; //返回指向被删除结点的指针
}
//链表类的定义
#ifndef LINKEDLIST_H
#define LINKEDLIST_H
#include"Node.cpp"
template<class T>
class LinkedList
{
private:
Node<T> *front,*rear; //定义指向头指针和指向尾指针
Node<T> *prevptr,*currptr; //用于访问数据、插入和删除结点指针
int size; //表中的结点数
int position; //表中当前结点位置计数
Node<T>*GetNode(const T& item,Node<T>*ptr=NULL); //申请结点的函数
void FreeNode(Node<T>*p); //释放结点的函数
public:单链表程序
LinkedList(void); //构造函数
~LinkedList(void); //析构函数
int Size(void)const; //取表中结点大小的函数
int SetPosition(int pos); //重定位当前结点的函数
int Getposition(void)const; //取当前结点位置的函数
int NextNode(void); //将后继结点设置为当前结点的函数
int InsertAt(const T&item);//在当前结点处插入新结点的函数
void InsertAfter(const T&item); //在当前结点后插入新结点的函数
void DeleteAt(void); // 删除当前结点的函数
void DeleteAfter(void); //删除当前结点后继的函数
T GetData(void)const; //获取当前结点数据的函数
void SetData(const T& item); //修改当前结点数据的函数
bool IsEmpty(void)const;//判断链表是否为空的函数
void Clear(void); //清空链表的函数
void WuXu(int k); //显示最小值
};
# endif
// 链表的类的实现文件 LinkedList.cpp
#include"LinkedList.h"
#include<iostream.h>
#include<stdlib.h>
template <class T>
Node<T>*LinkedList<T>::GetNode(const T&item,Node<T>*ptr) //申请结点空间的函数
{
Node<T>*newNode=new Node<T>(item);
if(!newNode) //若动态内存申请失败,给出相应的提示并返回空指针
{
cerr<<" GetNode: Memoery allocation failed!"<<endl;
return NULL;
}
return newNode; //返回指向新生成结点的指针
}template <class T>
void LinkedList<T>::FreeNode(Node<T>*ptr) //释放结点空间的函数
{
if(!ptr) //若ptr为空,则给出相应提示并返回
{
cerr<<"FreeNode: invaild node pointer!"<<endl;
return ;
}
delete ptr;//释放结点占用的内存空间
}
template <class T>
LinkedList<T>:: LinkedList(void)//建立一个空链表
{
front=NULL;
rear=NULL;
prevptr=NULL;
currptr=NULL;
size=0;
position=-1;
}
template <class T>
LinkedList<T>::~LinkedList(void) //析构函数
{
Clear(); //清空链表,释放所有的结点的内存空间
}
template <class T>
int LinkedList<T>::Size(void)const // 取连表的大小的函数
{
return size;
}
template<class T>
int LinkedList<T>::NextNode(void) //将当后继结点设置为当前结点的函数
{
if(position>=0&&position<size)//若当前结点存在,将其后继结点设置为当前结点
{
position++;
prevptr=currptr;
currptr=currptr->NextNode();
}
else
{
position=0;
prevptr=currptr;
currptr=currptr->NextNode(); //否则将当前结点的位置设为表尾后
}
return position; //返回新的位置
}
template <class T>
int LinkedList<T>:: Getposition(void)const
{
return position;
}
template <class T>
int LinkedList<T>::SetPosition(int pos) //重置当前结点位置的函数
{
if(!size) return -1; //若为空,则返回-1
prevptr=NULL; //寻找对应结点
currptr=front;
position=0;
for(int k=0;k<pos;k++)//寻找对应结点
{
position++;
prevptr=currptr;
currptr=currptr->NextNode();
}
//返回当前结点位置
return position;}template <class T>
int LinkedList<T>::InsertAt(const T&item) //在当前结点处插入新的结点的函数
{
Node<T> L*newNode;
if(!size) //在空表中插入
{
newNode=GetNode(item,front);
front=rear=newNode;
postion=0;
}
else if(!prevptr) //在表头结点插入
{
newNode=GetNode(item,front);
front=newNode;
}
else //在表中间位置插入
{
newNode=GetNode(item, currptr);
prevptr->InsertAfter(newNode);
}
size++; //增加链表的长度
currptr=newNode;//新插入的结点作为当前结点