码迷,mamicode.com
首页 > 其他好文 > 详细

DS之线性表

时间:2015-04-18 13:13:39      阅读:137      评论:0      收藏:0      [点我收藏+]

标签:线性表   数据结构   算法   单链表   合并   

        线性表的定义

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



 

 


 

 

   

 

 

DS之线性表

标签:线性表   数据结构   算法   单链表   合并   

原文地址:http://blog.csdn.net/erlian1992/article/details/45111479

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!