1. 程式人生 > >[04.28更新]C++ 單向連結串列的實現

[04.28更新]C++ 單向連結串列的實現

參考:http://www.cnblogs.com/wxxweb/archive/2011/05/26/2058245.html

http://my.oschina.net/ijaychen/blog/164330

連結串列節點類ChainNode和連結串列類Chain

chain.h 

// 連結串列模板類前置宣告
template<class T>
class Chain;

// 節點類 ChainNode
template<class T>
class ChainNode{
// Chain<T>可以訪問ChainNode<T>的所有成員(尤其是私有成員)
friend class Chain<T>; // 或 friend Chain<T>
private:
	T data;  // 資料域
	ChainNode<T> *link; // 指標域
};

// 單鏈表類 Chain
template <class T>
class Chain{
public:
	// 建構函式,無引數,初始化為:第一個節點的指標為空;
	Chain(){ first = 0; }  // 或者 first = NULL
	
	// 解構函式
	~Chain();
	
	// 判斷單鏈表是否為空,如果第一個節點指標的first為Null或零,則為空
	bool IsEmpty() const { return first == 0; } 
	
	// 單鏈表長度函式(節點個數)
	int Length() const;
	
	// 查詢第k個元素並儲存在x中
	bool Find(int k, T& x) const; // 查詢第k個元素並儲存在x中
	
	// 在單鏈表中尋找x,如果發現x,則返回x的地址(index,次序) 
	int Search(const T& x) const;

	// 把第k個元素取至x,然後從連結串列中刪除第k個元素,返回刪除第k個元素後的連結串列
	Chain<T>& Delete(int k, T& x);
	
	// 在第k個元素之後插入x
	Chain<T>& Insert(int k, const T& x);
	
	// 按順序輸出單鏈表
	void Output() const;
	
private:
	ChainNode<T> *first; // 指向第一個節點的指標
}; 

// 解構函式,從開始刪除
template<class T>
Chain<T>::~Chain()
{
	ChainNode<T> *next; // 下一個節點
	while (first)
	{
		next = first->link;
		delete first;
		first = next;
	}
}

// 在連結串列中插入元素
template<class T>
Chain<T>& Chain<T>::Insert(int k, const T& x)
{
	// 在第k個元素之後插入x
	ChainNode<T> *p = first; // p最終指向第k個節點
	// 將p指向第k個元素(第k-1個元素的指標域)
	for (int index = 1; index < k && p; ++index)
		p = p->link;
	// 插入
	ChainNode<T> *y = new ChainNode<T>; // 新的節點
	y->data = x;
	if (k) // 插入節點
	{
		y->link = p->link;
		p->link = y;
	}
	else // 插入第一個節點(k=0)
	{
		y->link = first;
		first = y;
	}
	return *this;
}

// 輸出連結串列
template<class T>
void Chain<T>::Output() const
{
	ChainNode<T> *current;
	int count = 1;
	for (current = first; current; current = current->link)
	{
		cout << "第" << count << "個元素: "
			<< current->data << ";" << endl;; // (*current).data
		++count;
	}
}

// 確定連結串列的長度
template<class T>
int Chain<T>::Length() const
{
	ChainNode<T> *current = first;
	int len = 0;
	while (current)
	{
		++len;
		current = current->link;
	}
	return len;
}

// 在連結串列中查詢第k個元素
template<class T>
bool Chain<T>::Find(int k, T& x) const
{
	// 尋找連結串列中第k個元素,並將其返回給x
	// 如果不存在第k個元素,則返回false,否則返回true
	if (k < 1) return false;
	ChainNode<T> *current = first;
	int index = 1; // current的索引
	while (index < k && current)
	{
		current = current->link;
		++index;
	}
	if (current) { x = current->data; return true; }
	return false;
}

// 在連結串列中搜索
template<class T>
int Chain<T>::Search(const T& x) const
{
	// 尋找x,如果發現x,則返回x的地址
	// 如果x不再連結串列中,則返回0
	ChainNode<T> *current = first;
	int index = 1; // current的索引
	while (current && current->data != x)
	{
		current = current->link;
		++index;
	}
	if (current) return index;
	return 0;
}

// 在連結串列中刪除一個元素
template<class T>
Chain<T>& Chain<T>::Delete(int k, T& x)
{
	// 把第k個元素取至x,然後從連結串列中刪除第k個元素
	
	ChainNode<T> *p = first; // p最終指向第k個元素
	if (k == 1) // p已經指向第k個元素
		first = first->link; // 刪除
	else
	{
		ChainNode<T> *q = first;
		for (int index = 1; index < k - 1 && q; ++index)
			q = q->link;
		p = q->link; // 存在第k個元素
		q->link = p->link; // 刪除第k個元素
	}
	x = p->data;
	delete p;
	return *this;
}

test.cpp

#include<iostream>
#include "chainnode.h"
using namespace std;

int main()
{
	Chain<int> myChain;

	// 插入新元素
	int data[] = { 0, 2, 9, 13, 6, 2, 8, 25, 6 };
	int len = sizeof(data) / sizeof(int);
	for (int i = 0; i < len; ++i)
		myChain.Insert(i, data[i]);

	// 輸出連結串列
	myChain.Output();

	// 連結串列長度
	cout << "連結串列長度為: " << myChain.Length() << "." << endl;


	// 查詢第k個元素
	int x = 0;
	int k = 3;
	myChain.Find(k, x);
	cout << "第" << k << "個元素為: " << x << "." << endl;

	// 搜尋
	x = 8;
	cout << x << " 是第 " << myChain.Search(x) << " 個元素." << endl;

	// 刪除一個元素
	k = 3;
	myChain.Delete(k, x);
	cout << "刪除第 " << k << " 個元素後,變為:" << endl;
	myChain.Output();

	return 0;
}

輸出結果為:

第1個元素: 0;
第2個元素: 2;
第3個元素: 9;
第4個元素: 13;
第5個元素: 6;
第6個元素: 2;
第7個元素: 8;
第8個元素: 25;
第9個元素: 6;
連結串列長度為: 9.
第3個元素為: 9.
8 是第 7 個元素.
刪除第 3 個元素後,變為:
第1個元素: 0;
第2個元素: 2;
第3個元素: 13;
第4個元素: 6;
第5個元素: 2;
第6個元素: 8;
第7個元素: 25;
第8個元素: 6;
請按任意鍵繼續. . .