码迷,mamicode.com
首页 > 编程语言 > 详细

C++ 模版类的单向链式线性表

时间:2015-07-22 13:15:29      阅读:112      评论:0      收藏:0      [点我收藏+]

标签:c++   单链表   template   模版参数   代码复用   


先上代码!以后再仔细编辑!

头文件

<span style="font-size:18px;">#pragma once

template<typename EleType>
class ChainList
{
public:
	struct Node
	{
		EleType _data;
		Node* _next; 
		Node(){ _next = nullptr; }
		Node(EleType data){ _data = data; _next = nullptr; }
	};
	ChainList();
	~ChainList();
	bool GetElem(EleType& e, int index=1)const;//得到List中第index个元素,把元素的_data赋给e;
	bool InsertElem(const EleType e, int index=1);//在List的第index个位置插入一个节点,节点的数据为e
	bool DeleteElem(EleType& e, int index = 1);//在List的第index个位置删除一个节点,删除节点的数据赋给e
	bool InsertHead(const EleType& e);//在头部插入数据
	bool InsertTail(const EleType& e);//在尾部插入数据
	bool Clear();//清空List
	void ShowList()const;//显示List的所有元素的数据
private:
	bool Empty()const;//判断List是否为空

	//在List中查找第index个位置的节点,把该节点的地址赋给n,此处需传入指针的引用,才能保证n可以被修改,不然只能保证*n可以被修改,也就是n指向的节点可以被修改
	bool Find(int index,Node*& n)const;
	bool CheckIndex(int index)const;//检查List是否为空,index是否合法
	Node* Head;//头节点
	Node* Tail;//尾节点
	int Length;</span><pre name="code" class="cpp">
实现文件.cpp


<span style="font-size:18px;"></span><pre name="code" class="cpp"><span style="font-size:18px;">#include "ChainList.h"
#include <iostream>
using namespace std;

template<typename EleType>
bool ChainList<EleType>::CheckIndex(int index) const
{
	if (Empty())
	{
		cout << "Find: the List is Empty!\n";
		return false;
	}
	if (index<1 || index>Length)
	{
		cout << "the index is invalid!\n";
		return false;
	}

	return true;
}


template<typename EleType>
bool ChainList<EleType>::Find(int index,Node*& n)const//index [1,Length];
{
 
if (CheckIndex(index)) 
	{
		int i = 1;
		Node * temp = Head;
		while (i < index)
		{
			temp = temp->_next;
			++i;
		}
		n = temp;
		return true;
	}
return false;
}

template<typename EleType>
void ChainList<EleType>::ShowList() const
{
	Node * temp=nullptr ;

	if (Empty())
	{
		cout << "The list is empty!\n";
	}
	for (int i=1;i<=Length;++i)
	{
		Find(i, temp);
		cout << temp->_data << " ";
	}
	cout << endl;
	 
	 
}

template<typename EleType>
bool ChainList<EleType>::Clear()
{
	if (Empty())
	{
		return true;
	}
	else
	{
		while (Length)
		{
			EleType m;
			DeleteElem(m);
		}
		return true;
	}

	
}

template<typename EleType>
bool ChainList<EleType>::DeleteElem(EleType& e,int index=1 )
{
	if (CheckIndex(index))
	{
		Node* temp = nullptr;
		Node* pre_temp = nullptr;
		if (Find(index, temp))
		{
			if (index == 1)
			{
				Find(index + 1, Head);
			}
			else
			{
				if (index == Length)
				{
					Find(index - 1, Tail);

				}
				else
				{
					Find(index - 1, pre_temp);
					pre_temp->_next = temp->_next;
				}
			}
			e = temp->_data;
			delete temp;
			--Length;
			return true;
		}
		return false;
	}
	return false;
}

template<typename EleType>
bool ChainList<EleType>::InsertElem(const EleType e,int index )
{
	Node *insertNode=new Node(e);
	 
	 if (Empty())
	 {
		 if (index < 1) return false;
		 Head = Tail = insertNode;
		 insertNode->_next = nullptr;
		 ++Length;
		 return true;
	 }
	  
	 if (index==1)
	 {
		 insertNode->_next = Head;
		 Head = insertNode;
		 ++Length;
		 return true;
	 }
	 if (index==Length+1)
	 {
		 Tail->_next = insertNode;
		 insertNode->_next = nullptr;
		 Tail = insertNode;
		 ++Length;
		 return true;
	 }
	Node  *temp=nullptr;
	
	 if (Find(index-1,temp))
	 {		 		 
		 insertNode->_next = temp->_next;
		 temp->_next = insertNode;
		 ++Length;		 
		 return true;
	 }
 
	 return false;
}

template<typename EleType>
bool ChainList<EleType>::GetElem(EleType& e,int index) const
{
	if (CheckIndex(index))
	{
		Node* temp = nullptr;
		if (Find(index, temp))
			e = temp->_data;
		return true;
	}
	return false;
}

template<typename EleType>
ChainList<EleType>::~ChainList()
{
	Clear();
}

template<typename EleType>
ChainList<EleType>::ChainList() :Length(0), Head(nullptr), Tail(nullptr)
{
	 	
}

 
template<typename EleType>
bool ChainList<EleType>::Empty() const
{
	return(Length==0);
}

template<typename EleType>
bool ChainList<EleType>::InsertTail(const EleType& e)
{
	return InsertElem(e, Length + 1);
}

template<typename EleType>
bool ChainList<EleType>::InsertHead(const EleType& e)
{
	return InsertElem(e);
}
</span>

};



版权声明:本文为博主原创文章,未经博主允许不得转载。

C++ 模版类的单向链式线性表

标签:c++   单链表   template   模版参数   代码复用   

原文地址:http://blog.csdn.net/shiwazone/article/details/47000191

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!