数据结构复习(1):顺序表与链表

  • 线性表:线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结
    构,常见的线性表:顺序表、链表、栈、队列、字符串…
    线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储
    时,通常以数组和链式结构的形式存储。
  • 顺序表:顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组
    上完成数据的增删查改。
  1. 静态顺序表:使用定长数组存储。
  2. 动态顺序表:使用动态开辟的数组存储。
// 顺序表的静态存储
#define N 100
typedef int SLDataType;
typedef struct SeqList
{
SLDataType array[N]; // 定长数组
size_t size; // 有效数据的个数
}SeqList;


// 顺序表的动态存储
typedef struct SeqList
{
SLDataType* array; // 指向动态开辟的数组
size_t size ; // 有效数据个数
size_t capicity ; // 容量空间的大小
}SeqList;
  • 链表:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。
    以下链表特征组合起来就有8种链表结构:
    1.单向、双向
    2.带头、不带头
    3.循环、非循环

实际中最常用的两种结构:
a. 无头单向非循环链表:结构简单,一般不会单独用来存数据。实际中更多是作为其他数据结构的子结
构,如哈希桶、图的邻接表等等。

//1、无头单向非循环链表
typedef int SLTDataType;
typedef struct SListNode
{
SLTDataType _data;
struct SListNode* _next; 
}SListNode;
typedef struct SList
{
SListNode* _head;
 }SList;

b.带头双向循环链表:结构最复杂,一般用在单独存储数据。实际中使用的链表数据结构,都是带头双向
循环链表。另外这个结构虽然结构复杂,但是使用代码实现以后会发现结构会带来很多优势,实现反而
简单了。

// 2、带头双向循环链表
typedef int LTDataType;
typedef struct ListNode
{
LTDataType _data;
struct ListNode* _next;
struct ListNode* _prev;
 }ListNode;
typedef struct List
{
ListNode* _head; 
}List;
  • 顺序表和链表的区别和联系

  • 顺序表:一白遮百丑
    白:空间连续、支持随机访问
    丑:1.中间或前面部分的插入删除时间复杂度O(N) 2.增容的代价比较大。

  • 链表:一(胖黑)毁所有
    胖黑:以节点为单位存储,不支持随机访问
    所有:1.任意位置插入删除时间复杂度为O(1) 2.没有增容问题,插入一个开辟一个空间。

文章内容为网络引用,如有侵权请联系删除。

发布了25 篇原创文章 · 获赞 4 · 访问量 2550

猜你喜欢

转载自blog.csdn.net/qq_43167575/article/details/100124762