数据结构第二周笔记(1)——线性结构(慕课浙大版本--XiaoYu)

189 阅读5分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第4天,点击查看活动详情

2.1.1 引子:多项式表示

例子:一元多项式及其运算

image-20220627134344443

主要运算:多项式相加、相减、相乘等

分析--如何表示多项式

多项式的关键数据:

  1. 多项式项数n

  2. 各项系数ai以及指数i(这里的ai的i是指a的下标)

    方法1:顺序存储结构直接表示

    image-20220627134953388

注解:其实这个的意思就是从头加到尾,不管中间的答案有没有像0这种可以直接省略掉的值都会占一个位置。

所以上方那个问题中如何表示多项式的答案是:需要占2001个位置,首选他是顺序存储结构,然后下标从0开始,所以是2001而不是2000

方法2:顺序存储结构表示非零项(按照指数大小有序存储,比如说指数大的排在前面,指数小的排在后面)

image-20220627140021075

多项式相加过程:从头开始,比较两个多项式当前对应项的的指数 =>这样就能够做到指数递降运算

image-20220627140719716

这里的(11,8)是(15,8)与(-4,8)的结合结果,因为指数一样,所以可以结合为一个

这种方法可以有效节省空间,操作效率也不算差

方法3:链表结构存储非零项

  1. 链表中每个节点存储多项式中的一个非零项,包括系数和指数两个数据域以及一个指针域
  2. coef:指数 expon:系数 link:指针域
  3. 用指针域将不同的项串起来,同样可以做到指数递降的顺序进行排序
//代码演示
typedef struct PolyNode*Polynomial;
struct PolyNode{
    int coef;
    int expon;
    Polynomial link;
}

image-20220627141534773

image-20220627141555193

分别指向多项式的头,然后比较指数大小,大的输出;相等的话,系数相加

2.1.2 线性表及顺序存储

什么是线性表:由同类型数据元素构成有序列表的线性结构

  1. 表中元素个数称为线性表的长度
  2. 线性表没有元素的时候,称为空表
  3. 表起始位置称表头,表结束位置称表尾

多项式表示问题的启示:

  1. 同一个问题可以有不同的表示(存储)方法 =>通常来说的话是使用链表或者数组来进行存储
  2. 有一类共性问题:有序线性序列的组织和管理

线性表的抽象数据类型描述

类型名称:线性表(List)

数据对象集:线性表是n(>=0)个元素构成的有序列表(a1,a2,...,an)

操作集:线性表L属于List,整数i表示位置,元素X属于ElementType(这个类型可以是整型也可以是实型又或者是个结构,这里统称ElementType)

  1. List MakeEmpty():初始化一个空线性表L
  2. ElementType FindKth(int K,ListL):根据位序K,返回相应元素;
  3. int Find(ElementType X,int i, List L):在线性表L中查找X的第一次出现位置;
  4. void Insert(ElementType X,int i,List L):在位序i前插入一个新元素X;
  5. void Delete(int i,List L):删除指定位序i的元素;
  6. int Length(List L):返回线性表L的长度n

线性表的顺序存储实现

利用数组的连续存储空间顺序存放线性表的各元素

typedef struct LNode*List;
struct LNode{
    ElementType Data [MAXSIZE];//定义了一个数组,数组的分类类型是ElementType
    int List;//代表线性表的最后一个元素,这样的一个结构就可以抽象的实现一个线性表
};
struct LNode L;//定义一个变量L
List PtrL;//还有一个变量PtrL
    //访问下标为i的元素:L.Data[i]或PtrL->Data[i]
    //线性表的长度:L.Last+1或PtrL->Last+1

image-20220627191654197

“->”是一个整体,它是用于指向[结构体]子数据的指针,用来取子数据。

换种说法,如果我们在C语言中定义了一个结构体,然后申明一个指针指向这个结构体,那么我们要用指针取出结构体中的数据,就要用到“->”。

主要操作的实现

  1. 初始化MakeEmpty(建立空的顺序表)

    List MakeEmpty()
    {
        List PtrL;
        PtrL = (List)malloc(sizeof(struct LNode));//通过malloc申请这样子一个结构
        PtrL->Last = -1;//Last设置为-1,因为Last是代表最后一个元素。Last为0是代表这个表有一个元素放在第一个位置,没元素就设置为-1,然后把这个结构的指针返还回来
        return PtrL;
    }
    
  2. 查找

    //科普小知识
    find函数用于查找数组中的某一个指定元素的位置。
    ​
    比如:有一个数组[0, 0, 5, 4, 4];
    问:元素5的在什么位置,find函数 返回值 为 2;
    ​
    find (数组名 + 起始查找元素的位置, 数组名 + 结束查找的元素位置, 想要查找的元素)
    ​
    int Find(ElementType X, List PtrL)//List PtrL是线性表结构的指针
    {
        int i = 0;
        while(i <= PtrL ->Last && PtrL->Data[i]! = X )
            i++
        if(i > PtrL->Last)  return -1;//如果没找到,返回-1
        else return i;//找到后返回的是存储位置
    }
    查找成功的平均比较次数为(n+1)/2,平均时间性能为O(n)