C++之链表

#include <iostream>
using namespace std;

template<class T> 
class LinkNode {//结点类
	template <class T> 
	friend class LinkList;//将链式表类声明为友类

public:
	LinkNode() { next = NULL; }//构造函数

private:
	T data;
	LinkNode<T> *next;//指向下一节点的指针
};

template <class T>
class LinkList {

public:
	LinkList();
	~LinkList();

	LinkList<T>& Insert(int k, const T& x);//插入和删除的写法,记住

	bool isEmpty() const;
	int GetLength() const;
	bool GetData(int k, T& x);
	bool ModifyData(int k, const T& x);
	int Find(const T& x);
	
	LinkList<T>& DeleteByIndex(int k, T& x);
	LinkList<T>& DeleteByKey(const T& x, T& y);

	void Output(ostream& out);


private:
	LinkNode<T> *head;//指向链表的第一个头节点的指针

};

template<class T>
LinkList<T>::LinkList()
{
	head = new LinkNode<T>();
}

template<class T>
LinkList<T>::~LinkList()
{
	T x;
	int len = GetLength();
	for (int i = len; i >= 1; i--)
		DeleteByIndex(i, x);
	delete head;
}

template<class T>
LinkList<T>& LinkList<T>::Insert(int k, const T& x)
{
	LinkNode<T> *p = head;//p指向头结点
	LinkNode<T>* newNode = new LinkNode<T>;//创建待插入的新结点
	newNode->data = x;
	int len = GetLength();
	if (k<1 || k>len + 1)
		cout << "失败";
	else {
		for (int i = 1; i < k; i++)
			p = p->next;
		newNode -> next = p->next;//在k处插入新结点
		p->next = newNode;
	}
	return *this;
}

template<class T>
bool LinkList<T>::isEmpty() const
{
	return head->next==NULL;
}

template<class T>
int LinkList<T>::GetLength() const
{
	int length = 0;
	LinkNode<T>* p = head->next;
	while (p) {
		length++;
		p = p->next;
	}
	return length;
}

template<class T>
bool LinkList<T>::GetData(int k, T& x)
{
	LinkNode<T>* p = head->next;
	int index = 1;
	if (k<1 || k>GetLength())
		return false;
	while (p != NULL && index < k) {
		index++;
		p = p->next;
	}
	if (p == NULL)
		return false;
	else {
		x = p->data;
		return true;
	}
}

template<class T>
bool LinkList<T>::ModifyData(int k, const T& x)
{
	LinkNode<T>* p = head->next;
	int index = 1;
	if (k<1 || k>GetLength())
		return false;
	while (p != NULL && index < k) {
		index++;
		p = p->next;
	}
	if (p == NULL)
		return false;
	else {
		p->data = x;
		return true;
	}
}

template<class T>
int LinkList<T>::Find(const T& x)
{
	LinkNode<T>* p = head->next;
	int index = 1;
	while (p != NULL && p->data!=x) {
		p = p->next; 
		index++;
	}
	if (p != NULL)
		return index;
	else
		return 0;
}

template<class T>
LinkList<T>& LinkList<T>::DeleteByIndex(int k, T& x)
{
	if (GetData(k, x)) {
		LinkNode<T>* p = head;
		LinkNode<T>* q = NULL;
		for (int i = 1; i < k; i++)//移动到第k-1位置
			p = p->next;
		q = p->next;
		p->next = q->next;
		delete q;
	}
	else
		cout << "失败";
	return *this;

}

template<class T>
LinkList<T>& LinkList<T>::DeleteByKey(const T& x, T& y)
{
	int index = Find(x);
	if (index != 0) {
		return DeleteByIndex(index, y);
	}
	else {
		cout << "失败";
		return *this;
	}

}

template<class T>
void LinkList<T>::Output(ostream& out)
{
	LinkNode<T>* p = head->next;
	while (p != NULL) {
		out << p->data << endl;
		p = p->next;
	}
}
template<class  T>
ostream& operator<<(ostream& out, LinkList<T>& x) {
	x.Output(out);
	return out;
}



int main() {
	LinkList<int> list;
	int x, y;
	list.Insert(1, 100);
	list.Insert(2, 200);
	list.Insert(3, 300);
	cout << "长度为:" << list.GetLength() << endl;

	if (list.GetData(3, x))
		cout << "第3个元素为" << x << endl;
	x = 200;
	cout << list.Find(x) << endl;
	x = 150;
	list.ModifyData(2, x);
	cout << list;

	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值