C++ 造房子list

#pragma once

template<typename T>
class Clist
{
public:
	Clist();
	~Clist();
	Clist(const T *data);
	Clist(const Clist &ls);
	bool Push_bak(  T *const data);//后插
	bool Push_first(T*const data);//前插
	bool Push_bak(const int& pos,  T *const data);//定位插入
	const  T * const Pop_bak() ;//后
	const T *const Pop_first() ;//前
	T *Head_Top()const ;//返回顶部元素
	T *Edn_Top()const;//尾部元素
	T *findval(const T &fin_val)const;//返回朝找的元素
	void out_show()const;//显示所有元素
	void out_show_reverse()const;
	bool close();//清空
	bool empty();//是否为空
	size_t getLen(){ return len; }
	bool deleteVal(const T &data);//删除摸个元素
private:
	class Node
	{
	public:
		Node() :data(NULL), base(NULL), pNext(NULL){}
		Node(T *const m_data, Node *m_base);
		Node *getPNext()const;
		Node *getBase()const;
		void SetPNext(Node * m_pNext);
		void SetBase(Node *  m_base);
		T *getData()const;
		void SetData( T *const data);
	private:
		T *data;
		Node *pNext;
		Node *base;
	}*head,*end;
	size_t len;
};

#include "Clist.h"
#include <iostream>


template <typename T>
Clist<T>::Node::Node(T *const m_data, Node *m_base) :data(m_data), base(m_base)
{

}
template<typename T>
typename Clist<T>::Node *Clist<T>::Node::getPNext()const
{
	return pNext;
}
template<typename T>
typename Clist<T>::Node *Clist<T>::Node::getBase()const
{
	return base;
}
template<typename T>
void Clist<T>::Node::SetPNext(Node * m_pNext)
{
	pNext = m_pNext;
}
template<typename T>
void Clist<T>::Node::SetBase(Node *  m_base)
{
	base = m_base;
}

template<typename T>
T *Clist<T>::Node::getData()const
{
	return data;
}

template<typename T>
void Clist<T>::Node::SetData(T *const data)
{
	this->data = data;
}

template<typename T>
Clist<T>::Clist() :head(NULL), end(NULL), len(0)
{
}



template<typename T>
Clist<T>::~Clist()
{
	if (head)
	{
		close();
	}
}

template<typename T>
Clist<T>::Clist(const Clist<T> &ls)
{
	len = ls.getLen();

	Node *temp = ls.head;
	head = new Node((temp->getData()), NULL);
	end = head;
	temp = temp->getPNext();
	while (temp)
	{
		end->SetPNext(new Node(temp->getPNext(), end));
		end = end->getPNext();
		temp = temp->getPNext();
	}


}


template<typename T>
Clist<T>::Clist(const T *data) : head(NULL), end(NULL), len(0)
{
	if (!head&&data)
	{
		head = new Node(data, head);
		end = head;
		len++;
	}
	else
	{
	}
}


template<typename T>
bool Clist<T>::Push_bak(T *const data)
{
	if (!data)
		return false;
	if (!head)
	{
		head = new Node(data, head);
		end = head;
		len++;
		return true;
	}
	Node *pNew = new Node(data, end);
	end->SetPNext(pNew);
	end = pNew;
	len++;
	return true;
}
template<typename T>
bool Clist<T>::Push_first(T*const data)
{
	if (!data)
		return false;
	if (!head)
	{
		head = new Node(data, head);
		end = head;
		len++;
		return true;
	}
	Node *pNew = new Node(data, NULL);
	head->SetBase(pNew);
	pNew->SetPNext(head);
	head = pNew;
	len++;
	return true;

}


template<typename T>
bool Clist<T>::Push_bak(const int &pos, T *const data)
{
	if (pos<0 || pos>len - 1)
		return false;
	int tmplen = 0;
	Node *temp = head;
	while (tmplen < pos)
	{
		temp = temp->getPNext();
		tmplen++;
	}
	Node *pNew = new Node(data, temp->getBase());
	pNew->SetPNext(temp);
	temp->SetBase(pNew);
	len++;
	return true;
}


template<typename T>
const T * const Clist<T>::Pop_bak()
{
	if (!head)
	{
	}
	else
	{
		if (head == end)
		{
			T *temp = head->getData();
			delete head;
			end = head = NULL;
			len--;
			return temp;
		}
		T *temp = end->getData();

		Node *ptmp = end->getBase();
		ptmp->SetPNext(NULL);
		delete end;
		end = ptmp;
		len--;
		return temp;
	}
}

template<typename T>
const T *const Clist<T>::Pop_first()
{
	if (!head)
	{
	}
	else
	{
		if (head == end)
		{
			T *temp = head->getData();
			delete head;
			head = end = 0;
			len--;
			return temp;
		}
		T *temp = head->getData();
		head = head->getPNext();
		delete head->getBase<span style="font-family: Arial, Helvetica, sans-serif;">();</span>
		head->SetBase(NULL);
		len--;
		return temp;
	}

}


template<typename T>
T *Clist<T>::Head_Top()const
{
	if (!head)//不处理任意崩溃
	{
		return NULL;
	}
	else
	{
		return  head->getData();
	}
}
template<typename T>
T * Clist<T>::Edn_Top()const
{
	if (!head)//不处理任意崩溃
	{
		return NULL;//return NULL;
	}
	else
	{
		return  end->getData();
	}
}

template<typename T>
T *Clist<T>::findval(const T &fin_val)const
{
	if (!head)
	{
		//return NULL;
	}
	else
	{
		Node *temp = head;
		while (temp)
		{
			if (fin_val == *(temp->getData()))
				break;
			temp = temp->getPNext();
		}
		if (!temp)
		{
			return NULL;
		}
		return temp->getData();
	}
}


template<typename T>
void Clist<T>::out_show()const
{
	if (!head)
		return;
	Node *temp = head;
	while (temp)
	{
		std::cout << *(temp->getData()) << " ";
		temp = temp->getPNext();
	}
}


template<typename T>
void  Clist<T>::out_show_reverse()const
{
	if (!end)
		return;
	Node *temp = end;
	while (temp)
	{
		std::cout << *(temp->getData()) << " ";
		temp = temp->getBase();
	}
}


template<typename T>
bool Clist<T>::close()
{
	if (!head)
		return false;
	while (head)
	{
		delete Pop_bak();
	}

	return true;
}

template<typename T>
bool Clist<T>::empty()
{
	return head;
}
template<typename T>
bool Clist<T>::deleteVal(const T &data)
{
	if (!head)
	{
		return false;
	}
	else
	{
		if (data == *(head->getData()) && !head->getPNext())
		{
			delete head->getData();
			delete head;
			head = end = NULL;
			len--;
			return true;
		}
		else
		{
			if (data == *(head->getData()))
			{
				delete head->getData();
				head = head->getPNext();
				delete head->getBase();
				head->SetBase(NULL);
				len--;
				return true;
			}
			else if (data == *(end->getData()))
			{
				delete end->getData();
				end = end->getBase();
				delete end->getPNext();
				end->SetPNext(NULL);
				len--;
				return true;
			}
			else
			{
				Node *temp = head;
				while (temp != end)
				{
					if (data == *(temp->getData()))
					{
						Node *ptmp = temp;
						temp->getPNext()->SetBase(ptmp->getBase());
						temp->getBase()->SetPNext(ptmp->getPNext());
						delete temp->getData();
						delete temp;
						temp = NULL;
						len--;
						return true;
					}
					temp = temp->getPNext();
				}
				return false;
			}
		}

	}
}

#include<iostream>
#include "Clist.hpp"



void main()
{
	
	Clist<int>s;
	for (int i = 0; i < 3; i++)
	{
		s.Push_bak(new int(i+1));
	}
	int val = 0;
	std::cout << "朝找数据:" <<std:: endl;
	std::cin >> val;
	std::cout << s.findval(val);
	std::cout.clear();
	std::cout << "删除数据" << std::endl;
	std::cin >> val;
	if (s.deleteVal(val))
	{
		std::cout << "删除成功\n";
	}
	s.out_show();
	std::cout << std::endl;
	std::cout << "长度:"<<s.getLen() << std::endl;;
	s.Push_bak(1, new int(55));
	std::cout << std::endl;
	s.out_show_reverse();
	s.close();
	s.out_show();




	system("pause");
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值