C++ linked list and linked list iterator

Go directly to the code. . . . . . . . . . . . .

#include <iostream>

using namespace std;

template <class T> class List;
template <class T> class ListIterator;

template <class T>
class Node
{
public:
	template <class T >
	friend class List;
	friend class ListIterator<T>;

private:
	T data;
	Node *link;
	Node(T d) :data(d), link(0) {}
};


template <class T>
class List
{
	friend class ListIterator<T>;
public:
	List() { first = 0; }

	void Insert(T n);   //插入元素
	void Delete(T k);	//删除元素
	void Invert();		//链表翻转
	void Concatenate(List * p); //连接两个链表

	void Show();

private:
	Node<T> *first;

};

template <class T>
class ListIterator  //链表迭代器
{
public:
	ListIterator(List<T> &l) :list(l),curr(l.first) {}

	bool NotNull();    //判断当前是否为null
	bool NextNotNull();//判断下一个是否为null
	T *First();       //获取第一个元素
	T* Next();		  //获取下一个元素


private:
	const List<T> &list;
	Node<T> *curr;

};

template <class T>
void List<T>::Insert(T n)
{
	Node<T> *p = new Node<T> (n);

	if (first == 0)
		first = p;
	else
	{
		p->link = first;
		first = p;
	}
}

template <class T>
void List<T>::Delete(T k)
{
	Node<T> *p = first, *pre = first;

	while (p)
	{
		if (p->data == k)
		{
			if (p == first)
			{
				if (first->link)
					first = first->link;
				else
					first = 0;
				delete p;
			}
			else
			{
				pre->link = p->link;
				delete p;
			}
			break;
		}
		pre = p;
		p = p->link;
	}
}

template<class T>
void List<T>::Show()
{
	Node<T> *p = first;

	while (p)
	{
		cout << p->data << " ";

		p = p->link;
	}

	cout << endl;
}

template <class T>
void List<T>::Invert()
{
	Node<T> *p = first, *q = 0;

	while (p)
	{
		Node<T> *r = q;
		q = p;
		p = p->link;
		q->link = r;
		cout << "invert" << endl;
	}

	first = q;
}

template <class T>
void List<T>::Concatenate(List * p)
{
	Node<T> *pp = first;
	Node<T> *pre = pp;

	while (pp)
	{
		pre = pp;
		pp = pp->link;
	}

	pre->link = p->first;

}

template<class T>
bool ListIterator<T>::NotNull()
{
	return curr != 0;
}

template <class T>
bool ListIterator<T>::NextNotNull()
{
	if ((curr != 0) && (curr->link != 0))
		return true;
	return false;
}

template <class T>
T* ListIterator<T>::First()
{
	if (list.first)
		return &list.first->data;

	return 0;
}

template<class T>
T* ListIterator<T>::Next()
{
	if (curr) 
	{
		curr = curr->link;
		return &curr->data;
	}

	return 0;
}

int main()
{
	List<int> l;

	cout << "test Insert() Delete() Invert()" << endl;
	l.Insert(1);
	l.Insert(2);
	l.Insert(3);
	l.Insert(4);
	l.Delete(1);
	l.Show();
	l.Invert();
	l.Show();

	cout << "Test  Concatenate()" << endl;

	List<int> l2;

	l2.Insert(10);
	l2.Insert(11);
	l2.Insert(12);
	l2.Insert(13);
	l2.Insert(14);

	l.Concatenate(&l2);

	l.Show();

	cout << "Test  ListIterator()" << endl;
	ListIterator<int> li(l);

	int * it = li.First();

	for (it; it != 0; it = li.Next())
		cout << *it << " ";

	cout << endl;


	return 0;
}

operation result:

 

 

Guess you like

Origin blog.csdn.net/weixin_40204595/article/details/107125732