数据结构 单链表 C++模板

数据结构 单链表 C++模板

#pragma once
#include<iostream>

using namespace std;

template<class C>
class LinkNode
{
	C data;
	LinkNode* next;

public:
	LinkNode();
	LinkNode(const C& data);

	void setData(const C& data) { this->data = data; }
	C& getData() { return this->data; }
	void setNext(LinkNode* next) { this->next = next; }
	LinkNode* getNext()const { return this->next; }
};

template<class C>
LinkNode<C>::LinkNode()
{
	next = NULL;
}

template<class C>
LinkNode<C>::LinkNode(const C& data)
{
	next = NULL;
	this->data = data;
}



template<class C>
class LinkList
{
	LinkNode<C> head;
	int length;

	//搜索到指定位置
	LinkNode<C>* search(int index);
public:
	LinkList();
	~LinkList();
	int getLength()const { return length; }
	bool insert(const C& data, int index);
	bool insertFirst(const C& data);
	bool insertLast(const C& data);
	bool del(const int index);
	bool isEmpty()const { return length == 0 ? true : false; }
	void print()const;

	//根据数据查找对应下标,未找到返回-1
	int indexOf(const C& data);

	//根据下标查找数据
	C& valueOf(int index);

	//寻找目标元素,找到返回指针,未找到返回NULL
	C* find(C& data);
};

template<class C>
LinkList<C>::LinkList()
{
	head.setNext(NULL);
	length = 0;
}

template<class C>
LinkList<C>::~LinkList()
{
	LinkNode<C>* p = head.getNext();
	LinkNode<C>* q;
	while (p != NULL)
	{
		q = p->getNext();
		delete p;
		p = q;
	}
}

//搜索到指定位置
template<class C>
LinkNode<C>* LinkList<C>::search(int index)
{
	LinkNode<C>* p = &head;
	int count = 0;
	while (p && count < index)
	{
		p = p->getNext();
		count++;
	}
	if (!p || count > index)
		return NULL;
	return p;
}

template<class C>
bool LinkList<C>::insert(const C& data, int index)
{
	if (index > getLength() + 1 || index < 1)
		return false;
	LinkNode<C>* p = search(index - 1);
	if (!p)
		return false;
	LinkNode<C>* s = new LinkNode<C>(data);
	s->setNext(p->getNext());
	p->setNext(s);
	length++;
	return true;
}

template<class C>
bool LinkList<C>::del(int index)
{
	if (isEmpty())
		return false;
	if (index > getLength() || index < 1)
		return false;
	LinkNode<C>* p = search(index - 1);
	if (!p)
		return false;
	LinkNode<C>* q = p->getNext();
	p->setNext(p->getNext()->getNext());
	length--;
	delete q;
	return true;
}

template<class C>
void LinkList<C>::print()const
{
	if (isEmpty())
		cout << "LinkList is NULL";
	LinkNode<C>* p = head.getNext();
	while (p)
	{
		cout << p->getData() << endl;
		p = p->getNext();
	}
	cout << endl;
}

//根据数据查找对应下标,未找到返回-1
template<class C>
int LinkList<C>::indexOf(const C& data)
{
	LinkNode<C>* p = head.getNext();
	int index = 1;
	if (!p)
		return -1;
	while (p)
	{
		if (p->getData() == data)
			return index;
		p = p->getNext();
		index++;
	}
	return -1;
}

//寻找目标元素,找到返回指针,未找到返回NULL
template<class C>
C* LinkList<C>::find(C& data)
{
	LinkNode<C>* p = head.getNext();
	int index = 1;
	if (!p)
		return NULL;
	while (p)
	{
		if (p->getData() == data)
			return &p->getData();
		p = p->getNext();
		index++;
	}
	return NULL;
}

//根据下标查找数据
template<class C>
C& LinkList<C>::valueOf(int index)
{
	LinkNode<C>* p = search(index);
	if (!p)
		exit(-1);
	return p->getData();
}

template<class C>
bool LinkList<C>::insertFirst(const C& data)
{
	if (insert(data, 1))
		return true;
	return false;
}

template<class C>
bool LinkList<C>::insertLast(const C& data)
{
	if (insert(data, length + 1))
		return true;
	return false;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值