顺序表和单链表

==============================================================================================================================

顺序表和单链表

顺序表

顺序表存储位置是相邻连续的,可以随即访问(可用数组下标的方式访问)的一种数据结构,一个顺序表在使用前必须指定起长度(这就很可能造成浪费内存空间),一旦分配内存,则在使用中不可以动态的更改。他的优点是访问数据是比较方便,可以随即的访问表中的任何一个数据。

  • 1,长度固定,必须在分配内存之前确定数组的长度。
  • 2,存储空间连续,即允许元素的随机访问。
  • 3,存储密度大,内存中存储的全部是数据元素。
  • 4,要访问特定元素,可以使用索引访问,时间复杂度为 O(1)O(1)。
  • 5,要想在顺序表中插入或删除一个元素,都涉及到之后所有元素的移动,因此时间复杂度为 O(n)O(n)。
其内存形象化

Alt text

创建顺序表代码:
#define MAX 100
typedef int DataType;
typedef struct Seqlist//用这样的方式来表示一个顺序表
{
DataType Data[MAX];
int sz;
}Seqlist;

它始终是一个数组,它也可以创建成动态增长模式

链表

链表是通过指针来描述元素关系的一种数据结构,他可以是物理地址不连续的物理空间。不能随即访问链表元素,必须从表头开始,一步一步搜索元素。它的优点是:对于数组,可以动态的改变数据的长度,分配物理空间。 
在使用中:如果一个数组在使用中,查询比较多,而插入,删除数据比较少,数组的长度不变时,选顺序表比较合理。如果插入,删除,长度不定的数组,可以选链表。

  • 1,长度不固定,可以任意增删。
  • 2,存储空间不连续,数据元素之间使用指针相连,每个数据元素只能访问周围的一个元素(根据单链表还是双链表有所不同)。
  • 3,存储密度小,因为每个数据元素,都需要额外存储一个指向下一元素的指针(双链表则需要两个指针)。
  • 4,要访问特定元素,只能从链表头开始,遍历到该元素,时间复杂度为 O(n)O(n)。
  • 5,在特定的数据元素之后插入或删除元素,不涉及到其他元素的移动,因此时间复杂度为 O(1)O(1)。双链表还允许在特定的数据元素之前插入或删除元素。
其内存形象化

Alt text 
其实它可以更乱一点,并不是像这样有序的存储在内存中,应该是利用内存碎片的一种存储方式,这样更加充分的利用了内存

其创建代码:
typedef struct ListNode//创建一个结构体来表示所存储的数据
{
DataType data;
struct ListNode* next;
}ListNode;

ListNode* BuyNode(DataType x)//用这样的函数来创建一个节点
{
ListNode* node = (ListNode*)malloc(sizeof(ListNode));
node->data = x;
node->next = NULL;
return node;
}

总结

顺序表和链表各有优势,例如:当需要一块不大的内存空间时,顺序表比链表容易操作。但当需要一块不确定大小的内存时,相比之下链表确实更易实现且满足要求,虽然顺序表也可以动态开辟,但你不能保证动态开辟的这块空间没有浪费。链表只能遍历访问,而顺序表可以通过下标的形式访问。所以当选择时根据实际情况选择最合适的方式,没有谁比谁好这一说,都是视情况而定的。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值