链表和数组的区别.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;
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值