【数据结构】C++实现数据结构单链表类,含模板能添加任意类型,增删查改,头插法和尾插法

自己实现的单链表类,函数接口类似于STL的list,实现了头插法和尾插法,我觉得链表核心就是指针的使用,指针理解透了,实现起来就很简单。

#include <iostream>
//单链表节点
template<class T>
class node1 {
public:
	T m_data;           //数据域
	node1 *m_nextNode;  //指针域
};
//单链表类
template<class valueType>
class singleList 
{
public:
	//构造函数初始化单链表头节点
	singleList() 
	{
		m_head = new node1<valueType>();
		m_head->m_nextNode = nullptr;
	}
	//析构函数中释放链表内所有元素空间
	
	~singleList() {
		node1<valueType> *nextNode = nullptr;
		while (m_head->m_nextNode!=nullptr)
		{
			nextNode = m_head->m_nextNode;  //保存下一节点地址
			delete m_head;                  //释放当前节点空间
			m_head = nextNode;				//将m_head指向下一节点
		}
		delete m_head;                      
		m_head = nullptr;
	}
	//从单链表的头部插入(头插法)
	void push_front(valueType value)
	{
		node1<valueType> * node = new node1<valueType>();
		node->m_data = value;
		node->m_nextNode = m_head->m_nextNode;;
		m_head->m_nextNode = node;
	}

	//从单链表的尾部插入(尾插法)
	void push_back(valueType value)
	{
		node1<valueType> * endNode = m_head;//指向尾部节点的指针
		//找到尾部节点
		while (endNode->m_nextNode!=nullptr)
		{
			endNode = endNode->m_nextNode;
		}

		node1<valueType> * node = new node1<valueType>();
		node->m_data = value;
		node->m_nextNode = nullptr;
		//尾部节点的指针域指向新增节点
		endNode->m_nextNode = node;

	}
	/**************************************************
	*  @brief:	用<<运算符插入元素
	*  @param:	value:要插入的元素值
	**************************************************/
	singleList<valueType>& operator<<(const valueType&value)
	{
		this->push_back(value);
		
		return *this;
	}
   /**************************************************
	*  @brief:	从单链表中指定位置开始查找,查找第一个出现的指定元素,
	*  @param:	value:要查找的元素
	*  @param:	pos:从pos位置开始查找
	*  @return:	返回查找到的元素所在链表中的位置,从pos后的位置,如果没找到返回-1
	**************************************************/
	int findFirst(valueType value , int pos)
	{
		if(pos<0) return -1;  
		node1<valueType> *posNode = m_head; //指向pos所在位置的指针
		for (int i=0 ;i<pos;i++)
		{
			posNode = posNode->m_nextNode;
		}
		int value_pos = 0;
		while (posNode->m_nextNode != nullptr )
		{
			if (posNode->m_data == value)
			{
				return value_pos;
			}
			posNode = posNode->m_nextNode;
			value_pos++;
		}
		return -1;
	}
	

	/**************************************************
	*  @brief:	从单链表中删除元素,删除第一个出现的指定元素
	*  @param:	value:要删除的元素值
	**************************************************/
	void deleteFirst(valueType value)
	{
		node1<valueType> *node = m_head->m_nextNode; //指向删除元素所在位置的指针
		node1<valueType> *nextNode = m_head;      //要删除元素所在位置的上一指针
		while (node!= nullptr)
		{
			if (node->m_data==value)
			{
				nextNode->m_nextNode = node->m_nextNode;
				delete node;
				return;
			}
			nextNode = nextNode->m_nextNode;
			node = node->m_nextNode;
		}
	}
	void printfAll() 
	{
		node1<valueType> *node = m_head;
		while (node!=nullptr)
		{
			std::cout << node->m_data << " ";
			node = node->m_nextNode;
		}
		std::cout << std::endl;
	}

private:
	node1<valueType> *m_head;
};


int main()
{

	singleList<int> list;
	list << 2 << 2 << 45 << 6; //  
	int a = 10;
	list << a;
	list.printfAll();

	list.push_back(20);
	list.push_front(16);
	list.printfAll();
	std::cout<<"2 first pos is :"<<list.findFirst(2,0)<<std::endl;
	list.deleteFirst(2);
	std::cout << "already delete 2! " << std::endl;
	list.printfAll();
	list.deleteFirst(2);
	std::cout << "already delete 2! " << std::endl;
	list.printfAll();
	list.deleteFirst(45);
	std::cout << "already delete 45! " << std::endl;
	list.printfAll();
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值