[04.28更新]C++ 單向連結串列的實現
阿新 • • 發佈:2019-02-18
參考: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;
請按任意鍵繼續. . .