使用C++實(shí)現(xiàn)單鏈表的操作與實(shí)踐
一、單鏈表的基本概念
單鏈表是一種由節(jié)點(diǎn)組成的線性數(shù)據(jù)結(jié)構(gòu),其中每個(gè)節(jié)點(diǎn)包含數(shù)據(jù)部分和指向下一個(gè)節(jié)點(diǎn)的指針。與數(shù)組不同,鏈表的節(jié)點(diǎn)在內(nèi)存中不要求連續(xù)存儲(chǔ),而是通過(guò)指針連接。因此,鏈表的插入和刪除操作較為靈活,不需要大量的數(shù)據(jù)移動(dòng)。
在C++中,我們通過(guò)類的封裝特性來(lái)實(shí)現(xiàn)面向?qū)ο蟮逆湵恚@不僅能有效管理鏈表的內(nèi)存,還能通過(guò)封裝實(shí)現(xiàn)更易用、更安全的操作。
二、單鏈表類的設(shè)計(jì)
我們將通過(guò)一個(gè)簡(jiǎn)單的C++類來(lái)實(shí)現(xiàn)單鏈表,該類包含基本的鏈表操作,如插入、刪除、打印鏈表等。
1. 節(jié)點(diǎn)的定義
首先,我們定義了一個(gè) Node
結(jié)構(gòu)體來(lái)表示鏈表中的每個(gè)節(jié)點(diǎn)。每個(gè)節(jié)點(diǎn)包含一個(gè)數(shù)據(jù)部分 data
和一個(gè)指向下一個(gè)節(jié)點(diǎn)的指針 next
。
struct Node { int data; // 數(shù)據(jù)域 Node* next; // 指針域,指向下一個(gè)節(jié)點(diǎn) };
2. 鏈表的類定義
接下來(lái),我們定義 List
類,它包含一個(gè)指向鏈表頭部的指針 phead
,以及若干成員函數(shù)來(lái)實(shí)現(xiàn)鏈表的常見(jiàn)操作。
class List { private: Node* phead; // 鏈表頭指針 public: // 構(gòu)造函數(shù) List() : phead(nullptr) {} // 析構(gòu)函數(shù) ~List() { while (phead != nullptr) { PopFront(); } } // 創(chuàng)建節(jié)點(diǎn) Node* CreateNode(int x) { Node* node = new Node; node->data = x; node->next = nullptr; return node; } // 打印鏈表 void PrintList() { Node* cur = phead; while (cur) { cout << cur->data << "-->"; cur = cur->next; } cout << "NULL" << endl; } // 頭插法 void PushFront(int x) { Node* newNode = CreateNode(x); newNode->next = phead; phead = newNode; } // 尾插法 void PushBack(int x) { Node* newNode = CreateNode(x); if (phead == nullptr) phead = newNode; else { Node* tail = phead; while (tail->next != nullptr) { tail = tail->next; } tail->next = newNode; } } // 頭刪 void PopFront() { if (phead == nullptr) cout << "鏈表為空,無(wú)法進(jìn)行刪除操作!" << endl; else { Node* del = phead; phead = del->next; delete del; del = nullptr; } } // 尾刪 void PopBack() { if (phead == nullptr) cout << "鏈表為空,無(wú)法進(jìn)行刪除操作!" << endl; else { if (phead->next == nullptr) { delete phead; phead = nullptr; } else { Node* tail = phead; while (tail->next->next != nullptr) { tail = tail->next; } delete tail->next; tail->next = nullptr; } } } };
三、單鏈表的操作實(shí)現(xiàn)
- PushFront: 在鏈表的頭部插入新節(jié)點(diǎn)。
- PushBack: 在鏈表的尾部插入新節(jié)點(diǎn)。
- PopFront: 刪除鏈表的頭節(jié)點(diǎn)。
- PopBack: 刪除鏈表的尾節(jié)點(diǎn)。
- PrintList: 打印鏈表中的所有節(jié)點(diǎn)。
四、測(cè)試與演示
下面的 main
函數(shù)展示了如何使用上述鏈表類實(shí)現(xiàn)基本操作:
int main() { List ls1; // 創(chuàng)建一個(gè)鏈表對(duì)象 // 進(jìn)行一些操作 ls1.PushBack(1); ls1.PushBack(2); ls1.PushBack(3); ls1.PushBack(4); ls1.PushBack(5); // 打印鏈表 ls1.PrintList(); // 頭刪除和尾刪除 ls1.PopFront(); ls1.PopBack(); // 頭插操作 ls1.PushFront(9); // 打印鏈表 ls1.PrintList(); return 0; }
五、鏈表操作的復(fù)雜度
- PushFront 和 PopFront:這兩個(gè)操作的時(shí)間復(fù)雜度為 O(1),因?yàn)樗鼈儍H僅操作鏈表的頭節(jié)點(diǎn)。
- PushBack 和 PopBack:這兩個(gè)操作的時(shí)間復(fù)雜度為 O(n),需要遍歷整個(gè)鏈表,直到找到尾節(jié)點(diǎn)。
- PrintList:打印鏈表的時(shí)間復(fù)雜度為 O(n),需要遍歷所有節(jié)點(diǎn)。
六、完整代碼
#include<iostream> using namespace std; //節(jié)點(diǎn)類型聲明 struct Node { int date; Node* next; }; class List { private: //成員變量 Node* phead; public: //成員函數(shù) List() : phead(nullptr) {}//構(gòu)造函數(shù) ~List()//析構(gòu)函數(shù) { while(phead!=NULL) { PopFront(); } } Node* CreateNode(int x)//創(chuàng)建節(jié)點(diǎn) { Node* node=new Node; node->date=x; node->next=NULL; return node; } void PrintList()//打印鏈表 { Node *cur=phead; while(cur) { cout<<cur->date<<"-->"; cur=cur->next; } cout<<"NULL"<<endl; } void PushFront(int x)//頭插 { Node*newnode=CreateNode(x); newnode->next=phead; phead=newnode; } void PushBack(int x)//尾插 { Node*newnode=CreateNode(x); if(phead==NULL) phead=newnode; else { Node* tail = phead; while (tail->next != NULL) { tail = tail->next; } tail->next = newnode; } } void PopFront() //頭刪 { if (phead==NULL) cout<<"鏈表為空,無(wú)法進(jìn)行刪除操作!"<<endl; else { Node* del=phead; phead=del->next; delete del; del=NULL; } } void PopBack() //尾刪 { if (phead== NULL) cout<<"鏈表為空,無(wú)法進(jìn)行刪除操作!"<<endl; else { if(phead->next==NULL) { delete phead; phead=NULL; } else { Node* tail = phead; while (tail->next->next != NULL) { tail = tail->next; } delete tail->next; tail->next=NULL; } } } }; int main() { List ls1; ls1.PushBack(1); ls1.PushBack(2); ls1.PushBack(3); ls1.PushBack(4); ls1.PushBack(5); ls1.PrintList(); ls1.PopFront(); ls1.PopBack(); ls1.PushFront(9); ls1.PrintList(); return 0; }
七、總結(jié)
通過(guò)面向?qū)ο蟮姆绞綄?shí)現(xiàn)單鏈表,我們可以更加方便和安全地進(jìn)行鏈表操作。封裝了節(jié)點(diǎn)管理、內(nèi)存管理以及鏈表操作函數(shù)的類,讓鏈表操作更加直觀并且容易維護(hù)。在實(shí)際開(kāi)發(fā)中,鏈表結(jié)構(gòu)廣泛應(yīng)用于各種算法和數(shù)據(jù)管理系統(tǒng),掌握鏈表的使用可以幫助我們高效地解決許多動(dòng)態(tài)數(shù)據(jù)管理的問(wèn)題。
以上就是使用C++實(shí)現(xiàn)單鏈表的操作與實(shí)踐的詳細(xì)內(nèi)容,更多關(guān)于C++實(shí)現(xiàn)單鏈表的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C\C++實(shí)現(xiàn)讀寫(xiě)二進(jìn)制文件的方法詳解
這篇文章主要為大家詳細(xì)介紹了C\C++實(shí)現(xiàn)讀寫(xiě)二進(jìn)制文件的方法,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以了解一下2023-03-03undefined reference to `SetPduPowerConsumptionCnt''錯(cuò)誤的解決方法
編譯時(shí)出現(xiàn)undefined reference to `SetPduPowerConsumptionCnt'錯(cuò)誤要如何解決呢?有沒(méi)有什么好的解決方法?下面小編就為大家解答吧,如果你也遇到了這種情況,可以過(guò)來(lái)參考下2013-07-07C++?指針和對(duì)象成員訪問(wèn)的區(qū)別:`.`?與?`->`?的使用小結(jié)
在學(xué)習(xí)?C++?時(shí),常常會(huì)遇到訪問(wèn)對(duì)象成員的兩種符號(hào):.?和?->,這兩個(gè)符號(hào)看似簡(jiǎn)單,但它們的正確使用卻需要理解指針和對(duì)象的本質(zhì)差異,本文介紹C++?指針和對(duì)象成員訪問(wèn)的區(qū)別:`.`?與?`->`?的使用指南,感興趣的朋友一起看看吧2024-12-12關(guān)于C++出現(xiàn)Bus error問(wèn)題的排查與解決
項(xiàng)目代碼中經(jīng)常出現(xiàn)莫名其妙的Bus error問(wèn)題,并且代碼中增加很多try catch 后依然不能將錯(cuò)誤捕獲,一旦Bus erro出現(xiàn),進(jìn)程直接崩潰掉,所以本文給大家介紹了關(guān)于C++出現(xiàn)Bus error問(wèn)題的排查與解決,需要的朋友可以參考下2024-01-01