走进线性表,初步感受数据结构的魅力

---恢复内容开始---

告别了c++,来到了下学期的数据结构课堂,初步学习了第二章:线性表。

不看不知道,一看吓一跳,只是一个线性表,知识点还不少。

一、定义:零个或多个数据元素的有限序列。

  线性表元素的个数n(n>=0)定义为线性表的长度,当n=0时,称为空表。

  在较复杂的线性表中,一个数据元素可以由若干个数据项组成。

三、线性表的顺序存储结构

  1、顺序存储定义:线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素。

  2、顺序存储方式

  描述顺序存储结构需要三个属性:

    a、存储空间的起始位置:数组data,它的存储位置就是存储空间的存储位置。

    b、线性表的最大存储容量:数组长度MaxSize.

    c、线性表的当前长度:length。

  3、数据长度与线性表长度的区别

    a、数组长度:数组的长度是存放线性表的存储空间的长度存储分配后这个量是一般是不变的。

    b、线性表长度:线性表长度是线性表中数据元素的个数,随着线性表插入和删除操作的进行,这个量是变化的。

  在任意时刻,线性表的长度应该小于等于数组的长度。

  4、地址计算方法

  存储器中的每个存储单元都有自己的编号,这个编号称为地址。

  假设占用的是c个存储单元,那么线性表中第i+1个数据元素的存储位置和第i个数据元素的存储关系满足下列关系(LOC表示获得存储位置的函数)。

    ?

  所以对于第i个数据元素a1的存储位置可以由a1推算得出:

    ?

四、顺序存储结构的插入与删除

  1、获得元素操作:使用GetElem操作。

  2、插入操作

  插入算法的思路:

    a、如果插入位置不合理,抛出异常。

    b、如果线性表长度大于等于数组长度,则抛出异常或动态增加容量。

    c、从最后一个元素开始向前遍历到第i个元素,分别将他们都向后移动一个位置。

    d、将要插入的元素填入位置i处。

    e、表长加1.

  3、删除操作

  删除算法的思路:

    a、如果删除位置不合理,抛出异常。

    b、取出删除元素。

    c、从删除元素位置开始遍历到最后一个元素位置,分别将他们都向前移动一个位置。

    d、表长减1。

  4、线性表顺序存储结构的优缺点

    优点:

      a、无须为表示表中元素之间的逻辑关系而增加额外的存储空间。

      b、可以快速地存取表中任一位置的元素。

    缺点:

      a、插入和删除操作需要移动大量元素。

      b、当线性表长度变化较大时,难以确定存储空间的容量。

      c、造成存储空间的“碎片”。

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

  1、线性表链式存储结构定义

    为了表示每个数据元素a与其直接后继数据元素之间的逻辑关系,对数据元素a来说,除了存储其本身的信息之外,还需存储一个指示其后继的信息(即直接后继的存储位置)。我们把存储数据元素信息的域称为数据域,把存储直接后继位置的域称为指针域。指针域中存储的信息称作指针或链。这两部分信息组成数据元素a的存储映像,称为结点。

    n个结点(a的存储映像)链结成一个链表,即为线性表的链式存储结构,因为此链表的每个结点中只包含一个指针域,所以叫做单链表

把链表中的第一个结点的存储位置叫做头指针。规定,线性链表的最后一个结点指针为“

有时,为了方便对链表进行操作,会在单链表的第一个结点前附设一个结点,称为头结点。头结点的数据域可以不存储任何信息。

   2、头指针与头结点的异同

  头指针:

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

    b、头指针具有标识作用,所以常用头指针冠以链表的名字。

    c、无论链表是否为空,头指针均不为空。头指针是链表的必要元素。

  头结点:

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

    b、有了头结点,对在第一元素结点前插入结点和删除第一结点,其操作与其他结点的操作就同一了。

    c、头结点不一定是链表必须元素。

  3、单链表的读取

    获得链表第i个数据的算法思路:

    a、声明一个结点p指向链表第一个结点,初始化j从1开始。

    b、当j<i时,就遍历链表,让p的指针向后移动,不断指向下一结点,j累加1。

    c、若到链表末尾P为空,则说明第i个元素不存在。

    d、否则查找成功,返回结点P的数据。

  4、单链表的插入与删除

    单链表第i个数据插入结点的算法思路:

      a、声明一结点P指向链表第一个结点,初始化j从1开始。

      b、当j<i时,就遍历链表,让p的指针向后移动,不断指向下一结点,j累计1.

      c、若到链表末尾p为空,则说明第i个元素不存在。

      d、否则查找成功,在系统中生成一个空结点s。

      e、将数据元素e赋值给s->data。

      f、单链表的拆标准语句s->next=p->;p->next=s。

      g、返回成功。

    单链表第i个数据删除结点的算法思路:

      a、声明一结点p指向链表第一个结点,初始化j从1开始。

      b、当j<i时,就遍历链表,让p的指针向后移动,不断指向下一个结点,j累加1。

      c、若到链表末尾p为空,则说明第i个元素不存在。

      d、否则查找成功,将欲删除的结点p->next赋值给q。

      e、单链表的删除标准语句p->next=q->next。

      f、将q结点中的数据赋值给e,作为返回。

      g、释放q结点。

      h、返回成功。

    对于插入和删除数据越频繁的操作,单链表的效率优势就越明显。

六、单链表的整表创建

  单链表整表创建的算法思路:

    a、声明一结点p和计数器变量i。

    b、初始化一空链表L。

    c、让L的头结点的指针指向NULL,即建立一个带头结点的单链表。

    d、循环:

      *生成一新结点赋值给p。

      *随机生成一数字赋值给p的数据域p->data。

      *将p插入到头结点与前一结点之间。

七、单链表的整表删除

  单链表整表删除的算法思路如下:

    a、声明一结点p和q。

    b、将第一个结点赋值给p。

    c、循环:

      * 将下一结点赋值给q。

      *释放p。

      *将q赋值给p。

八、单链表结构与顺序存储结构优缺点

  1、单链表结构和顺序存储结构对比:

    a、存储分配方式:

    顺序存储结构用一段连续的存储单元依次存储线性表的数据元素。

    单链表采用链式存储结构,用一组任意的存储结构单元存放线性表的元素。

    b、时间性能:

    查找:顺序存储结构O(1),单链表O(n)。

    插入和删除:顺序存储结构需要平均移动表长一半的元素,时间为O(n)。单链表在线出某位置的指针后,插入和删除时间仅为O(1)。

    c、空间性能:顺序存储结构需要预分配存储空间,分大了,浪费,分小了易发生上溢。单链表不需要分配存储空间,只要有就可以分配,元素个数也不受限制。

  2、结论

    若线性表需要频繁查找,很少进行插入和删除操作时,宜采用顺序存储结构。若需要频繁插入和删除时,宜采用单链表结构。

    当线性表中的元素个数变化较大或者根本不知道有多大时,最好用单链表结构,这样可以不需要考虑存储空间的大小问题,如果知道大致长度,宜采用顺序存储结构。

九、循环链表

  将单链表中终端结点的指针端由空指针改为指向头结点,就使整个单链表形成一个环,这种头尾相接的单链表称为单循环链表,简称循环链表。

十、双向链表

  双向链表是在单链表的每个结点中,再设置一个指向其前驱结点的指针域。

问题也是很多,忘记正确的定义,再到后来的节点问题(不知道各个节点应该如何做插入,删除操作)等等,也从中学到了很多;

问题永远不会减少,但我会一个一个解决,数据结构,我一定会拿下!

看看一个源代码吧(链表的):

原文地址:https://www.cnblogs.com/lizixiang123/p/10549357.html

时间: 2024-10-12 17:17:19

走进线性表,初步感受数据结构的魅力的相关文章

第2章 线性表《C#数据结构和算法》

( 1)除第一个位置的数据 元素外,其它数据元素位置的前面都只有一个数据元素:( 2)除最后一个位置的 数据元素外,其它数据元素位置的后面都只有一个元素.也就是说,数据元素是 一个接一个的排列.因此,可以把线性表想象为一种数据元素序列的数据结构. 2.1.1 线性表的定义 线性表(List) 线性表的接口如下所示. public interface IListDS<T> { int GetLength(); //求长度 void Clear(); //清空操作 bool IsEmpty();

数据结构与算法 1 :基本概念,线性表顺序结构,线性表链式结构,单向循环链表

[本文谢绝转载] <大纲> 数据结构: 起源: 基本概念 数据结构指数据对象中数据元素之间的关系  逻辑结构 物理结构 数据的运算 算法概念: 概念 算法和数据结构区别 算法特性 算法效率的度量 大O表示法 时间复杂度案例 空间复杂度 时间换空间案例 1)线性表: 线性表初步认识: 线性表顺序结构案例 线性表顺序结构案例,单文件版 线性表的优缺点 企业级线性表链式存储案例:C语言实现 企业级线性表链式存储案例:C语言实现 单文件版 企业级线性表链式存储案例,我的练习  线性表链式存储优点缺点

python web为什么要学数据结构与算法面试官为什么总问那几个算法和线性表二叉树

算法是什么? 举个简单的例子 当年刘景生病危刘琦被卷入继位之事 无奈求助于诸葛亮 以上古兵书为由 邀孔明阁楼相谈.... 诸葛亮曾说 那部阵书开篇就是阵法源自于心法 所以古代军师进步也是看兵法 算法也是同理 虽然我们作为web后端开发人员 但是每天所见所闻日子久也就适应了. 但是想要再进一步 两种方法 一 多看高质量代码 二 看算法 我们作为web开发可能算法运用的不是很多 每天也就是写接口调接口和产品经理撕 但是算法最重要的地方是会帮你扩充你的逻辑思维 可能刚看算法的人认为太难了我真学不来 举

第5课 - 线性表的本质

第5课 - 线性表的本质 数据结构是为了解决生活中的实际问题而存在的,那生活中与线性表相对应的例子有什么呢? 幼儿园中就有一个例子,在老师安排小朋友活动时,会将小朋友组织成下面的站队形式,这个就是线性表. 1. 线性表的定义 (1)线性表是0个或多个数据元素的集合 (2)线性表中的数据元素之间是有顺序的,这一点非常重要 (3)线性表中的数据元素的个数是有限的,这和实际生活相符(在数学中,线性表的个数可以是无穷的) (4)线性表中的数据元素的类型必须相同 2. 线性表的性质 (1)a0 为线性表的

数据结构例程——线性表的应用:表的自然连接

本文针对数据结构基础系列网络课程(2):线性表中第14课时线性表的应用. 问题:有表A,m1行.n1列,表B,m2行.n2列,求A和B的自然连接结果C 例: 解答: #include <stdio.h> #include <malloc.h> #define MaxCol 10 //最大列数 typedef int ElemType; typedef struct Node1 //定义数据结点类型 { ElemType data[MaxCol]; struct Node1 *nex

数据结构-线性表_顺序表

进入大学一年了,今日终于有勇气写写随笔并展示出来了. 如有不足之处,请大家指正. 今日我想写的就是我对数据结构-线性表_顺序表的理解. 不BB了,进入正题!!!!! 数据结构中的逻辑结构分为线性结构和非线性结构,而线性表就属于线性结构. 线性结构是 n 个数据元素的有序(次序)集合,它有下列几个特征: 集合中必存在唯一的一个 "第一个元素": 集合中必存在唯一的一个 "最后的元素": 除最后元素之外,其它数据元素均有唯一的 "后继": 除第一元素

数据结构 笔记2 线性表

线性表是最简单,最常用的一种数据结构,它是由n个数据元素(结点)组成的有限序列. 线性表的基本运算 1.置空表 InitList(L) ,构造一个空的线性表L 2.求表长 ListLength(L) ,返回线性表L中元素个数,即表长. 3.取表中第i个元素GetNode(L,i) ,若1 <= i <= ListLength(L) ,则返回第i个元素a[i] 4.按值查找LocateNode(L,x),在表L中查找第一个值为x的元素,并返回该元素在表L中的位置,若表中没有元素的值为x,则返回0

数据结构与算法之线性表

前言 上一篇<数据结构和算法之时间复杂度和空间复杂度>中介绍了时间复杂度的概念和常见的时间复杂度,并分别举例子进行了一一说明.这一篇主要介绍线性表. 线性表属于数据结构中逻辑结构中的线性结构.回忆一下,数据结构分为物理结构和逻辑结构,逻辑结构分为线性结构.几何结构.树形结构和图形结构四大结构.其中,线性表就属于线性结构.剩余的三大逻辑结构今后会一一介绍. 线性表 基本概念 线性表(List):由零个或多个数据元素组成的有限序列. 注意: 1.线性表是一个序列. 2.0个元素构成的线性表是空表.

数据结构中线性表的基本操作-合并两个线性表-依照元素升序排列

#include<iostream> #include<stdlib.h> #define LIST_INIT_SIZE 10/*线性表初始长度*/ #define LIST_CREATENT 2/*每次的增量*/ typedef int ElemType; using namespace std; typedef struct SqList/*线性表的数据结构定义*/ { ElemType *elem;/*线性表基址*/ int length;/*当前线性表所含的元素个数*/ i