数据结构与算法(二)线性表

线性表(LIST)的定义:由零个或多个数据元素组成的有限序列。
注意:
a).首先是一个序列,也就是说元素之间是有先来后到的顺序;
b).若元素存在多个,则第一个元素无前驱,而最后一个元素无后继,其他元素有且只有一个前驱和后继,例如将某一线性表记为(a1,a2,a3,ai-1,ai,ai+1,an),在表中ai-1领先于ai,ai领先于ai+1,所以称ai-1是ai的直接前驱元素,ai+1是ai的直接后继元素,所以线性表元素的个数n(n>=0)定义为线性表的长度,当n=0时,称为空表;
c).线性表强调是有限的,事实上无论计算机发展到多么强大,它所处理的元素都是有限的;
抽象数据类型:
数据类型的定义:是指一组性质相同的值的集合及定义在此集合上的一些操作的总称,例如有整型,浮点型,字符型这些数据类型。在计算机中,内存不是无限大的,比如计算整型:1+1=2这样的运算,只需给其很小的内存空间就可以,而浮点型:1.12345+2.34545这样的小数时就需要开辟较大的空间来存放,所以计算机定义了不同的数据类型,对其进行相应的操作。
数据类型的分类:
a).原子类型:不可以再分的基本类型,例如整型,浮点型,字符型等;
b).结构类型:由若干个类型组合而成,是可以再分解的,例如整型数组是由若干个整型数据组成的。
抽象数据类型
我们对已有的数据类型进行抽象,就有了抽象数据类型:一个数学模型及定义在该模型上的一组操作,它仅仅取决于一组逻辑特性,与计算机内部如何实现和表示无关。
举例:在游戏中,定位一个角色的位置,可以使用x,y,z三个整型数组组合在一起的坐标,就可以定位一个locat的抽象数据类型,它拥有x,y,z三个整型变量,这样就可以方便的对一个角色进行操作。
描述抽象数据类型的标准格式:

ADT 抽象数据类型名

Data
数据元素之间的逻辑关系的定义
Operation
操作
endADT

线性表的抽象数据类型:
线性表抽象数据类型定义:
ADT 线性表(List)
Data
线性表的数据对象集合为{a1,a2,a3,an},每个元素的类型均为DataType。其中,除了第一个元素a1外,每一个元素有且只有一个直接前驱元素,除了最后一个元素an外,每一个元素有且只有一个直接后继元素。数据元素之间的关系是一对一的关系。
Operation
InitList(*L):初始化操作,建立一个空的线性表L;
ListEmpty(L):判断线性表是否为空表,若线性表为空,则返回true,否则返回false;
ClearList(*L):将线性表清空;
GetElem(L,i,*e):将线性表L中的第i个位置元素返回给e;
LocateElem(L,e):在线性表L中查找与给定值e相等的元素,如果查找成功,返回该元素在表中序号,则表示成功;否则,表示失败;
ListInsert(*L,i,e):在线性表L中第i个位置插入新的元素e;
ListDelete(*L,i,*e);删除线性表L中第i个位置元素,并用e返回气质。
ListLength(L):返回线性表L的元素个数;
endADT
对于不同的应用,线性表的基本操作是不同的,上述操作是最基本的,对于实际问题中涉及的关于线性表的更复杂操作,完全可以用这些基本操作的组合来实现。
例如:有两个线性表A,B,将B中的元素添加到A中:

public List<int> Union(List<int> A, List<int> B)
        {

            for (int i = 0; i < B.Count; i++)
            {   
                if (!A.Contains(B[i]))
                {
                    A.Add(B[i]);
                }
            }
            return A;
        }

线性表的顺序存储结构:
线性表有两种物理存储结构:顺序存储结构和链式存储结构
顺序存储结构:用一段地址连续的存储单元依次存储线性表的数据元素。
线性表(a1,a2,an)的顺序存储如下:
在这里插入图片描述
物理上的存储方式事实上是在内存中找个初始地址,然后通过占位的形式,把一定的内存空间给占了,然后把相同数据类型的数据元素依次放在这空间中。
线性表顺序存储结构代码:
在这里插入图片描述
顺序存储结构封装的三个属性:
a).存储空间的初始位置,数组data,它的存储位置就是线性表存储空间的存储位置。
b).线性表的最大存储容量:数组的长度MaxSize。
c).线性表的当前长度:length。
注意:数组的长度是存放线性表的存储空间的总长度,一般初始化后不发生改变,而线性表的当前长度是线性表中元素的个数,是会变化的。
地址计算方法:
假设一个线性表占用的是n个存储单元(字节),那么在线性表中第i+1个数据元素和第i个数据元素的存储位置关系是:(loc表示获得存储位置的函数):
LOC(ai+1)=LOC(ai)+c
插入算法的思路:
a).如果插入位置不合理,抛出异常;
b).如果线性表长度大于等于数组长度,则抛出异常或者动态增加数组容量;
c).从最后一个元素开始向前遍历到第i个位置,分别将他们都向后移动一个位置;
d).将要插入的元素填入位置i处;
e).线性长度+1;

猜你喜欢

转载自blog.csdn.net/DOUBLE121PIG/article/details/94624822
今日推荐