单链表C++实现

单链表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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值