自己写的链表模板类

本文介绍了一个通用模板链表类的实现,包括创建列表、在尾部添加元素、打印所有节点、删除指定位置的节点及插入节点等功能。通过具体实例展示了类的使用方法。
#include <iostream>
using namespace std;


template <typename  T> class Node
{
public:
	Node()
	{
		m_header=NULL;
		m_pNext=NULL;
	}
	void  CreateList(T newNodeCuntter);
	int  GetListSize();
	void AddToTail( T newNodeCuntter);
	void PrintAllNode();
	void DeleteNode(int iat);
	void InserterNode(T newNode,int iat);
private:
	Node *m_header;
	Node *m_pNext;
	T m_node;
	static int m_iNumOfNode;
};
template<typename T> int  Node<T>::m_iNumOfNode=0;
template<typename T> int  Node<T>::GetListSize()
{
	return m_iNumOfNode;
}
template<typename T>  void Node<T>::InserterNode( T  newnode,int iat)
{
	if (m_header==NULL  || iat>m_iNumOfNode ||m_iNumOfNode<0)
	{
		cout <<"List donot exit  or  over range"<<endl;
		return ;
	}
	Node*  pCurrent=m_header;
	//Node*  pLast=NULL;
	Node*  pNewNode=NULL;
	pNewNode=new Node;
	pNewNode->m_header=m_header;
	pNewNode->m_pNext=NULL;
	pNewNode->m_node=newnode;
	int i=0;
	while (pCurrent->m_pNext)
	{
		if (i==iat)
		{
			pNewNode->m_pNext=pCurrent->m_pNext;
            pCurrent->m_pNext=pNewNode;
			return ;
		}
		pCurrent=pCurrent->m_pNext;
		i++;
	}




}
template<typename T> void Node<T>::CreateList( T newNode)
{
	if (m_header==NULL)
	{
		m_header=new Node;
		m_header->m_pNext=NULL;
		m_header->m_node =newNode;
		cout<<"AddToTail: "<<m_iNumOfNode++ <<"-"<< m_header->m_node <<endl;
	}
}
 
template<typename T> void Node<T>::AddToTail(T newNodeCuntter)
{
	if (m_header==NULL)
	{
		m_header=new Node;
		m_header->m_node=newNodeCuntter;
		m_header->m_pNext=NULL;
		cout<<"AddToTail: "<<m_iNumOfNode++ <<"-"<< m_header->m_node <<endl;
	}
	else
	{
		
		Node* pheader=m_header;
		while (pheader->m_pNext)
		{
			pheader=pheader->m_pNext;
		}
		
		 Node* pNewAddNode=new Node;
		 pheader->m_pNext=pNewAddNode;
		 pNewAddNode->m_header=m_header;
		 pNewAddNode->m_pNext=NULL;
		 pNewAddNode->m_node=newNodeCuntter;
		
		 cout<<"AddToTail: "<<m_iNumOfNode++ <<"-"<< pNewAddNode->m_node <<endl;
	}
	
}
template <typename T> void Node<T>::PrintAllNode()
{
	if (m_header==NULL)
	{
		cout<<"print end"<<endl;
		return;
	}
	else
	{
		int i=0;
		Node * pHeader=m_header;
		while(pHeader->m_pNext)
		{
			cout<<i++<<":"<<pHeader->m_node<<", ";
		    pHeader=pHeader->m_pNext;
		}
		cout<<i++<<":"<<pHeader->m_node<<"  end ";
	}
}
template <typename T> void Node<T>::DeleteNode(int iat)
{
	if (m_header==NULL  || iat >m_iNumOfNode  || iat <0)
	{
		cout <<"m_iNumOfNode"<<m_iNumOfNode<<"List donot exit  or  over range"<<endl;
		return  ;
	}
	else
	{
		Node *pCutter=m_header;
		Node *pLast=NULL;  
		int i=0;
		static bool bat0=false;	
		while (pCutter->m_pNext /*&& i!=iat*/)
		{
			if (i==iat && i!=0)
			{
				cout <<endl;
				cout<<"before delete"<<endl;
				cout<<"last: "<<pLast->m_node<<"  ";
				cout<<"cutter: "<<pCutter->m_node<<"  ";
				cout<<"next: "<<pCutter->m_pNext->m_node;
				pLast->m_pNext=pCutter->m_pNext;
				cout<<"after delete"<<endl;
				cout<<"last: "<<pLast->m_node<<"  ";
				cout<<"cutter: "<<pLast->m_pNext->m_node<<"  ";
				cout<<"next: "<<pCutter->m_pNext->m_pNext->m_node<<"  ";


				delete  pCutter;


				return;


			}
			else if (iat==0  )
			{
				
				if (!bat0)
				{
					m_header=pCutter->m_pNext;
					delete  pCutter;
					bat0=true;
					pCutter=m_header;
				}
				pCutter->m_pNext->m_header=pCutter->m_header;
			}
			 pLast=pCutter;
             pCutter=pCutter->m_pNext;
			 i++;
		}
		if (iat==m_iNumOfNode-1)
		{
			//pLast=pCutter;
			pLast->m_pNext=NULL;
			delete  pCutter;
		}
		


	}


}
int  main()
{


	Node<int> headerNode;


	headerNode.CreateList(0);
	for(int i=1;i<11;i++) 
	{
		headerNode.AddToTail(i);
	}


	headerNode.PrintAllNode();
	headerNode.DeleteNode(10);
	cout <<endl;
	headerNode.PrintAllNode();
	cout <<endl;
	headerNode.InserterNode(41,4);
	headerNode.PrintAllNode();
	int aend;
	cin>>aend;
	return 0;
}


面向对象程序设计课程作业 1. 请创建一个数据类型为T的链表模板List,实现以下成员函数: 1) 默认构造函数List(),将该链表初始化为一个空链表(10分) 2) 拷贝构造函数List(const List& list),根据一个给定的链表构造当前链表(10分) 3) 析构函数~List(),释放链表中的所有节点(10分) 4) Push_back(T e)函数,往链表最末尾插入一个元素为e的节点(10分) 5) operator<<()友元函数,将链表的所有元素按顺序输出(10分) 6) operator=()函数,实现两个链表的赋值操作(10分) 7) operator+()函数,实现两个链表的连接,A=B+C(10分) 2. 请编main函数,测试该类模板的正确性: 1) 用List模板定义一个List类型的模板类对象int_listB,从键盘读入m个整数,调用Push_back函数将这m个整数依次插入到该链表中;(4分) 2) 用List模板定义一个List类型的模板类对象int_listC,从键盘读入n个整数,调用Push_back函数将这n个整数依次插入到该链表中;(4分) 3) 用List模板定义一个List类型的模板类对象int_listA,调用List的成员函数实现A = B + C;(4分) 4) 用cout直接输出int_listA的所有元素(3分) 5) 用List模板定义List类型的模板类对象double_listA, double_listB, double_listC,重复上述操作。(15分) 3. 输入输出样例: 1) 输入样例 4 12 23 34 45 3 56 67 78 3 1.2 2.3 3.4 4 4.5 5.6 6.7 7.8 2) 输出样例 12 23 34 45 56 67 78 1.2 2.3 3.4 4.5 5.6 6.7 7.8
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值