鏈表和數組的區別.md

鏈表和數組的區別及它們各自的常規操作:

鏈表和數組的區別:

1.存儲形式:數組是一塊連續的空間,聲明是就要確定長度。而鏈表是一塊可不連續的動態
空間,長度可變,每個節點都要保存相鄰節點指針。
2.數據查找:數組的線性查找速度快,查找直接使用下標(偏移地址)。鏈表需要按順序檢索節點,
效率很低。
3.數據插入和刪除:鏈表可以很快插入和刪除節點,但是數組可能需要移動大量的數據。
4.越界問題:鏈表不存在越界問題,而數組存在越界問題。
5.數組便於查找,鏈表便於插入查找。數組節省空間,但長度固定。鏈表長度可變,但佔了
更多的存儲空間。

鏈表和數組的一般操作:

(單鏈表)鏈表的刪除指定node節點:

	node->val = node->next->val;
    node->next = node->next->next;

(單鏈表)鏈表插入節點( p節點之後插入q):

	q->next = p->next;
	p->next = q;

(雙鏈表)刪除p節點:

	p->pred->next = p->next;
	p->next->pred = p->pred;
	(順序可顛倒)

(雙鏈表)當前節點p後插入node節點:

	p->next->pred = node;
	p->next = node;
	(順序不可顛倒)

數組插入和刪除元素:

	#include <iostream>
	using namespace std;
	
	const int CAPACITY = 100;	//數組的容量
	int arrSize = 6;	//數組的實際大小
	
	//插入元素,arr要處理的數組,num要插入的元素,pos要插入的位置
	template <typename T>
	T insertElement(T arr[],T num, int pos)
	{
		if (pos<0 || pos>arrSize)
			return 0;
	
		//如果有必要可先擴容expand()
		for (int i = arrSize; i > pos; i--)
			arr[i] = arr[i - 1];
		arr[pos] = num;
		arrSize++;	//更新數組實際大小
		return num;
		//返回插入的元素
	}
	
	//刪除指定位置元素,arr待處理數組,pos爲指定的位置
	template <typename T>
	T deleteElement(T arr[], int pos)
	{
		if (pos < 0 || pos >= arrSize)
			return 0;
	
		int re = pos;
		int nextPos = pos + 1;
		while (nextPos < arrSize)
		{
			arr[pos++] = arr[nextPos++];
		}
		arrSize = pos;	//更新數組實際大小
		//若有必要,可縮容shrink
		return arr[re];
	}
	
	//打印數組
	template <typename T>
	void traverseArr(T arr[])
	{
		for (int i = 0; i < arrSize; i++)
		{
			cout << arr[i] << " ";
		}
		cout << endl;
	}
	
	int main()
	{
		int arr[CAPACITY] = { 1,2,5,8,2,6 };
		insertElement(arr, 3, 2);
		traverseArr(arr);
		//輸出:1 2 3 5 8 2 6
	
		deleteElement(arr, 3);
		traverseArr(arr);
		//輸出:1 2 3 8 2 6
	
		return 0;
	}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章