包括了添加删除访问查找反转(递归和非递归)等一系列操作。
#include<iostream>
using namespace std;
template<class Type> class List;
template<class Type> class ListNode{
friend class List<Type>;
Type data; //结点数据
ListNode<Type> *link; //结点链接指针
public:
ListNode(); //链表结点构造函数
ListNode(const Type &item);
//给出当前结点的下一结点地址
ListNode<Type> *NextNode(){
return link;
}
//在当前结点后插入结点p
void InsertAfter(ListNode<Type> *p);
//摘下当前结点的下一结点
ListNode<Type> *RemoveAfter();
};
template<class Type> class List{
ListNode<Type> *first, *last;
public:
//创建数据为item,指针为next的新结点
ListNode<Type> *GetNode(const Type &item, ListNode<Type> *next);
//构造函数
List(){
last = first = new ListNode<Type>();
}
List(const Type &value){
last = first = new ListNode<Type>(value);
}
~List(); //析构函数
void MakeEmpty(); //链表置空
int Length() const; //求链表长度
ListNode<Type> *Find(Type value);
ListNode<Type> *Find(int i);
int Insert(Type value, int i);
bool Remove(int i);
Type *Get(int i);
Type Get_Min();
void Reverse();
void Reverse(ListNode<Type> *head);
};
template<class Type>
ListNode<Type>:: ListNode(): link(NULL){}
template<class Type>
ListNode<Type>:: ListNode(const Type &item): data(item), link(NULL){}
template<class Type>
void ListNode<Type>:: InsertAfter(ListNode<Type> *p){
p->link = link;
link = p;
}
//摘下当前结点的下一结点
template<class Type>
ListNode<Type> *ListNode<Type>:: RemoveAfter(){
ListNode<Type> *tempptr = link;
if(link == NULL) return NULL; //没有下一结点则返回空指针
link = tempptr->link; //重新链接
return tempptr; //返回下一结点地址
}
template<class Type>
ListNode<Type> *List<Type>:: GetNode(const Type &item, ListNode<Type> *next = NULL){
ListNode<Type> *newnode = new ListNode<Type>(item);
newnode->link = next;
return newnode;
}
//析构函数 (链表的公共操作)
template<class Type>
List<Type>:: ~List(){
//链表置空,再删去表头结点
MakeEmpty();
delete first;
}
//删去链表中除表头结点外的所有其他结点
template<class Type>
void List<Type>:: MakeEmpty(){
ListNode<Type> *q;
while(first->link != NULL){
//将表头结点后第一个结点从链中摘下
q = first->link;
first->link = q->link;
delete q; //释放它
}
last = first; //修改表尾指针
}
//求单链表的长度
template<class Type>
int List<Type>:: Length()const{
ListNode<Type> *p = first->link; //检测指针p指示第一个结点
int count = 0;
while(p != NULL){
p = p->link;
count++;
}
return count;
}
//在链表中从头搜索其数据值为value的结点
template<class Type>
ListNode<Type> *List<Type>:: Find(Type value){
ListNode<Type> *p = first->link;
while(p != NULL && p->data != value)
p = p->link;
return p;
}
//在链表中从头搜索第 i 个结点,不计头结点
template<class Type>
ListNode<Type> *List<Type>:: Find(int i){
if(i < -1) return NULL;
if(i == -1) return first;
ListNode<Type> *p = first->link;
int j = 0;
while(p!=NULL && j<i){
p = p->link;
j++;
}
return p;
}
//将含value的新元素插入到链表第 i 个位置
template<class Type>
int List<Type>:: Insert(Type value, int i){
// p 指向链表第 i-1个结点
ListNode<Type> *p = Find(i-1);
if(p == NULL) return 0;
ListNode<Type> *newnode = GetNode(value, p->link);//创建结点
if(p->link == NULL) last = newnode;
p->link = newnode; //重新链接
return 1;
}
//从链表中删去第 i 个结点,返回能否成功删除
template<class Type>
bool List<Type>:: Remove(int i){
ListNode<Type> *p = Find(i-1), *q;
if(p==NULL || p->link==NULL)
return 0;
q = p->link;
p->link = q->link;
if(q == last) last = p;
delete q;
return 1;
}
//提取第 i 个结点的数据
template<class Type>
Type *List<Type>:: Get(int i){
// p 指向链表第 i 个结点
ListNode<Type> *p = Find(i);
if(p==NULL || p==first)
return NULL;
else return &(p->data);
}
//返回链表中最小的元素
template<class Type>
Type List<Type>:: Get_Min(){
ListNode<Type> *p = first->link;
Type ans = p->data;
while(p->link != NULL){
p = p->link;
ans = min(ans, p->data);
}
return ans;
}
//反转链表(非递归)
template<class Type>
void List<Type>:: Reverse(){
ListNode<Type> *current = first->link;
ListNode<Type> *next = current->link;
ListNode<Type> *previous = NULL;
while(current!=NULL){
next = current->link;
current->link = previous;
previous = current;
current = next;
if(next != NULL)
next = next->link;
}
first->link = previous;
}
//反转链表(递归)
template<class Type>
void List<Type>:: Reverse(ListNode<Type> *p){
if(p->link == NULL){
first->link = p;
return;
}
Reverse(p->link);
p->link->link = p;
p->link = NULL;
}
int main(){
List<double> a;
double d = 20.0;
a.Insert(2, 0);
a.Insert(d, 0);
a.Insert(d+1, 1);
a.Insert(d+2, 2);
a.Insert(d+3, 3);
for(int i = 0; i < a.Length(); i++)
cout << *a.Get(i) << endl;
a.Reverse(); //非递归
cout << "After reverse:" << endl;
for(int i = 0; i < a.Length(); i++)
cout << *a.Get(i) << endl;
cout << "After reverse(Recursion):" << endl;
a.Reverse(a.Find(0)); //递归
for(int i = 0; i < a.Length(); i++)
cout << *a.Get(i) << endl;
cout << "min: " << a.Get_Min() << endl;
cout << a.Length() << endl;
a.Remove(1);
cout << a.Length() << endl;
return 0;
}