数据结构(一)--顺序表、链表

顺序表:使用一段连物理地址连续的存储单元依次存放数据元素的线性结构;主要表现形式为数组;

空间示意图:

数据结构(一)--顺序表、链表_第1张图片

顺序表可以划分为:

             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);

空间的扩容有时需要拷贝数据,释放旧空间,消耗较大;

链表:一种逻辑顺序上连续但是物理结构非连续的存储结构,其中逻辑顺序的连续由指针实现;

空间示意图(以单向无头非循环链表为例):

数据结构(一)--顺序表、链表_第2张图片

链表结构实现起来多种多样,下面的情况组合起来可以产生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),没有增容的问题空间比较灵活;

缺点:不支持随机访问,以节点为单位存储;

 

你可能感兴趣的:(数据结构(一)--顺序表、链表)