linklist模版函数分析,与实现

我想说什么来着呢,马上要去高伟达笔试面试,我复习复习数据结构,链表,明天复习冒泡,一下大家参考,转载请注明出处~,谢谢合作
#ifndef LINKLIST_H
#define LINKLIST_H
template<class T>
struct Node
{
	T  data;
	Node * next;
	Node(){}
	Node(T data)
	{
		this->data = data;
	}
};

/*
	@brief 链表
	@author boss
	@warning 请勿数组越界,或者输入不合法,因为没有检测
	+insertElement
	+removeElement
	+create
	+inverseCreate
	+release
	+printElement
	-move
	
*/
template<class T>
class LinkList
{
public:
	LinkList();
	~LinkList();

public:

	Node<T> * create(int n);
	Node<T> * inverseCreate(int n);
	void release();
	void remove(int pos);
	void print();
	void insert(Node<T> * data ,int pos);


protected:
	
	Node<T> * move(int pos);
	
	Node<T> * head;
	Node<T> * tail;
	int len;
};


template<class T>
LinkList<T>::LinkList()
	:head(0),
	len(0)
{
	head = new  Node<T>();
	head->next = NULL;
}


template<class T>
LinkList<T>::~LinkList()
{
}

/*
@brief 采用顺插法制作链表
@param n 空链表节点个数n 没有初始化;
@warning pre 永远指前一个节点 cur 永远指当前节点 顺插法要注意插入的最后一个节点->next 必须为NULL;
*/
template<class T>
Node<T> * LinkList<T>::create(int n)
{
	Node<T> * pre = head;
	Node<T> * cur = head;

	len = (n) < 0 ? 0 : n;
	
	for(int i = 0; i < len; i++)
	{
		cur = new Node<T>();
		pre->next = cur;
		pre = cur;
	}

	cur->next = NULL;
	tail = cur;
	return head;
}

/*
@brief 采用倒插法制作链表
@param n 空链表节点个数n 没有初始化;
@warning pre 永远指前一个节点 cur 永远指当前节点 顺插法要注意插入的最后一个节点->next 必须为NULL;
@warning 倒插法头和尾巴是相反的;
*/
template<class T>
Node<T> * LinkList<T>::inverseCreate(int n)
{
	Node<T> * pre = head;
	Node<T> * cur = head;

	pre->next = NULL;
	
	len = (n) < 0 ? 0 : n;

	for(int i = 0 ;i < len; i ++)
	{
		cur = new Node<T>();
		cur->next = pre;
		pre = cur;
	}
	//此时的尾巴,是倒插法的头
	tail = head;
	//此时的头呢,是倒插发的当前值
	head = cur;
	return head;
}


/*
	@brief 释放所有节点
*/
template<class T>
void LinkList<T>::release()
{
	while (head)
	{
		Node<T> * pre = head;
		head = head->next;
		delete pre;
	}
}

/*
	@brief 移除特定的节点
	@param pos 特定的位置
*/
template<class T>
void LinkList<T>::remove(int pos)
{
	Node<T> * pre = move(pos);
	
	Node<T> * cur = pre -> next;

	Node<T> * link = cur->next;

	delete cur;
	
	pre->next = link;

	len--;
}

template<class T>
void LinkList<T>::insert(Node<T>  * data ,int pos)
{
	Node<T> * pre = move(pos);

	Node<T> * cur = pre -> next;

	pre->next = data;

	data->next = cur;

	len++;
}

/*
	@brief 打印
	@warning 需要子类重新实现
*/
template<class T>
void LinkList<T>::print()
{
	Node<T> * pre = head;
	while(pre->next)
	{
		pre = pre->next;
		
	}
}

/*
	@brief 移动到特定的节点
	@param 位置
	@retern 反回节点
*/
template<class T>
Node<T> * LinkList<T>::move(int pos)
{
	//_ASSERT(pos > 0,"error");
	Node<T> * pre = head; 
	for(int i = 0; i < pos; i++)
		pre = pre -> next;
	return pre;
}

#endif

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值