[ 数据结构与算法] 线性表

线性表

1.1线性表的定义和特点

线性表是具有相同特性数据元素的一个有限序列

  • 序列的第一个结点叫做起始结点(线性起点)、最后一个结点叫做终端节点(线性重点)

  • 每个元素都至少有一个直接前趋直接后继

  • 当n= 0 时,该线性表叫做空表

  • 结点是从a1到an(下角标从1开始)

1.2 案例引入

一元多项式的计算:实现两个多项式加、减、乘运算

在这里插入图片描述

在这里插入图片描述

面对稀疏多项式,我们将指数和系数绑定在一个数组当中组成一个数据元素

在这里插入图片描述

稀疏多项式的加法的实现思路
在这里插入图片描述

  • 顺序储存结构存在问题
    • 储存空间分配不灵活
    • 运算的空间复杂度高
  • 因此,我们可以使用链式存储结构

图书管理系统

在这里插入图片描述

可以分析出也是用数组来作为数据元素存储信息,可以用顺序表,也可以用链表

在这里插入图片描述

总结

  • 线性表中的数据元素的类型可以是简单类型,也可以是复杂类型
  • 许多实际问题所设计的基本操作有很大的相似性
  • 从具体的应用中抽象出共性的逻辑结构和基本操作(抽象数据类型),然后实现其储存结构和基本操作

1.3 线性表的类型定义

  • 抽象数据类型线性表定义如下:

在这里插入图片描述

基本操作介绍

  • InitList(& L)

    • 操作结果:构造一个空的线性表
  • DestroyList(& L)

    • 初始条件:线性表L已经存在
    • 操作结果:销毁一个线性表
  • ClearList(& L)

    • 初始条件:线性表L已经存在
    • 操作结果:将该线性表置为空表
  • ListEmpty(L)

    • 初始条件:线性表L已经存在
    • 操作结果:若是空表,则返回TRUE,否则返回FALSE
  • ListLength(L)

    • 初始条件:线性表L已经存在
    • 操作结果:返回L的数据元素的个数
  • GetElem(L,i,&e)

    • 初始条件:线性表L已经存在,1<=i<=ListLength(L)
    • 操作结果:用e返回线性表L中第i个数据元素的值
  • LoacateElem(L,e,compare())

    • 初始条件:线性表L已经存在,compares()是数据元素的判定元素
    • 操作结果: 返回L中第1个与e满足compare()的数据元素的位序.若这样的数据元素不存在则返回值为0
  • ListInsert(&L,i,e)

    • 初始条件:线性表L已经存在,1<=i<=ListLength(L)
    • 操作结果:在L的第i个位置前插入一个新的数据元素e,并且使L的长度加一
  • ListDelete(&l.i,&e)

    • 初始条件:线性表L已经存在,1<=i<=ListLength(L)
    • 操作结果:删除数组第i个数据元素,并用e返回其值,L的长度减一
  • ListTraverse(&L,visited())

    • 初始条件:线性表L已经存在
    • 对L的每一个元素调用visited()
  • 以上提及的运算时逻辑结构上定义的运算,我们先不考虑如果做,带我们确定了存储结构之后再考虑

    • 2.4 顺序表实现
    • 2.5 链表实现

1.4 顺序表的表示和实现

顺序储存结构的定义

  • 把逻辑上相邻的数据元素储存在物理上相邻的储存单元中(地址连续)的存储结构
  • 顺序表长度可变

好处:

  1. 知道了某个元素的地址值,那么很容易就能够找出剩余元素的位置
  2. 任一元素均可随机存取

TIPS:

  • 表的第一个元素的地址叫做基地址
  • 我们可以用一维数组来表示线性表(但是c语言中的一维数组数组长度不可动态定义)
    • 解决方法:我们用一个变量表示顺序表的长度属性
  • 逻辑位序和物理位序相差1
  • 动态数组和静态数组的实现方式都是可以的

定义模板

#define LIST_INIT_SIZE 100

typedef struct{
   
    
    ElemType *elem[LIST_INIT_SIZE];//数据元素的基地址,加*号就是数组的动态分配,不加就是静态分配
    
    int length;//当前长度
    
}SqList

多项式线性表的定义:

在这里插入图片描述

c语言的相关补充

  • ElemType只是一个抽象概念,什么数据类型都可以 ,自定义的类型也可以

  • ElemType elem[LIST_INIT_SIZE]; //数据元素的基地址,加*号就是数组的动态分配,不加就是静态分配

    • 静态分配:不加*号就是初始给你的数组分配基地址,这样所有元素的地址就没有改变了

    • 动态分配:我们要手动为这个数组分配空间,语法如下:

      • SqList L;
        L.data = (ElemType*)malloc(sizeof(ElemType)*LIST_INIT_SIZE);
        

相关函数说明

  • malloc(m)函数: 开辟m字节长度的地址空间,并返回这段空间的首地址,决定空间如何分配的是malloc函数前面小括号里面的类型
  • free§函数:释放指针p所指向变量的储存空间,即彻底删除一个变量
  • 前两个函数需要加载头文件<stdlib.h>

当然,c++,

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值