数据结构与算法之单链表 自己实现STL list模板类

自己写的一个简单的单链表模板类,类似STL功能,不过是单链表,与真正的STL肯定很大区别,只是自己模仿一下而已。

#include<iostream>
using namespace std;

template<class T>
struct node
{
	T element;
	node* next;
};

		
template<class T>
class my_list
{
	public:

		my_list();

		my_list(int n);

		~my_list();

		int size()const;

		bool empty()const;

		T& operator[](int n)const;//取第i个值

		node<T>* insert(int i, const T& new_node);//插入

		node<T>* erase(int i);//删除

		node<T>* push_back(const T& new_node);//末尾插入

		node<T>* push_front(const T& new_node);//前面插入

	private:
		int m_size;
		node<T>*  m_head;
};

template<class T>
my_list<T>::my_list()
{
	m_head  = NULL;
	m_size = 0;
}

template<class T>
my_list<T>::my_list(int n)
{
	m_size = 0;
	m_head = NULL;

	node<T> *p = new node<T>;
	m_head = p;
	while(--n)
	{
		node<T> *q = new node<T>;
		p->next = q;
		p = q;
		m_size++;
	}
	m_size++;
	p->next = NULL;
}

template<class T>
my_list<T>::~my_list()
{
	if(m_head != NULL)
	{
		node<T> *t = m_head;
		while(m_head != NULL)
		{
			t = m_head;
			m_head = m_head->next;
			delete t;
		}
	}

	m_head = NULL;
	m_size = 0;
}

template<class T>
int my_list<T>::size()const
{
	return m_size;
}

template<class T>
bool my_list<T>::empty()const
{
	if(m_size == 0)
		return true;
	else
		return false;
}

template<class T>
T& my_list<T>::operator[](int n)const
{
	node<T> *p = m_head;
	while(p != NULL && n--)
	{
		p = p->next;
	}
	
	return p->element;
}

template<class T>
node<T>* my_list<T>::push_back(const T& new_node)
{
	node<T>* p = m_head;
	if(p == NULL)
	{
		m_head = new node<T>;
		m_head->element = new_node;
		m_head->next = NULL;
		m_size++;
	}
	else
	{
		node<T> *t = p;
		while(p != NULL)
		{
			t = p;
			p = p->next;
		}

		t->next = new node<T>;
		t->next->element = new_node;
		t->next->next = NULL;
		m_size++;
	}

	return m_head;
}


template<class T>
node<T>* my_list<T>::push_front(const T& new_node)
{
	node<T> *p = m_head;
	if(p == NULL)
	{
		m_head = new node<T>;
		m_head->element = new_node;
		m_head->next = NULL;
		m_size++;
	}
	else
	{
		m_head = new node<T>;
		m_head->element = new_node;
		m_head->next = p;
		m_size++;
	}

	return m_head;
}

template<class T>
node<T>* my_list<T>::insert(int i, const T& new_node)
{
	if(i == 0)
	{
		return push_front(new_node);
	}
	
	if(i == m_size)
	{
		return push_back(new_node);
	}

	if(i > 0 && i < m_size)
	{
		node<T>* p = m_head;
		node<T>* t = p;
		while(--i)
		{	
			t = p;
			p = p->next;
		}
		node<T> *q = new node<T>;
		q->element = new_node;
		q->next = p;
		t->next = q;
		m_size++;
	}

	return m_head;

}

template<class T>
node<T>* my_list<T>::erase(int i)
{
	if(empty())
		return NULL;

	if(i == 0)
	{
		node<T>* p = m_head;
		m_head = m_head->next;
		delete p;
		m_size--;
	}

	if(i > 0 && i < m_size)
	{
		node<T>* p = m_head;
		node<T>* t = p;
		while(--i)
		{	
			t = p;
			p = p->next;
		}
		t->next = p->next;
		delete p;
		m_size--;
	}

	return m_head;

}

int main()
{

	my_list<int> a;
	int i = 0;
	for(i = 9; i >= 0; i--)
	{
		a.push_back(i);
	}

	for(i = 10; i < 20; i++)
	{
		a.push_front(i);
	}

	a.insert(10,-1);
	a.erase(8);

	for(i = 0; i < a.size(); i++)
	{
		cout<<a[i]<<' ';
	}


	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值