單向連結串列之C++實現
阿新 • • 發佈:2019-01-10
單向連結串列是常用的資料結構,之前只是看過,沒有自己動手實現過,現在來實現以下,沒什麼難度,只是有些地方容易忽略。
把連結串列和連結串列結點定義在.h檔案中
//filename linklist.h #ifndef LINKLIST_H #define LINKLIST_H #include<iostream> //結點結構 class Node{ public: Node(int d):data(d),next(NULL){} int data; Node* next; }; class LinkList{ public: LinkList() { Head=NULL; } void init(Node *p) { Head=p; } void insert(Node*);//插入 Node* deleteNode(Node*);//刪除 void traverse(void(*visit)(Node*));//遍歷連結串列 void destroy();//銷燬連結串列 Node* search(int key);//查詢 private: Node* Head; }; #endif
函式的實現在對應的.cpp檔案中
#include"linklist.h" //在頭結點插入新節點 void LinkList::insert(Node *p) { p->next=Head; Head=p; } //在連結串列中刪除結點p,成功則返回p,否則返回null Node* LinkList::deleteNode(Node* p) { Node** pnext;//pnext為指向指標的指標 for(pnext=&Head;*pnext;pnext=&(*pnext)->next) { if(*pnext==p) { *pnext=p->next; return p; } } return NULL; } //遍歷連結串列 void LinkList::traverse(void(*visit)(Node*)) { Node* p; for(p=Head;p;p=p->next) visit(p); } //在連結串列中查詢數值為key的結點,找到(第一個)則返回結點指標,否則返回NUlLL Node* LinkList::search(int key) { Node* p; for(p=Head;p;p=p->next) if(p->data==key) return p; return NULL; } void LinkList::destroy() { Node* p; Node* q; for(p=Head;p;) { q=p->next; delete p; p=q; } Head=NULL; }
其中deleteNode函式的實現,沒有考慮要刪除的結點是否為頭結點。其中用了指向指標的指標。
最後寫個測試程式
#include<iostream> #include"linklist.h" using namespace std; //遍歷函式 void printData(Node *p) { cout<<p->data<<endl; } int main() { LinkList H; Node *p; for(int i=0;i<10;i++) { p=new Node(i); H.insert(p); } p=H.search(5);//在連結串列找到結點 Node* t=H.deleteNode(p);//把這個結點移除連結串列,並沒有釋放空間 H.deleteNode(t);//釋放結點空間 H.traverse(printData);//遍歷 H.destroy(); return 0; }