小说网 找小说 无限小说 烟雨红尘 幻想小说 酷文学 深夜书屋

双链表

    今天,我们一起用C++写一个双链表,具体代码如下:

DoubleList.h具体内容如下:

#include "NodeList.h"

template<typename Type> class DoublyList{
public:
	DoublyList() :head(new ListNode<Type>()){    //the head node point to itself
		head->m_pprior = head;
		head->m_pnext = head;
	}
	~DoublyList(){
		MakeEmpty();
		delete head;
	}

public:
	void MakeEmpty();   //make the list empty
	int Length();       //get the length of the list
	ListNode<Type> *Find(int n = 0);  //find the nth data
	ListNode<Type> * FindData(Type item);   //find the data which is equal to item
	bool Insert(Type item, int n = 0);     //insert item in the nth data
	Type Remove(int n = 0);   //delete the nth data
	Type Get(int n = 0);      //get the nth data
	void Print();           //print the list

private:
	ListNode<Type> *head;
};

template<typename Type> void DoublyList<Type>::MakeEmpty(){
	ListNode<Type> *pmove = head->m_pnext, *pdel;
	while (pmove != head){
		pdel = pmove;
		pmove = pdel->m_pnext;
		delete pdel;
	}
	head->m_pnext = head;
	head->m_pprior = head;
}

template<typename Type> int DoublyList<Type>::Length(){
	ListNode<Type> *pprior = head->m_pprior, *pnext = head->m_pnext;
	int count = 0;
	while (1){
		if (pprior->m_pnext == pnext){
			break;
		}
		if (pprior == pnext&&pprior != head){
			count++;
			break;
		}
		count += 2;
		pprior = pprior->m_pprior;
		pnext = pnext->m_pnext;
	}
	return count;
}

template<typename Type> ListNode<Type>* DoublyList<Type>::Find(int n = 0){
	if (n < 0){
		cout << "The n is out of boundary" << endl;
		return NULL;
	}
	ListNode<Type> *pmove = head->m_pnext;
	for (int i = 0; i < n; i++){
		pmove = pmove->m_pnext;
		if (pmove == head){
			cout << "The n is out of boundary" << endl;
			return NULL;
		}
	}
	return pmove;
}

template<typename Type> bool DoublyList<Type>::Insert(Type item, int n){
	if (n < 0){
		cout << "The n is out of boundary" << endl;
		return 0;
	}
	ListNode<Type> *newnode = new ListNode<Type>(item), *pmove = head;
	if (newnode == NULL){
		cout << "Application Erorr!" << endl;
		exit(1);
	}
	for (int i = 0; i < n; i++){   //find the position for insert
		pmove = pmove->m_pnext;
		if (pmove == head){
			cout << "The n is out of boundary" << endl;
			return 0;
		}
	}

	//insert the data
	newnode->m_pnext = pmove->m_pnext;
	newnode->m_pprior = pmove;
	pmove->m_pnext = newnode;
	newnode->m_pnext->m_pprior = newnode;
	return 1;
}

template<typename Type> Type DoublyList<Type>::Remove(int n = 0){
	if (n < 0){
		cout << "The n is out of boundary" << endl;
		exit(1);
	}
	ListNode<Type> *pmove = head, *pdel;
	for (int i = 0; i < n; i++){   //find the position for delete
		pmove = pmove->m_pnext;
		if (pmove == head){
			cout << "The n is out of boundary" << endl;
			exit(1);
		}
	}

	//delete the data
	pdel = pmove;
	pmove->m_pprior->m_pnext = pdel->m_pnext;
	pmove->m_pnext->m_pprior = pdel->m_pprior;
	Type temp = pdel->m_data;
	delete pdel;
	return temp;
}

template<typename Type> Type DoublyList<Type>::Get(int n = 0){
	if (n < 0){
		cout << "The n is out of boundary" << endl;
		exit(1);
	}
	ListNode<Type> *pmove = head;
	for (int i = 0; i < n; i++){
		pmove = pmove->m_pnext;
		if (pmove == head){
			cout << "The n is out of boundary" << endl;
			exit(1);
		}
	}
	return pmove->m_data;
}

template<typename Type> void DoublyList<Type>::Print(){
	ListNode<Type> *pmove = head->m_pnext;
	cout << "head";
	while (pmove != head){
		cout << "--->" << pmove->m_data;
		pmove = pmove->m_pnext;
	}
	cout << "--->over" << endl << endl << endl;

}

template<typename Type> ListNode<Type>* DoublyList<Type>::FindData(Type item){
	ListNode<Type> *pprior = head->m_pprior, *pnext = head->m_pnext;
	while (pprior->m_pnext != pnext && pprior != pnext){ //find the data in the two direction
		if (pprior->m_data == item){
			return pprior;
		}
		if (pnext->m_data == item){
			return pnext;
		}
		pprior = pprior->m_pprior;
		pnext = pnext->m_pnext;
	}
	cout << "can't find the element" << endl;
	return NULL;
}
NodeList.h具体内容如下:

template<typename Type> class DoublyList;

template<typename Type> class ListNode{
private:
	friend class DoublyList < Type > ;
	ListNode() :m_pprior(NULL), m_pnext(NULL){}
	ListNode(const Type item, ListNode<Type> *prior = NULL, ListNode<Type> *next = NULL)
		:m_data(item), m_pprior(prior), m_pnext(next){}
	~ListNode(){
		m_pprior = NULL;
		m_pnext = NULL;
	}
public:
	Type GetData();
private:
	Type m_data;
	ListNode *m_pprior;
	ListNode *m_pnext;
};

template<typename Type> Type ListNode<Type>::GetData(){
	return this->m_data;
}
main.cpp的内容如下:

#include <iostream>
#include "DoubleList.h"

using namespace std;

int main()
{
	DoublyList<int> list;
	for (int i = 0; i < 20; i++){
		list.Insert(i * 3, i);
	}
	cout << "the Length of the list is " << list.Length() << endl;
	list.Print();
	for (int i = 0; i < 5; i++){
		list.Insert(3, i * 3);
	}
	cout << "the Length of the list is " << list.Length() << endl;
	list.Print();

	list.Remove(5);
	cout << "the Length of the list is " << list.Length() << endl;
	list.Print();

	cout << list.FindData(54)->GetData() << endl;

	cout << "The third element is " << list.Get(3) << endl;

	list.MakeEmpty();
	cout << "the Length of the list is " << list.Length() << endl;
	list.Print();

	cin.get();
	return 0;
}
运行效果如图1所示:

图1 运行效果

posted on 2014-09-14 16:24  牛栏山1  阅读(83)  评论(0编辑  收藏  举报

导航