数据结构与算法之----线性表

01线性表

1.线性表的判断方式就是元素有且只有一个直接前驱和直接后继,元素可以为空,此时叫做空表

2.抽象数据类型标准格式

  ADT 抽象数据类型名

    DATA

    数据元素之间逻辑关系的定义

    Operation

    操作

  endADT

3.操作伪代码

Operation

InitList(*L): 初始化操作,建立一个空的线性表L

ListEmpty(L): 判断线性表是否为空表,如果为空返回true,否则返回false

ClearList(*L): 将线性表清空(实际情况不是删除元素,而是将内存中的元素全部设置成0)

GetElem(L,i,*e): 将线性表L中的第i个位置元素值返回给e

LocateElem(L,e): 在线性表L中查找与给定值e相等的元素,如果查找成功,返回该元素在表中的序号表示成功,失败返回0

ListInsert(*L,i,e): 在线性表L中第i个位置插入新元素e

ListDelete(*L,i,*e): 删除线性表L中第i个位置元素,并用e返回其值

ListLength(L): 返回线性表L的元素个数

endADT

4.实际问题

提问:实现两个线性表A,B的并集操作

思路:循环遍历集合B中的每个元素,判断当前元素是否存在于A中,如果不存在插入到A中即可

  1.写一个for循环,根据循环条件我需要知道循环的范围,即就是B集合的长度

  for (int i = 0; i <= ListLength(B); i++)

  2.拿到的每一个B集合中的元素,判断在A集合中是否存在(前提是A集合或者B集合不是空表)

  int j = LocateElem(A,i);

  if (j == 0) NSLog(@“A集合中并没有该元素”);

  else NSLog(@“A集合中存在该元素”);

  3.将已经确定不存在的元素插入到A集合中

  int La = ListLength(A);

  ListInsert(*A,La-1,j);

  for (int i = 0; i <= ListLength(B); i++) {

    int j = LocateElem(A,i);

    if (j == 0) {

    NSLog(@“A集合中并没有该元素”);

    int La = ListLength(A);

    ListInsert(*A,La-1,j);

  }

  else {

  NSLog(@“A集合中存在该元素”);

  }

 官方答案:

  La_len = ListLength(La);

  Lb_len = ListLength(Lb);

  for (int i = 0 ; i <= Lb_len ; i++)

  {

    GetElem(Lb,i,*e); //将线性表Lb中的第i个位置元素值返回给e

    if ( !LocateElem (La,e) )

    {

      ListInsert (La,++La_len,e);

    }

  }

5.顺序存储结构

a1 a2 a3 a4 a5 …… aN:内存中提供一块儿地方把相同数据类型的元素依次写入

结构封装需要三个属性:存储空间起始位置;线性表最大存储容量;线性表当前长度

  a1 a2 a3

  我想在a1和a2之间插入b1

  1.L最大存储容量

  2.a3开始依次往后移动一个单位

  3.插入b1

6.实际问题

获得元素

1 < i < ListLength(L);

e = L.data[i-1];

插入操作

思路:如果插入位置不合理,抛出异常;如果线性表长度大于等于数组长度,则抛出异常或动态增加数组容量;从最后一个元素开始向前遍历到第i个位置,分别将它们都向后移动一个位置

7.线性表顺序存储结构优缺点

在存储,读取数据时,不管是哪个位置时间复杂度都是O(1).而在插入或者删除时,时间复杂度都是O(n).

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

可以快速存取表中任意位置的元素

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

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

容易造成存储空间的碎片(申请空间时是整块儿的)

8.链式存储结构

顺序存储结构中最大的缺点就是插入和删除元素时需要移动大量元素,耗费时间.导致这个问题的原因就是相邻两个元素的存储位置在内存中是紧挨着的,中间没有任何空隙,当然就无法快速插入和删除.所以引入链式存储结构概念

特点:用一组任意的存储单元存储线性表的数据元素,这组存储单元可以存在内存中未被占用的任意位置.相邻两个元素之间可以相差很多内存空间距离,彼此用指针联系

在链式存储结构中,除了要存储数据元素信息之外,还需要存储它的后继元素的存储地址(指针)

存储数据元素信息的域称为数据域

存储直接后继位置的域称为指针域

指针域中存储的信息称为指针或链

两部分信息组成数据元素称为存储映像,也称结点(Node)

单链表:链表中的每个结点中只包含一个指针域;第一个结点的存储位置叫做头指针,最后一个结点的指针为NULL

9.头结点和头指针的异同 //头结点和第一个元素的结点是完全不同的两个概念.  头指针存储的是第一个结点的地址

头指针:是指链表指向第一个结点的指针,若链表有头结点,则是指向头结点的指针;无论链表是否为空,头指针均不为空;头指针是链表的必要元素

头结点:为了操作的统一和方便设立的,放在第一个元素的结点之前,其数据一般没有意义(但是可以用来存放链表的长度);有了头结点,对在第一个元素结点前插入结点和删除第一结点起操作与其他结点的操作就统一了;头结点不一定是链表的必须要素;头结点中的数据域可以为空,但是指针域应该不会为空

理解:所谓头结点就是放在链表第一个元素前的一个结点,没有实际意义,可以存放链表的长度.如果链表中有头结点的话那么头指针指向的就是头结点,如果没有的话指向的就是第一个结点(即第一个元素).头结点可有可无,头指针必须存在.

10实际问题

假设p是指向线性表第i个元素的指针,则该结点ai的数据域我们可以用p->data表示,它的值是一个数据元素,结点ai的指针域我们可以用p->next表示,它的值是一个指针.那么p->next指向的是第i+1个元素,也就是说它是指向第ai+1的指针

提问:如果p->data = ai,那么p->next->data = ?

思路:题中说p->data代表ai元素的数据域,那么p->next代表的是ai元素的指针域,代表指向ai+1元素的指针,所以p->next->data代表的是ai+1元素的数据域,也就是数据元素,即ai+1.

时间: 2024-10-16 03:33:12

数据结构与算法之----线性表的相关文章

C++数据结构与算法_2_线性表 --顺序表的应用示例

h2.western { font-family: "Liberation Sans",sans-serif; font-size: 16pt; }h2.cjk { font-family: "微软雅黑"; font-size: 16pt; }h2.ctl { font-family: "AR PL UMing CN"; font-size: 16pt; }h1 { margin-bottom: 0.21cm; }h1.western { fon

C++数据结构与算法_1_线性表 --顺序表的实现与分析

顺序表的实现与分析 引 --线性表的抽象基类: template <typename T> class LinearList { public: LinearList(); ~LinearList(); virtual int Size() const = 0; //返回线性表所能够存储的最大长度 virtual int Length() const = 0; //当前线性表的长度 virtual int Search(T &x) const = 0; virtual int Loca

数据结构与算法之线性表

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

数据结构、算法、线性表总结

一.数据结构 1.概念 1.数据类型和抽象数据类型是不同的概念. 2.逻辑结构分为线性结构(一对一).树形结构(一对多).图形结构(多对多). 3.时间复杂度(T(n)=O(f(n)):空间复杂度(占用的内存空间). 4.算法 1.BF算法:时间复杂度最坏为O(n*m). 2.kmp算法:时间复杂度最坏为O(n+m). 二.线性表 1.概念 1.顺序表结点的存储地址计算公式:Loc(ai)=Loc(a1)+(i-1)*C. 2.操作主要是查找用顺序表,进行插入.删除操作的适合用链表. 3.存储密

数据结构、算法及线性表总结

思维导图 重要概念 数据:是能被输入进计算机中,并能被计算操作处理的对象的总称 数据元素:是数据结构中讨论的基本单位 数据类型:整型.浮点型.字符型等等变量所具有的不同的数据种类 存储结构:又称物理结构,是描述数据具体在内存中的存储结构,分为线性结构和非线性结构 逻辑结构:是描述数据之间的相互关系,分为线性结构(一对一).树形结构(一对多).图状结构/网状结构(多对多) 算法:时间复杂度表示算法执行时间与问题规模之间的关系,是对运算时间的一个大致估计:空间复杂度表示算法执行时占用的内存空间 线性

数据结构与算法-总结线性表顺序存储结构的优缺点

这一章节主要总结线性表顺序存储结构的优缺点. 在总结之前,我们来讨论一下线性表顺序存储结构的执行方法的时间复杂度: 存储.读取:O(1) 插入.删除:O(n) 优点: 1.无需为表中的逻辑关系增加额外的存储空间 2.可以快速存取表中对象 缺点: 1.插入和删除需要移动大量的对象 2.存储设备的碎片化 3.当线性表过大的时候,很难确定长度 版权声明:本文为博主原创文章,未经博主允许不得转载.

Java数据结构与算法(1):线性表

线性表是一种简单的数据类型,它是具有相同类型的n个数据元素组成的有限序列.形如如A0,A1,...,An-1.大小为0的表为空表,称Ai后继Ai-1,并称Ai-1前驱Ai. printList打印出表元素,makeEmpty置空表,find返回某一项首次出现的位置,insert和remove一般是从表的某个位置插入和删除某个元素:而findKth则返回某个位置上的元素,next和previous会取一个位置作为参数返回前驱元和后继元的值. 表的数组实现 对表的所有操作都可以通过数组实现.数组的存

java数据结构与算法之顺序表与链表深入分析

转载请注明出处(万分感谢!): http://blog.csdn.net/javazejian/article/details/52953190 出自[zejian的博客] 关联文章: java数据结构与算法之顺序表与链表设计与实现分析 java数据结构与算法之双链表设计与实现 ??数据结构与算法这门学科虽然在大学期间就已学习过了,但是到现在确实也忘了不少,因此最近又重新看了本书-<数据结构与算法分析>加上之前看的<java数据结构>也算是对数据结构的进一步深入学习了,于是也就打算

javascript实现数据结构: 稀疏矩阵之三元组线性表表示

稀疏矩阵(Sparse Matrix):对于稀疏矩阵,目前还没有一个确切的定义.设矩阵A是一个n*m的矩阵中有s个非零元素,设  δ=s/(n*m),称δ为稀疏因子, 如果某一矩阵的稀疏因子δ满足δ≦0.05时称为稀疏矩阵, 稀疏矩阵的压缩存储 对于稀疏矩阵,采用压缩存储方法时,只存储非0元素.必须存储非0元素的行下标值.列下标值.元素值.因此,一个三元组(i, j, aij)唯一确定稀疏矩阵的一个非零元素. 上图的稀疏矩阵A的三元组线性表为: ( (1,2,12), (1,3,9), (3,1