线性表基本概念与实现

线性表基本概念与实现

1.线性表的定义:线性表是具有相同特性数据元素的一个有限序列

2.线性表的逻辑特性:只有一个表头元素,只有一个表尾元素,表头元素没有前驱,表尾元素没有后继,除表头和表尾元素之外,其他元素只有一个直接前驱,也只有一个直接后继。

3.线性表的存储结构:顺序存储结构(顺序表)、链式存储结构(链表)

(1)顺序表

定义:把线性表中的所有元素按照其逻辑顺序,依次存储到从指定的存储位置开始的一块连续的存储中间内。

特性:随机访问特性、占用连续的存储空间、作插入操作需要移动多个元素

注:随机访问特性即可以随意访问任意的元素。存储分配只能预先进行,一旦分配好了1,在对其操作的过程中始终不变。

(2)链表

定义:每个结点不仅包含所存元素的信息,还包含元素之间逻辑关系的信息。

特性:不支持随机访问,结点的存储空间利用率较顺序表稍微低一些、链表支持存储空间的动态分配、链表插入无需移动元素

 

4. 链表的形式:单链表、双链表、循环单链表、循环双链表、静态链表

(1)单链表

在每个结点中除了包含数据域外,还包含一个指针域,用以指向其后继结点。

判空方式:带头结点的单链表:head->next == NULL

 不带头结点的单链表:head == NULL

(2)双链表

双链表就是在单链表结点上增添一个指针域,指向当前结点的前驱。(这样就可以方便的由其后继来找到前驱,从而实现输出终端结点到开始结点的数据序列)

判空方式:带头结点的双链表:head->next ==NULL

 不带头结点的双链表:head==NULL

(3)循环单链表

将单链表的最后一个指针域(空指针)指向链表的第一个结点

判空方式:带头结点的循环单链表:head == head-next

 不带头结点的循环单链表: head ==NULL

 

(4)循环双链表

将中端结点的next指针指向链表中的第一个结点,将链表中的第一个结点的prior指针指向终端结点

判空方式:不带头结点的循环双链表: head == NULL

 带头结点的循环双链表:head->next == head

或者: head->prior == head

或者: head->next == head && head ->prior == head

或者: head->next == head || head -> prior == head

 

(5)静态链表

静态链表借助一维数组来实现

 

 

注:带头结点,头指针head指向头结点,头结点的值域不含任何信息(仅存储一些描述链表属性的信息,如表长)。不带头结点的单链表中的头指针head指向开始结点。

 

顺序表和链表比较:

(1)基于空间的比较

1)存储分配方式:

顺序表的存储空间是一次性分配的,链表的存储空间是多次分配的。

2)存储密度

顺序表的存储密度=1;链表的存储密度<1(因为结点有指针域)

(2)基于时间的比较

1)存取方式

顺序表可以随机存取,也可以顺序存取(一般只答顺序存取)

链表只能顺序存取

2)插入/删除时移动元素的个数:

顺序表平均移动一半的元素;链表不需要移动元素,只需要修改指针。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值