单链表各种操作,VS2013+番茄插件写着真爽

//************************************************************************
//    链表的各种操作2
//************************************************************************

//第一步,定义节点类
template<class T>
class slistNode
{
public:
	slistNode(){ next = NULL; }//初始化
	T data;//值
	slistNode* next;//指向下一个节点的指针
};

//第二步,写单链表类的声明,包括属性和方法。
template<class T>
class myslist
{
private:
	unsigned int listlength;
	slistNode<T>* node;//临时节点
	slistNode<T>* lastnode;//尾结点
	slistNode<T>* headnode;//头节点
public:
	myslist();//初始化
	unsigned int length();//链表元素的个数
	void add(T x);//表尾添加元素
	void traversal();//遍历整个链表并打印
	bool isEmpty();//判断链表是否为空
	slistNode<T>* find(T x);//查找第一个值为x的节点,返回节点的地址,找不到返回NULL
	void Delete(T x);//删除第一个值为x的节点
	void insert(T x, slistNode<T>* p);//在p节点后插入值为x的节点
	void insertHead(T x);//在链表的头部插入节点

};

//第三步,写构造函数,初始化链表类的属性。
template<class T>
myslist<T>::myslist()
{
	node = NULL;
	lastnode = NULL;
	headnode = NULL;
	listlength = 0;
}

//第四步,实现add()方法。
template<class T>
void  myslist<T>::add(T x){
	node = new slistNode<T>();
	node->data = x;
	if (lastnode == NULL){
		headnode = node;
		lastnode = node;
	}
	else{
		lastnode->next = node;
		lastnode = node;
	}
	++listlength;
}

//第五步,实现traversal()函数,遍历并输出节点信息。
template<class T>
void myslist<T>::traversal(){
	node = headnode;
	while (node!=NULL)
	{
		cout << node->data << ' ';
		node = node->next;
	}
	cout << endl;
}

//第六步,实现isEmpty()函数,判断链表是否为空,返回真为空,假则不空。
template<class T>
void myslist<T>::isEmpty(){
	return listlength == 0;
}

//第七步,实现find()函数。

template<class T>
slistNode<T>* myslist<T>::find(T x){
	node = headnode;
	while (node!=NULL && node->data!=x)
	{
		node = node->next;
	}
	return node;
}

//第八步,实现delete()函数,删除第一个值为x的节点
template<class T>
void myslist<T>::Delete(T x){
	slistNode<T> * temp = headnode;
	if (temp == NULL){
		return;
	}
	if (temp->data == x){
		headnode = temp->next;
		if (temp->next == NULL){
			lastnode = NULL;
		}
		delete(headnode);
	}
	while (temp->next!=NULL &&	temp->next->data!=x ){
		temp = temp->next;
	}
	if (temp->next == NULL){
		return;
	}
	if (temp->next == lastnode){
		lastnode = temp;
		delete(temp->next);
		temp->next = NULL;
	}
	else{
		node = temp->next;
		temp->next = node->next;
		delete(node);
		node = NULL;
	}

}

//第九步,实现insert()和insertHead()函数,在p节点后插入值为x的节点。
template<class T>
void myslist<T>::insertHead(T x){
	node = new slistNode<T>();
	node->data = x;
	node->next = headnode;
	headnode = node;
}

template<class T>
void myslist<T>::insert(T x, slistNode<T>* p){
	if (p == NULL){
		return;
	}
	node = new slistNode<T>();
	node->data = x;
	node->next = p->next;
	p->next = node;
	if (p->next == NULL){
		lastnode = node;
	}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值