定義一個節點:
#include上面的運算符重載,先將a類型強轉為T類型(也就是int),Java中的toString實際上就是類似的強轉成string類型的。using namespace std; typedef int T; struct Node{ T data; Node* next; Node(const T& d):data(d), next(NULL){} operator T(){ return data; } }; int main(){ Node a(10), b(20); cout << "a=" << a << ", b=" << b << endl; return 0; }
輸出一段簡單的鏈表
#include給鏈表添加一個元素using namespace std; typedef int T; struct Node{ T data; Node* next; Node(const T& d):data(d), next(NULL){} operator T(){ return data; } }; int main(){ Node a(10), b(20), c(30), d(40), e(50); a.next = &b; b.next = &c; c.next = &d; Node *p = &a; while(p != NULL){ cout << *p << ' '; p = p->next; } cout << endl; return 0; }
#includeusing namespace std; typedef int T; struct Node{ T data; Node* next; Node(const T& d):data(d), next(NULL){} operator T(){ return data; } }; //輸出鏈表 void showlist(Node* p){ while(p != NULL){ cout << *p << ' '; p = p->next; } cout << endl; } int main(){ Node a(10), b(20), c(30), d(40), e(50); a.next = &b; b.next = &c; c.next = &d; showlist(&a); //添加一個節點 Node* & p = b.next;//取b.next指針的別名 e.next = p; p = &e; showlist(&a); //再添加一個節點 Node* k = new Node(70); Node*& r = c.next; k->next = r; r = k; return 0; }
一個C++實現的鏈表如下:
#includeusing namespace std; typedef int T; class List{ struct Node{ T data; Node * next; //T()零初始化 Node(const T& d=T()):data(d), next(0){} }; Node * head; //頭指針 int len; public: List():head(NULL),len(0){ } //插入到任何位置 //1、在鏈表裡找到指向那個位置的指針pn //2、讓新節點的next成員和pn指向同一個地方 //3、再讓pn指向新節點 void insert(const T&d, int pos){ Node*& pn = getptr(pos); Node* p = new Node(d); p->next = pn; pn = p; len++; } //返回鏈表長度 int size()const{ return len; } //尾插 void push_back(const T& d){ insert(d, size()); } //找鏈表中指向指定位置的指針 Node*& getptr(int pos){ if(pos<0 || pos>size()) pos = 0; if(pos==0) return head; Node* p = head; for(int i=1; i next; return p->next; } //前插 void push_front(const T& d){ insert(d, 0); } //遍歷 void travel()const{ Node* p = head; while(p!=NULL){ cout << p->data << ' '; p = p->next; } cout << endl; } //清空 void clear(){ while(head!=NULL){ Node * p = head->next; delete head; head = p; } len = 0; } ~List(){ clear(); } //按照位置刪除 //1、找到鏈表中指向那個位置的指針 //2、把那個指針另存一份 //3、讓那個指針指向下一個節點 //4、釋放那個指針的動態內存 void erase(int pos){ if(pos<0 || pos>=size()) return; Node *& pn = getptr(pos); Node * p = pn; pn = pn->next; delete p; --len; } //根據元素查找位置 int find(const T& d)const{ int pos = 0; Node* p = head; while(p){ if(p->data==d) return pos; p = p->next; ++pos; } return -1; } //根據元素刪除 void remove(const T& d){ int pos; while((pos = find(d)) != -1) erase(pos); } }; int main(){ List l; l.push_front(5); l.push_front(8); l.push_front(20); //在第2個位置插入9 l.insert(9, 2); l.travel(); return 0; }
通過上圖可以看出來,如果我們要插入一個節點,就需要找到指向該位置的指針(或者前一個結點),比如上圖的p->next指針就是我們需要找到的。刪除一個節點也一樣,需要找到指向該節點的指針。