DS之线性表

        线性表的定义

        线性表是最常用且最简单的一种数据结构,一个线性表是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>



 

 


 

 

   

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值