DS之线性表

来源:互联网 发布:淘宝网摩托车 编辑:程序博客网 时间:2024/05/16 04:50

        线性表的定义

        线性表是最常用且最简单的一种数据结构,一个线性表是n个数据元素的有限序列。至于每个数据元素的具体含义,在不同的情况下各不相同,它可以是一个数或一个符号,也可以是一页书,甚至其他更复杂的信息。

        自稍微复杂的线性表中,一个数据元素可以由若干个数据项组成。在这种情况下,常把数据元素称为记录,含有大量记录的线性表又称为文件。

        例如下图就是一个文件:表中每个学生的情况为一个记录,它由姓名,学号,性别,年龄,健康情况五个数据项组成。

 

        线性表的表示

        在同一线性表中的元素必定具有相同的属性,即属于同一数据对象,相邻数据元素之间存在着序偶关系。若将线性表记为(a1,...,ai-1,ai,ai+1,...,an),则表中ai-1领先于ai,ai领先于ai+1,称ai-1是ai的直接前驱元素,ai+1是ai的直接后继元素。当i=1,2,...,n-1时,ai有且仅有一个直接后继,当i=2,3,...,n时,ai有且仅有一个直接前驱。

        线性表中元素的个数为n(n>=0)定义为线性表的长度,n为0时称为空表。在非空表中的每个数据元素都有一个确定的位置,如a1是第一个数据元素,an是最后一个数据元素,ai是第i个数据元素,称i为数据元素ai在线性表中的位序。

       线性表是一个相当灵活的数据结构,它的长度可根据需要增长或缩短,即对线性表的数据元素不仅可以访问,还可以进行插入和删除等。

       对于抽象数据类型线性表,还可以进行一些复杂的操作,将两个或两个以上的线性表合并为一个线性表;把一个线性表拆开两个或两个以上的线性表;重新复制一个线性表等。

       线性表的基本操作:

<span style="font-size:18px;">//线性表基本操作InitList(&L)//操作结果:构建一个空表LDestroyList(&L)//初始条件:线性表L已经存在 操作结果:销毁线性表LClearList(&L)//初始条件:线性表L已经存在 操作结果:将L重置为空表ListEmpty(L)//初始条件:线性表L已经存在 操作结果:判断L是否为空表ListLength(L)//初始条件:线性表L已经存在 操作结果:返回L中的数据元素的个数GetElem(L,i,&e)//初始条件:线性表L已经存在,1<=i<=ListLength(L)//操作结果:用e返回L中第i个数据元素的值LocateElem(L,e,compare())//初始条件:线性表L已经存在,compare()是数据元素判定函数//操作结果:判定是否返回L中第一个与e满足关系compare()的数据元素的位序。ListInsert(&L,i,e)//初始条件:线性表L已经存在,1<=i<=ListLength(L)+1//操作结果:在L中第i个位置插入之前插入新的数据元素e,将L的长度加1ListDelete(&L,i,&e)//初始条件:线性表L已经存在并且为非空,1<=i<=ListLength(L)//操作结果:删除L中的第I个数据元素,并用e返回其值,L的长度减1ListTraverse(L,visit())//初始条件:线性表L已经存在//操作结果:调用visit()函数将线性表的所有数据元素遍历输出</span>

        例一:将La和Lb的数据元素合并到Lb中,并且不能出现重复的数据元素的算法描述为:

<span style="font-size:18px;">void union(List &La,list Lb){La_len=ListLength(La);//求两个线性表的长度    Lb_len=ListLength(Lb);for(int i=1;i<=Lb_len;i++){GetElem(Lb,i,e);//取出Lb中的第i个数据元素赋值给eif(!LocateElem(La,e,equal)){ListInsert(La,++La_len,e);//若Lb中不存在和e相同的数据元素则插入}}}</span>

         例二:将La和Lb合并到一个新的线性表Lc中,并且Lc中的数据元素的顺序依然为非递减排列的算法:

<span style="font-size:18px;">void MergeLIst(List La,List Lb,List &Lc){InitList(Lc);//构建一个空表int i=j=1;int k=0;La_len=ListLength(La);//求两个线性表的长度    Lb_len=ListLength(Lb);while((i<=La_len)&&(j<=Lb_len)){int ai,bj;GetElem(La,i,ai);        GetElem(Lb,j,bj);if(ai<=bj){ListInsert(Lc,++k,ai);++i;}else{            ListInsert(Lc,++k,bj);++j;}while(i<=La_len){GetElem(La,i++,ai);ListInsert(Lc,++k,ai);}while(j<=Lb_len){GetElem(Lb,j++,bj);ListInsert(Lc,++k,bj);}}}</span>



 

 


 

 

   

 

 

1 0
原创粉丝点击