C++自写链表

#pragma once
#include<iostream>
using namespace std;

template<class ty>
struct node
{
	node()
	{
		this->pnext = nullptr;
	}
	node(ty t)
	{
		this->t = t;
		this->pnext = nullptr;
	}
	node(ty t,node* pnext)
	{
		this->t = t;
		this->pnext = pnext;
	}
	ty t;
	node* pnext;
};



template<class ty>
class list
{
public:
	list()
	{
		this->headnode = nullptr;
	}
	void push_front(ty n)
	{
		this->headnode = new node<ty>(n, headnode);
	}
	void push_back(ty n)
	{
		if (this->headnode == nullptr)
		{
			push_front(n);
			return;
		}
		node<ty>* pmove = this->headnode;
		while (1)
		{
			if (pmove->pnext == nullptr) break;
			pmove = pmove->pnext;
			
		}
		pmove->pnext = new node<ty>(n);
		return;
	}
	void insert(int where,int n)
	{
		if (this->headnode == nullptr)
		{
			push_back(n);
			return;
		}
		node<ty>* pmove = this->headnode->pnext;
		node<ty>* pre = this->headnode;
		for (int i = 0; i < where-2; i++)
		{
			if (pmove != nullptr)
			{
				pre = pmove;
				pmove = pmove->pnext;
			}
		}
		pre->pnext=new node<ty>(n, pmove);
		return;
	}
	void pop_front()
	{
		if (this->headnode == nullptr) return;
		node<ty>* ptemp = this->headnode;
		headnode = headnode->pnext;
		delete ptemp;
		ptemp = nullptr;
	}
	void pop_back()
	{
		if (this->headnode == nullptr) return;
		node<ty>* pmove = this->headnode;
		node<ty>* pre = this->headnode;
		while (1)
		{
			if (pmove->pnext == nullptr) break;
			pre = pmove;
			pmove = pmove->pnext;
		}
		pre->pnext = nullptr;
		delete pmove;
		pmove->pnext = nullptr;
	}

	void deletes(int n)
	{
		if (this->headnode == nullptr)
		{
			return;
		}
		if (n==1)
		{
			pop_front();
			return;
		}
		node<ty>* pmove = this->headnode->pnext;
		node<ty>* pre = this->headnode;
		for (int i = 0; i < n-2; i++)
		{
			if (pmove->pnext == nullptr) return;
			pre = pmove;
			pmove = pmove->pnext;
		}
		pre->pnext = pmove->pnext;
	}
	void push_sort(ty n)
	{
		if (this->headnode == nullptr) push_back(n);
		node<ty>* pre = this->headnode;
		node<ty>* pmove = this->headnode->pnext;
		int k = 0;
		while (pmove != nullptr && pmove->pnext <= pmove)
		{
			pre = pmove;
			pmove = pmove->pnext;
			k++;
		}
		insert(k + 3, n);
		
	}
	void appends(list pl)
	{
		if (pl.headnode == nullptr) return;
		node<ty>* pmove = pl.headnode;
		while (1)
		{
			this->push_back(pmove->t);
			pmove = pmove->pnext;
			if (pmove== nullptr) return;
		}
		return;
	}
	void remove()
	{
		if (this->headnode == nullptr || this->headnode->pnext == nullptr) return;
		node<ty>* pmove = this->headnode;
		list<ty> temp;
		while (1)
		{
			temp.push_back(pmove->t);
			pmove = pmove->pnext;
			if (pmove== nullptr) break;
		}
		this->headnode = nullptr;
		this->pop_front();
		node<ty>* pre = temp.headnode;
		while (1)
		{
			this->push_front(pre->t);
			pre = pre->pnext;
			if (pre == nullptr) return;
		}
	}
	void print()
	{
		if (this->headnode == nullptr) return;
		node<ty>* pmove = this->headnode;
		while (1)
		{
			cout << pmove->t << " ";
			
			if (pmove->pnext == nullptr) return;
			pmove = pmove->pnext;
		}
		
		cout << endl;
		return;
	}



	node<ty>* headnode;
};

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值