1. 程式人生 > >C++實現的單鏈表通用模板

C++實現的單鏈表通用模板



    這兩天覆習了一下單鏈表,決定用C++寫一個單鏈表的統一模板,方便使用時可直接呼叫。所謂單鏈表,是指一串相同的結構體,其中,前一個結構體中儲存了指向下一個結構體的指標,是陣列的進化形式。單鏈表示意圖如下:

 

連結串列的常見操作有:查詢(Find)、插入(Insert)、刪除(Delete)等。單鏈表在表的起始處一般為一個空的表頭,該表頭只儲存一個指向下節點的指標,而不儲存其它元素資訊。當然這不是必須的,但這樣做使得插入(Insert)、刪除(Delete)等操作免去額外的麻煩。

   我們首先建立一個<List.h>標頭檔案,宣告一個單鏈表結構:

#include "List.h"

//建立一個單鏈表結構,包含一些常見的操作
#ifndef _List_H_
#define _List_H_

#include <iostream>

struct Node{
	int element;  //節點儲存資訊可以根據需要修改!
	Node* next;
};

Node* CreateLists(); //建立一個空表,並返回表頭
void DeleteLists(Node* head); //刪除表頭為head的該連結串列
bool IsLast(Node* P);
Node* Find(int X, Node* head);
Node* FindPrevious(int X, Node* head);
void Delete(int X, Node* head);
void Insert(Node* P, int X); //在節點P後面插入X
void OutputLists(Node* head); //輸出連結串列中所有元素的值

#endif    

    然後在<List.cpp>檔案裡實現標頭檔案中的連結串列操作:

#include "List.cpp"

#include "list.h"

Node* CreateLists()
{
	Node* head = new Node;
	head->next = NULL;
	return head;
}

void DeleteLists(Node* head)
{
	Node* P = head->next, *temp;
	head->next = NULL;
	while(P)
	{
		temp = P->next;
		delete P;
		P = temp;
	}
}

bool IsLast(Node* P)
{
	return P->next == NULL;
}

Node* Find(int X, Node* head)
{
	Node* P = head->next;
	while(P && P->element!=X)
		P = P->next;
	return P;
}

Node* FindPrevious(int X, Node* head)
{
	Node* P=head;
	while(P->next && P->next->element!=X)
		P=P->next;
	return P;
}

void Delete(int X, Node* head)
{
	Node* P = FindPrevious(X,head), *temp; //如果沒找到X,則返回的是連結串列最後一項
	if(P->next)
	{
		temp = P->next;
		P->next = temp->next;
		delete temp;
	}
}

void Insert(Node* P, int X)
{
	Node* tempX = new Node;
	tempX->element = X;
	tempX->next = P->next;
	P->next = tempX;
}

void OutputLists(Node* head)
{
	Node* P = head->next;
	while(P)
	{
		std::cout<<P->element<<"   ";
		P = P->next;
	}
	std::cout<<std::endl;
}
        最後,我們用一段main程式碼驗證一下正確性:
#include <iostream>
#include <assert.h>
#include "list.h"

using namespace std;

int main()
{
	int Date[8] = {2,9,5,8,15,32,7,4};
	Node *head = CreateLists();
	Node *P = head;
	for(int i=0;i<8;i++)
	{
		Insert(P,Date[i]);
		P = P->next;
	}
	cout<<"打印出連結串列中所有元素:\n";
	OutputLists(head);
	if(IsLast(P))
		cout<<"該Lists的最後一個節點為:"<<P->element<<endl;
	else
		cout<<"P不是最後一個節點!!P等於:"<<P->element<<endl;
	
	if(Find(15,head))
		cout<<"Find函式在該Lists中找到了值為15的節點!!!\n";
	else
		cout<<"Find函式沒找到值為15的節點!!\n";

	cout<<"FindPrevious函式找到節點15的前一個節點為:"<<FindPrevious(15,head)->element<<endl;
	cout<<"而節點15的前一個節點應該為“8”!\n";

	Delete(8, head);
	if(Find(8,head))
		cout<<"Delete(8, head)後,在該Lists中找到了值為8的節點!!!\n";
	else
		cout<<"Delete(8, head)後,Find函式沒找到值為8的節點!!\n";

	DeleteLists(head); 
	if(head->next)
		cout<<"DeleteLists函式未成功刪除連結串列!!\n";
	else
		cout<<"連結串列已經為空!DeleteLists函式沒有問題!!!\n";
	return 0;
}
結果如下: