• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

数据结构C++模板实现之----------------单向链表

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
//欢迎大家拍砖头给意见啊,大家的批评是我学习的动力,谢谢啦

#ifndef  _List_H_
#define  _List_H_

#include "stdafx.h"
template<class T>
class list;

template<class ElemType> class listNode{
public:
	listNode(ElemType data = 0):_data(data),_next(NULL){}
	~listNode(){}
	friend class list<ElemType>;
	ElemType _data;
	listNode* _next;
};

template<class T>
class list{
//公共接口
public:
	//注意_pHead,_pTail初始化顺序,必须和声明顺序一样
	list():_length(0),_pHead(new listNode<T>),_pTail(_pHead){}
	~list(){delete _pHead;delete _pTail;}
	bool IsEmpty(){ return _length>0?false:true; }
	listNode<T>* GetHead(){return _pHead;}
	listNode<T>* GetTail(){return _pTail;}
	void Push_Back(const T& data);
	//插入位置以1为最开始
	bool Insert(const T& data,const int index);
	listNode<T>* Find(const T& e);
	bool Delete(const int index);
	void Print();
	unsigned int GetLength(){return _length;}
	void Destroy();
//数据成员
private:
	unsigned int _length;
	listNode<T> *_pHead,*_pTail;//_pHead为链表地址,_pTail始终指向最后一个结点
private:
	list(const list<T>& rhs){}
	list<T>& operator=(){}
};



template<class T>
void list<T>::Push_Back(const T& data)
{
	listNode<T>* p = new listNode<T>(data);
	if (_length == 0)
	{
		p->_next = NULL;
		_pHead->_next = p;
		_pTail = p;
		_length++;
	}else{
		_pTail->_next = p;
		_pTail = p;
		_length++;
	}
	
}

template<class T>
bool list<T>::Insert(const T& data,const int index)
{
	//不合理的插入位置
	if (index>_length+1||index<=0)
	{
		return false;
	}
	listNode<T>* p = new listNode<T>(data);
	listNode<T>* q = _pHead;
	//插入第一个位置 则需要改变_pHead
	if (_length == 0)
	{
		//空链时的插入同时需要改变头尾节点
		_pHead->_next = p;
		_pTail = p;
		_length++;
		return true;
	}else if (index == 1)
	{
		//插入到第一位置改变头结点
		p->_next = _pHead->_next;
		_pHead->_next = p;
		_length++;
		return true;
	}else if (index == _length+1)
	{
		//插入到最后位置改变尾结点
		_pTail->_next = p;
		_pTail = p;
		_length++;
		return true;
	}

	//其他情况下头尾结点不需要改变
	//找到要插入位置的上一个节点
	int k = 1;
	while (k<index)
	{
		q = q->_next;
		k++;
	}
	p->_next = q->_next ;
	q->_next = p;
	_length++;
	return true;
}

template<class T>
listNode<T>* list<T>::Find(const T& e)
{
	//避免只有头结点而且刚好查找0的情况
	if(_length == 0)  return NULL;
	listNode<T>* p = _pHead->_next;
	while (p->_data!=e&&p->_next!=NULL)
	{
		p = p->_next;
	}
	return p;
}

template<class T>
bool list<T>::Delete(const int index)
{
	//删除节点位置不存在时
	if (index>_length||_length==0||index<=0) return false;
	listNode<T>* q = _pHead;
	listNode<T>* p;
	//只有一个节点并要删除时 需要修改头尾指针
	if (_length == 1&&index==1) 
	{
		p = q->_next;
		_pHead->_next = NULL;
		_pTail = _pHead ; 
		delete p;
		_length--;
		return true;
	}
	int k = 1;
	//找到要插入位置的上一个节点
	while (k<index)
	{
		q = q->_next;
		k++;
	}
	p = q->_next ; //p为需要删除的节点
	
	if (q == _pHead)
	{
		//删除节点为第一个节点时 需要修改头指针
		_pHead->_next = p->_next;
	}
	else if (p->_next == NULL)
	{
		//删除的是最后一个节点,则需要修改_pTail
		q->_next = NULL;
		_pTail = q;
	}
	else
	{
		q->_next = q->_next->_next;
	}
	delete p;
	_length--;
	return true;
}

template<class T>
void list<T>::Destroy()
{
	if(!_length) return;
	listNode<T>* p = _pHead->_next;
	listNode<T>* q ;
	while (p)
	{
		q = p;
		p = p->_next;
		delete q;
	}
	_pHead->_next = NULL;
	_pTail = _pHead;
	_length = 0;
	return;
}

template<class T>
void list<T>::Print()
{
	if (!_length)
	{
		std::cout<<"The list is null !"<<std::endl;
	}
	listNode<T>* p = _pHead->_next;
	int i = 1;
	while (p!=NULL)
	{
		std::cout<<"The "<<i<<" node's data is "<<p->_data<<std::endl;
		p = p->_next;
		i++;
	}
}

#endif

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C语言实现数组逆置发布时间:2022-07-13
下一篇:
C语言-strcmp和strncmp的编程实现及总结发布时间:2022-07-13
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap