单链表C++实现
//单链表C++实现
#include<iostream>
//节点定义
template<class Type>
class ListNode
{
friend class List<Type>;
private:
T data;
ListNode * next;
public:
ListNode();
ListNode(const Type & item);
};
//链表定义
template <class T>
class List
{
private:
ListNode<T> * first, *last;//first是表头指针,指向第一个节点
public:
ListNode<T>*GetNode(const T & item, ListNode<T>*next);//const表示item这个传入的元素不可更改,这对引用来说是很有必要的
List(const Type & value)
{
last = first = new ListNode<T>(value);
}//构造函数
~List();//析构函数
void MakeEmpty();//链表置空
int Length()const;//求链表长度
ListNode<T>*Find(T x);
ListNode<T>*Find(int i);
int Insert(T value, const int i);
T *Remove(int i);
};
template<class T>
ListNode<T>::ListNode() :next(NULL){}
template<class T>
ListNode<T>::ListNode(const T & item) : data(item), next(NULL){}
template<class T>
ListNode<T>* List<T>::GetNode(const T & item, ListNode<T>*next = null)
{
ListNode<T> *newNode = new ListNode<T>(item);
newNode->next = next;
return newNode;
}
template<class T>
List<T>::~List()
{
MakeEmpty();//清空除first以外的所有所有节点
delete first;
}
//置空链表
template<class T>
void List<T>::MakeEmpty()
{
ListNode<T> * q;
while (first->next != NULL){
q = first->next;//将表头指针指向的第一个节点赋给q
first->next = q->next;//将q的指向赋给first的指向,这样q空了出来
delete q;//删除q
}
first = last;//修改表尾指针
}
//求链表节点个数
template<class T>
int List<T>::Length()const
{
int num = 0;
ListNode<T> * q = first;
while (q->next != NULL){
num++;
q = q->next;
}
return num;
}
//查找指定值的元素
template<class T>
ListNode<T>* List<T>::Find(T x)
{
ListNode<T> *q = first;
while (q->data != x && q != NULL){
q = q->next;
}
if (q->data == x){
return q;
}
return NULL;
}
//查找指定位置的元素值
template<class T>
ListNode<T>* List<T>::Find(int i)
{
if (i < -1) return null;
if (i == -1) return first;
ListNode<T> *q = first->next;
int j = 0;
while (j < i && q !=NULL)
{
j++;
q = q->next;
}
return q;
}
//插入节点函数
template<class T>
int List<T>::Insert(T value, const int i)
{
ListNode<class T>*p = Find(i - 1);
if (p == NULL) return 0;
ListNode<T>* q = GetNode(value, p -> next);
if (p->next == NULL) last = q;
p->next = q;
return 1;
}
//删除某节点
template<class T>
T * List<T>::Remove(int i)
{
ListNode<class T>*p = Find(i - 1);
if (p == NULL || p->next == NULL) return NULL;
ListNode<T> *q = p->next;//生成一个新节点
p->next = q->next;//重新链接
T * type = new T(q->data);
delete q;
return type;
}