实验一 线性表的顺序存储与实现_数据结构 ——线性表的原理及c++程序实现

e03dd70bf4518951a1553cc5081fdaaa.png

数据结构 ——线性表的原理及c++程序实现

什么是线性表?

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

>表中元素个数称为线性表的长度

>线性表没有元素时,称为空表

>表起始位置称表头,表结束位置称表尾

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

类型名称:线性表(List

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

操作集:线性表L List,整数i表示位置,元素X ElementType

线性表基本操作主要有:

1List MakeEmpty():初始化一个空线性表L

2ElementType FindKth( int K, List L ):根据位序K,返回相应元素 ;

3int Find( ElementType X, List L ):在线性表L中查找X的第一次出现位置;

4void Insert( ElementType X, int i, List L):在位序i前插入一个新元素X

5void Delete( int i, List L ):删除指定位序i的元素;

6int Length( List L ):返回线性表L的长度n

线性表的顺序存储实现:

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

3d378fecafd7491685d78a92edd52e58.png

定义线性表的数据对象集

aeb68e5f9c9e998c87d180fe43dab79d.png

定义线性表的操作集

初始化空表:

9ac40afb1d0fdafc4ca0ff2a00a3801c.png

查找线性表中的元素

04b81efc3a0ada0c84db15a547cd15d5.png

向线性表中插入元素

3a7365a5562ec8f558783828fb288cf2.png

PS:相较于老师在视频中写的插入操作,我自己增加了插入到线性表尾的操作,可以用来初始化线性表

删除线性表中的元素

0bb24154f957585db9825e715c114309.png

线性表的完整代码如下

515f61c63720315250f17ba86d387ef2.png

线性表的链式存储实现

不要求逻辑上相邻的两个元素物理上也相邻;通过“链”建立起数据元素之间的逻辑关系

>插入,删除不需要移动数据元素,只需要修改“链”

2f3f3b7587be3cf6fe0a44030da70fe6.png

定义链表的数据对象集

4937cf96c939e5b7dd3b0b6016214433.png

链表的每一个结点都代表一个结构,一个结构至少有两个分量,一个分量代表这个结点对应的数据,另一个代表它的下一个结点的位置

定义链表的操作集

查表长

9a037cfedafafbb1fa052f6cde55e5d5.png

首先将指针指向链表表头,计数器定为0,将指针依次后移直到指向空指针,计数器依次+1

按序号查找

282a847321149e7540d6bc7a0c87e73c.png

链表寻找元素不同于顺序表,顺序表逻辑相邻的元素顺序也相邻,故数组下标+1即可指向下一元素,知道逻辑位置即可知道物理位置,链表依靠指针NEXT连接在一起,如果想要知道某逻辑位置的值必须依靠指针从头依次遍历找到其物理位置,返回物理位置。

按值查找

6fd009330b29352c4c090d959aff558e.png

链表的插入

fde023f4f3389b9cb8f0b1f880936e20.png

7275aa799f55ec5358dae402895122cc.png

链表删除

0b86ac27323751cb3392e731b3944e54.png

06c267536855e613bb125d7a1069698d.png

由于链表中的每一个结点都是通过new函数申请得到的,故删除以后为防止内存泄露需要将其delete掉。

删除头结点有两种情况,一种头结点本身为空,此时返回NULL即可,一种是头结点本身不空,则将一个指针指向要被删除的结点,将头结点后移一位,然后删除指针所指向的结点,此时表空

完整代码

fc1adc0fe3f11f2bbfd93930b88e4e9c.png

注:本次笔记基于浙江大学陈越以及何钦明老师的数据结构课,其中加入了自己的理解,如果有不正确的地方欢迎大家在评论区留言,不胜感激。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值