数据结构线性表

线性表介绍

1、线性结构

在数据元素存在非空有限集中:

  • 存在唯一的一个被称为“第一个”的数据元素

  • 存在唯一的一个被称为“最后一个”的数据元素

  • 除了第一个外,集合中每个数据元素都只有一个前趋元素

  • 除了最后一个外,集合中每个数据元素都只有一个后继元素

2、线性表

线性表是一个有n个数据元素的有限序列,同一个线性表中的元素必定有相同特性,元素之间存在序偶关系

线性表中的元素个数n(n>=0)定义为该表的长度,当n==0时称为空表,非空表中每个数据元素都有一个确定的位置(下标)

线性表是一个相当灵活的数据结构,它的长度可以根据需要增长或缩短

二、线性表的顺序的表示和存储:

线性表的存储使用一组连续内存来依次存储线性表中的数据元素。

注意:1、要时刻保持元素之间的连续性、2、千万不要越界

优点:1、支持随机访问 2、查找、修改、排序效率比较高 3、大块的连续内存不容易产生内存碎片

缺点:1、对元素插入、删除时效率很低 2、大块内存对内存要求较高

三、线性表的链式表示和存储:

链式存储结构不要求内存位置物理上是连续的,因此元素可以存储在内存的任何位置(可以是连续的,也可以不连续)

元素a[i]和a[i+1]之间的逻辑关系不是依靠相互位置,而是在元素中增加一个一个指向其后继元素的数据项(元素指针),从而表示相互之间的逻辑关系,元素本身的数据+后继元素的地址 组成了存储映像,俗称 节点(node)

typedef struct Node
{
    TYPE data;          //  数据域  
    struct Node* next;  //  指针域
}Node;

若干个节点通过指针域依次连接起来,形成的线性表结构称为链式表,简称链表,如果指针域中只有一个指向下一个节点的指针,这种链表称为单向链表。

单向链表

单向链表中必须有一个指向第一个节点的指针,该指针称为头指针,被它指向的节点称为头节点

头节点可以存储、也可以不存储有效数据,如果不存储有效数据的话,那么头节点只是单纯地作为一个占位节点存在

最后一个节点称为尾节点,尾节点的next指向空(NULL),作为结束标志

1、不带头节点的单向链表

定义:第一个节点中的数据域存储有效数据。

注意:当需要对单链表的头指针发生修改时,例如头添加、头删除、插入等操作,参数需要传递头指针的地址(二级指针),处理相对麻烦

注意:当进行删除时,需要获取到待删除节点的前趋节点,但是如果删除的位置刚好是第一个节点,它没有前趋节点,所以需要额外判断处理

2、带头节点的单向链表

定义:第一个节点中的数据域不存储有效数据,该头节点只是用于指向第一个有效数据的节点而存在。

所以,由于头节点不会因为添加、插入、删除该改变,所以不需要传递二级指针

typedef struct List
{
    ListNode* head;     //  永远指向头节点 必须要有
    ListNode* tail;     //  尾指针,可以有 也可以没有
    size_t size;        //  数量 可以有 也可以没有
}List;

注意:尾指针tail,能直接找到最后一个节点,但是在尾删除操作时,发挥不了作用,因为要找尾节点的前趋。

  • 15
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值