线性表的定义
线性表是最常用且最简单的一种数据结构,一个线性表是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) //操作结果:构建一个空表L DestroyList(&L) //初始条件:线性表L已经存在 操作结果:销毁线性表L ClearList(&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的长度加1 ListDelete(&L,i,&e) //初始条件:线性表L已经存在并且为非空,1<=i<=ListLength(L) //操作结果:删除L中的第I个数据元素,并用e返回其值,L的长度减1 ListTraverse(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个数据元素赋值给e if(!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>
原文地址:http://blog.csdn.net/erlian1992/article/details/45111479