线性表的链式存储结构——(2)

线性表的存储结构有两种:顺序存储和链式存储

顺序存储:读取数据的时间复杂度为O(1),其实就是数组,但是插入,删除的复杂度略大

链式存储:•用一组任意的存储单元存储线性表的数据元素,这组存储单元可以存在内存中未被占用的任意位置。

数据域:存储数据元素信息的域

指针域:把存储直接后继位置的域

指针或链:指针域中存储的信息

结点(Node):数据域和指针域组成数据元素称为存储映像

单链表:链表的每个结点中只包含一个指针域

•头指针

–头指针是指链表指向第一个结点的指针,若链表有头结点,则是指向头结点的指针。

–头指针具有标识作用,所以常用头指针冠以链表的名字(指针变量的名字)。

无论链表是否为空,头指针均不为空

头指针是链表的必要元素

•头结点

–头结点是为了操作的统一和方便而设立的,放在第一个元素的结点之前,其数据域一般无意义(但也可以用来存放链表的长度)。

–有了头结点,对在第一元素结点前插入结点和删除第一结点起操作与其它结点的操作就统一了。

–头结点不一定是链表的必须要素。

(单链表图例)

(空链表图例,头结点可以没有)

C语言中可以用结构指针来描述单链表:

typedef struct Node
{
    ElemType data;      // 数据域
    struct Node* Next;  // 指针域
} Node;
typedef struct Node* LinkList;

GetElem( LinkList L, int i, ElemType *e ):读取链表中的元素

Status GetElem( LinkList L, int i, ElemType *e )
{
    LinkList p;
    int j = 1;
    p = L -> next;
    if ( !p || i < 1 )
    {
        return Error
    }
    while( p && j < i)
    {
        p = p -> next;
        ++j;
    }
    if ( !p )
    {
        return Error
    }
    *e = p->data
    return *e
}

插入和删除的图示:

InsertElem( LinkList L, int i, ElemType *e )

Status InsertElem( LinkList L, int i, ElemType *e )
{
    LinkList p,s
    int j = 1
    p = L -> next
    if ( !p || i < 1 )
    {
        return Error
    }
    while( p && j < i)
    {
        p = p -> next;
        ++j;
    }
    if ( !p )
    {
        return Error
    }
    s = (LinkList)malloc(sizeof(Node));
    s -> data = e
    s -> next = p -> next;
    p -> next = s;
    return OK
}

DeleteElem( LinkList L, int i, ElemType *e)

Status DeleteElem( LinkList L, int i, ElemType *e)
{
    LinkList p;
    int j = 1;
    p = L -> next ;
    if ( !p || i < 1 )
    {
        return Error
    }
    while( p && j < i)
    {
        p = p -> next;
        ++j;
    }
    if ( !p )
    {
        return Error
    }
    q = p -> next
    p -> next = q -> next
    e = p -> data
    free(q)
    return OK
}

总结:对于插入或删除数据,若数据都是一个的话,顺序存储和单链表复杂度都是,O(n)。顺序存储需要移动n-i个位置,单链表需要查找第i个数据的地址。

但是如果,需要插入和删除j个数据时,顺序存储复杂度是每次都是O(n),但单链表就只有第一次是O(n),以后都是O(1)(当然前提是连续的插入,如果断断续续的插入,优势就不明显啦。。。对于大量数据的处理,考虑到日后代码的维护,数据的存储肯定是用单链表啦。。)

时间: 2024-08-24 17:34:16

线性表的链式存储结构——(2)的相关文章

线性表的链式存储结构

1 n个结点链结成一个链表,即为线性表的链式存储结构,由于每一个结点只包含一个指针域,因此称为单链表. 链表中第一个结点的存储位置成为头指针,那么整个链表的存取就必须是从头指针开始了. 有时候会在单链表的第一个结点前附设一个结点,称为头结点. 头指针与头结点的区别: 头指针: (1)头指针是指链表指向第一个结点的指针,若链表有头结点,则是指向头结点的指针. (2)头指针具有标识作用,所以常用头指针冠以链表的名字. (3)无论链表是否为空,头指针都不为空.头指针是链表的必要元素. 头结点: (1)

数据结构之线性表(链式存储结构)

线性表的实现分顺序存储结构和链式存储结构 上一节我们主要介绍了顺序存储结构,在最后我们还分别总结了顺序存储结构的优缺点, 对于顺序结构的缺点,我们有没有什么好的解决方法呢? 我们今天要介绍的线性表的链式存储结构就可以很好的解决顺序结构的缺点,一起来看. 顺序结构最大的缺点就是在进行插入和删除操作的时候,如果插入位置不理想,那么我们需要移动大量的元素,那产生这一问题的原因是什么呢? 仔细分析后,我们可以发现在顺序存储结构中,他们相邻的元素的存储位置也是相邻的,我们在申请内存的的时候,是一次性申请一

【数据结构】-线性表的链式存储结构

引言:由于线性表的顺序存储结构在插入和删除时需要大量移动数据元素,从而引入线性表的链式存储结构. 线性表的链式存储结构:用一组任意的存储单元(可以连续也可以不连续)存储线性表的数据元素. 为了表示数据元素ai和其直接后继ai+1之间的逻辑关系,对ai来说,除了存储其本身的数据信息外,还需要存储其直接后继的存储位置.这两部分信息组成数据元素ai的存储映像(结点).它包含两个域:其中存储数据元素信息的域称为数据域:存储直接后继存储位置的域称为指针域. n个结点链接成一个链表,称为线性链表,由于此链表

数据结构开发(5):线性表的链式存储结构

0.目录 1.线性表的链式存储结构 2.单链表的具体实现 3.顺序表和单链表的对比分析 4.小结 1.线性表的链式存储结构 顺序存储结构线性表的最大问题是: 插入和删除需要移动大量的元素!如何解决? 链式存储的定义: 为了表示每个数据元素与其直接后继元素之间的逻辑关系:数据元素除了存储本身的信息外,还需要存储其直接后继的信息. 链式存储逻辑结构: 基于链式存储结构的线性表中,每个结点都包含数据域和指针域 数据域:存储数据元素本身 指针域:存储相邻结点的地址 专业术语的统一: 顺序表 基于顺序存储

数据结构--线性表的链式存储结构

一 线性表的链式存储结构 A.链式存储的定义为了表示每个数据元素与直接后继元素之间的逻辑关系:数据元素除了存储本身的信息外,还需要存储其直接后继的信息图示B链式存储逻辑结构基于链式存储结构的线性表中,每个结点都包含数据域和指针域1.数据域:存储数据元素本身2.指针域:存储相邻结点的地址图示C链表中的基本概念1.头结点--链表中的辅助结点,包含指向第一个数据元素的指针(方便插入和删除)2.数据结点--链表中代表数据元素的结点,表现形式为:(数据元素,地址)3.尾节点--链表中的最后一个数据结点,包

03.线性表(二)链式存储结构.单链表1

链式存储结构.单链表1 1.基本概念 为了表示每个数据元素ai与其直接后继数据元素ai+1之间的逻辑关系,对数据元素ai来说,除了存储其本身的信息之外,还需存储一个指示其直接后继的信息(即直接后继的存储位置) (1)数据域:存储线性表数据元素数据信息的域称为数据域: (2)指针域:把存储直接后继位置(下一个数据元素的地址)的域称为指针域,指针域中存储的信息为指针或链: (3)结点(Node):由数据域和指针域两部分信息组成数据元素ai的存储映像,称为结点. (4)头指针:把链表中第一个结点的存储

04.线性表(三)链式存储结构.单链表2

链式存储结构.单链表2 顺序存储结构的创建实质是一个数组的初始化,存储空间连续且其大小和类型已经固定:单链表存储空间不连续,是一种动态结构且它所占用空间的大小和位置是不需要预先分配划定的,可以根据系统的情况和实际的需求即时生成. 一.单链表的整表创建 创建单链表的过程就是一个动态生成链表的过程,即从"空表"的初始化起,依次建立各元素结点,并逐个插入链表. 1.算法思路 (1)声明一个结点p和计数器变量i; (2)初始化一空链表L (3)让链表L的头结点的指针指向NULL,即建立一个带头

05.线性表(四)链式存储结构.静态链表

链式存储结构.静态链表   一.静态链表 1.静态链表存储结构 单链表是通过指针实现的,但是我们也可以通过数组来代替指针描述单链表,即静态链表.如何实现静态链表?构造数组的元素由两个数据域组成:data和cur,即数组的每个下标都对应一个data和一个cur. 数据域data:用来存放数据元素,即要处理的数据: 游标cur:存放该元素的后继在数组中的下标,相当于单链表中的next指针: 为了方便插入数据,我们通常会把数组建立得大一些,以便有一些空闲空间而不致于出现溢出情况. 线性表的静态链表存储

第21课 线性表的链式存储结构

1. 链式存储的特点 (1)为了表示每个数据元素与其直接后继元素之间的逻辑关系: (2)数据元素除了存储本身的信息外,还需要存储其直接后继的信息. (3)避免了顺序存储结构线性表在插入和删除元素时需要移动大量元素的问题. 2. 链式存储逻辑结构 (1)数据域:存储数据元素本身 (2)指针域:存储相邻结点地址 3. 链表中的基本概念 (1)头结点:链表中的辅助结点,包含指向第一个数据元素的指针 (2)数据结点:链表中代表数据元素的结点,表现形式为:(数据元素,地址) (3)尾结点:链表中的最后一个

七、线性表的链式存储结构

1.问题引入 开发数组类模板的原因在于:在创建基于顺序存储结构的线性表时,发现这样的线性表可能被误用,因为重载了数组访问操作符,使用时跟数组类似,但是线性表和数组有很大的区别,所以激发了新的需求:开发数组类替换C++原生数组类,因为原生数组类也存在着很大缺陷,使用不方便. 基于顺序存储结构的线性表的另一个缺点:插入或删除元素时,涉及到大量数据元素的移动,对于效率的影响非常大 一个新的需求:在插入或删除元素时不需要大量移动数据元素的一种数据结构,即基于链式存储结构的线性表 2.链式结构的定义 为了