链表和数组的区别及它们各自的常规操作:
链表和数组的区别:
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;
}