开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第4天,点击查看活动详情
2.1.1 引子:多项式表示
例子:一元多项式及其运算
主要运算:多项式相加、相减、相乘等
分析--如何表示多项式
多项式的关键数据:
-
多项式项数n
-
各项系数ai以及指数i(这里的ai的i是指a的下标)
方法1:顺序存储结构直接表示
注解:其实这个的意思就是从头加到尾,不管中间的答案有没有像0这种可以直接省略掉的值都会占一个位置。
所以上方那个问题中如何表示多项式的答案是:需要占2001个位置,首选他是顺序存储结构,然后下标从0开始,所以是2001而不是2000
方法2:顺序存储结构表示非零项(按照指数大小有序存储,比如说指数大的排在前面,指数小的排在后面)
多项式相加过程:从头开始,比较两个多项式当前对应项的的指数 =>这样就能够做到指数递降运算
这里的(11,8)是(15,8)与(-4,8)的结合结果,因为指数一样,所以可以结合为一个
这种方法可以有效节省空间,操作效率也不算差
方法3:链表结构存储非零项
- 链表中每个节点存储多项式中的一个非零项,包括系数和指数两个数据域以及一个指针域
- coef:指数 expon:系数 link:指针域
- 用指针域将不同的项串起来,同样可以做到指数递降的顺序进行排序
//代码演示
typedef struct PolyNode*Polynomial;
struct PolyNode{
int coef;
int expon;
Polynomial link;
}
分别指向多项式的头,然后比较指数大小,大的输出;相等的话,系数相加
2.1.2 线性表及顺序存储
什么是线性表:由同类型数据元素构成有序列表的线性结构
- 表中元素个数称为线性表的长度
- 线性表没有元素的时候,称为空表
- 表起始位置称表头,表结束位置称表尾
多项式表示问题的启示:
- 同一个问题可以有不同的表示(存储)方法 =>通常来说的话是使用链表或者数组来进行存储
- 有一类共性问题:有序线性序列的组织和管理
线性表的抽象数据类型描述
类型名称:线性表(List)
数据对象集:线性表是n(>=0)个元素构成的有序列表(a1,a2,...,an)
操作集:线性表L属于List,整数i表示位置,元素X属于ElementType(这个类型可以是整型也可以是实型又或者是个结构,这里统称ElementType)
- List MakeEmpty():初始化一个空线性表L
- ElementType FindKth(int K,ListL):根据位序K,返回相应元素;
- int Find(ElementType X,int i, List L):在线性表L中查找X的第一次出现位置;
- void Insert(ElementType X,int i,List L):在位序i前插入一个新元素X;
- void Delete(int i,List L):删除指定位序i的元素;
- 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
“->”是一个整体,它是用于指向[结构体]子数据的指针,用来取子数据。
换种说法,如果我们在C语言中定义了一个结构体,然后申明一个指针指向这个结构体,那么我们要用指针取出结构体中的数据,就要用到“->”。
主要操作的实现
-
初始化MakeEmpty(建立空的顺序表)
List MakeEmpty() { List PtrL; PtrL = (List)malloc(sizeof(struct LNode));//通过malloc申请这样子一个结构 PtrL->Last = -1;//Last设置为-1,因为Last是代表最后一个元素。Last为0是代表这个表有一个元素放在第一个位置,没元素就设置为-1,然后把这个结构的指针返还回来 return PtrL; } -
查找
//科普小知识 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)