2020-8-17数据结构

线性结构

线性结构是一种数据类型
典型的有线性表

现在以“多项式的表示”来举例。
首先对该题目进行分析,如何表示多项式呢?
多项式的关键数据
1、多项式的项数n
2、各项系数ai以及指数i

方法一:顺序存储结构直接表示
零项与非零项都表示出来,不省略为0的部分
但是如果一个多项式只包含一个常数项以及项数特别大的项,势必会造成空间浪费。
如多项式x+3x^2000,起码至少要用大小为2001的数组。

更好的方法:只表示非零项。
方法2:顺序存储结构表示非零项
是一个二元组的集合
该类型按照指数大小的顺序有序排列。

方法3:链接结构存储非零项在这里插入图片描述

什么是线性表?

什么时候使用线性表?
当我们的目标是想管理一个线性有序序列时,我们就归结为一个线性表问题。

线性表:同一类型数据元素构成有序序列的线性结构。
**
1表中元素的个数称为线性表的长度
2线性表没有元素时,称为空表
3表起始位置称为表头,表结束位置称为表尾**

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

对于抽象数据类型,上节课提到包括数据对象集和另外在这个对象集上面有什么操作集。线性表的抽象数据类型描述

主要操作为六个步骤:
1、ListMakeEmpty():初始化一个空线性表L。
2、ElementType FindKth(int K,List L):根据位序K,返回相应元素。
3、int Find(ElementType x,List L):查找线性表L中x第一次出现的位置。
4、void insert(ELementType X,int I,List L):在位序I前插入一个新元素X。
5、void Delete(int I,List L)在线性表L中删除指定位序为I的元素。
6、int Length(list L)返回线性表L的长度n。

线性表的顺序存储实现:插入一个指针last来表示最后一个元素。存放在数组data中。

所以下图流程就可以抽象的理解为实现了一个线性表。
在这里插入图片描述

介绍主要操作的实现:
1.初始化(建立空的顺序表)
是用结构来表示,因此使用malloc这个函数来申请这个结构。
其次,把last设为-1,因为last代表最后一个元素,所以last如果为0是代表这个表里有一个元素放在第一个位置,如果没元素就表示-1。
然后return把结构的指针返回回来。
在这里插入图片描述
2.查找
这里的ptrl是线性表结构的指针,通过这个结构,我们知道数组是谁,last是谁。而这个find的意思是找到这个线性表中X元素的位置。
I<=ptrl->last相当于遍历了一整个线性表,从元素1一直到最后一个元素last为止。
后面的语句表示data【i】和x表示,如果等于x就表示找到了,如果 不等于,继续进行循环。
如果这个循环退出来了,表示这两个条件可能被破坏了:1 data【i】=x,2是i>last。
1是retrn返回相应位置,2是return-1(表示没找到)

【这个查找操作成功的平均比较次数为(n+1)/2,要么第一个就找到,要么最后一个找到。】
在这里插入图片描述

3.插入(第i(1<=i<=n+1)个位置上插入一个值为x的新元素。这里1就是插在表头,n+1表示插在表尾。
所以插入第i个的时候,由于是在数组中,元素从0开始计入,因此要把i元素放入i-1的这个位置中。
而此时需要把i-1之后的元素都往后挪一位。
这一步骤是需要弄一个循环。

j开始做的位置必须是last而不是要插入的i-1位置。然后把j元素移动到j+1的位置,每次再j–一直挪到i-1为止。
此时空出来i-1这个位置,放入第i个元素(就是x)把x插入进去。
因为放进去一个x,多了一个元素,所以last++。

【平均移动次数n/2】
在这里插入图片描述

4.删除(删除表的第i(1~n)个位置上的元素)
首先if判断,位置是否正确。
其次for循环一个一个往前挪,将i挪到i-1,i+1挪到i。从左往右。
然后将j位置的值,赋值给j-1位置的元素。
因为删除了元素,所以是last–。
最后return返回值。
【平均移动次数与插入相同都是(n-1)/2】
在这里插入图片描述

线性表的链式存储实现

什么时候使用链式存储?
当两个元素是在逻辑上相邻,而不要求这两个元素在物理上也相邻时,就可以通过链表来建立起数据元素之间的逻辑关系。
(插入,删除不需要移动数据元素,只需要修改“链”)
以下图为例,这是一个链表示意图,每一个链表的结点都是一个结构,而在这个结点的结构里至少有两个分量,一个是结点所对应的数据,一个是代表它下一个结点的位置,也是指针。在这里插入图片描述

主要操作的实现
1.求表长
首先可以看出这是一个单向链表,用遍历的方法实现功能。
首先设一个零时的指针p指向链表头,此处是ptrl。
j可以看作是一个计数器。
当p指针不等于null继续循环,然后不断的把p->next的值赋给p,j++,知道最后输出的j的值就是表的长度。
时间性能为O(n)

在这里插入图片描述

2.查找,也是使用遍历的方法。
用p设为表头,找寻k元素。
当跳出该循环时表明不满足条件, 此时可能有两种情况:其一是p=null就表明为空,没找到。
另一种是p=k,找到k元素,return返回k元素的位置。
在这里插入图片描述
用值查找同理。
在这里插入图片描述

3.插入。(在第i-1(1<=i<=n+1)个结点后插入一个值为x的新结点)
与在线性表中的插入方式不同,在链表的插入中,一定要知道插的结点的前面一个是谁。
(1)先构造一个新结点,可以用malloc函数,用s指向;
(2)再找到链表的第i-1个结点,用p指向
(3)修改指针,插入结点(p之后插入的新结点是s)
在这里插入图片描述
操作如下
首先注意,如果插入新的结点要插在链表头上需要先进行声明,因为此处i==1,i-1这个位置之后,所以如果为0的话则说明不存在,所以要进行特殊处理。
return s是因为你对链表头进行了新插入所以链表改变,重新输出。
注意s->Next=p->next;
与p->next=s;
这两个语句不可以颠倒,如果颠倒的话则会表示成s->next指向s,从而不能正确完成插入。
最后return表示回来新的链表的头指针。
【操作次数为n/2】
在这里插入图片描述

4.删除(删除链表的第i(1~n)个位置上的结点)
在这里插入图片描述
具体语句如下:(与插入类似)
释放时使用free。
在这里插入图片描述

广义表的概念

此处引入一个例子。
在这里插入图片描述
因此,广义表是线性表的一种推广。对于线性表而言,n个元素都是基本的单元素。
广义表中,这些元素不仅可以是单元素,也可以是另一个广义表。

多重链表

在这里插入图片描述

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值