定義一個節點:
- #include <iostream>
- 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;
- }
上面的運算符重載,先將a類型強轉爲T類型(也就是int),Java中的toString實際上就是類似的強轉成string類型的。
輸出一段簡單的鏈表
- #include <iostream>
- 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;
- }
給鏈表添加一個元素
- #include <iostream>
- using 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++實現的鏈表如下:
- #include <iostream>
- using 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<pos; i++)
- p = p->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指針就是我們需要找到的。刪除一個節點也一樣,需要找到指向該節點的指針。
原文轉自:http://www.tuicool.com/articles/nA7VjmU
原作者爲 dawanganban. 請尊重原作者版權