鏈表和數組的區別及它們各自的常規操作:
鏈表和數組的區別:
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;
}