程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 數據結構——動態鏈表(C++)

數據結構——動態鏈表(C++)

編輯:C++入門知識

數據結構——動態鏈表(C++)


\

定義一個節點:

#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);
	cout << "a=" << a << ", b=" << b << endl;
	return 0;
}
上面的運算符重載,先將a類型強轉為T類型(也就是int),Java中的toString實際上就是類似的強轉成string類型的。

輸出一段簡單的鏈表

#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;
}
給鏈表添加一個元素

#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;
	}
};

//輸出鏈表
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 
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; inext;
		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指針就是我們需要找到的。刪除一個節點也一樣,需要找到指向該節點的指針。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved