顺序表:使用一段连物理地址连续的存储单元依次存放数据元素的线性结构;主要表现形式为数组;
空间示意图:
顺序表可以划分为:
1、静态顺序表:使用固定的空间长度来存储数据元素;空间位于栈上;
代码实现:
#define N 1024
typedef struct SeqList {
int arr[N]; //申请固定大小空间
size_t size;
};
2、动态顺序表:使用动态开辟的空间进行元素存储;空间位于堆上;
代码实现:
typedef struct Seqlist {
int* arr; //指向动态开辟的空间
size_t size;
size_t capicity;
};
优点 : 空间连续、支持随机访问、查找操作的代价小;
缺点:
中间/头部的插入和删除操作,代价较大,时间复杂度为O(N);
空间的扩容有时需要拷贝数据,释放旧空间,消耗较大;
链表:一种逻辑顺序上连续但是物理结构非连续的存储结构,其中逻辑顺序的连续由指针实现;
空间示意图(以单向无头非循环链表为例):
链表结构实现起来多种多样,下面的情况组合起来可以产生8种链表的结构(自行组合):
单向、双向-------带头、不带头------循环、非循环;
单向链表的代码实现:
typedef int Type;
//节点结构体
typedef struct Node {
Type data;
struct Node* next;
}Node;
//链表结构体:存放节点元素
typedef struct Slist {
Node* _head;
}Slist;
双向链表的实现:
typedef struct node {
int val;
struct node* prev;
struct node* next;
}node;
typedef struct list{
struct node* head;
}list;
优点:插入删除操作时间复杂度为O(1),没有增容的问题空间比较灵活;
缺点:不支持随机访问,以节点为单位存储;