C++實現的單鏈表通用模板
阿新 • • 發佈:2019-02-20
這兩天覆習了一下單鏈表,決定用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"
最後,我們用一段main程式碼驗證一下正確性:#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; }
#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;
}
結果如下: