数据结构考前复习(3)

2.2线性表的顺序表示和实现(3)

顺序表的查找和合并操作

基于例题2-1与2-2(清华大学数据结构教材p20、21)研究LocateElem函数与MergeList函数的实现方法。例2-1、2-1伪代码如下:

//例2-1 
//将线性表LA与LB集中于LA中
void Union(List &LA,List LB)
{
	LA_len=ListLength(LA);
	LB_len=ListLength(LB);
	for(i=1;i<=LB_len;i++)
	{
		GetElem(LB,i,e);//取LB中第i个元素赋值给e 
		if(!LocateElem(LA,e,equal))//在LA中寻找e 
		{
			ListInsert(LA,++LA_len,e);//在LA中增添e 
		}
	}
}
//例2-2
//线性表LA、LB非递减有序排列,将LA、LB归并至新线性表LC中,仍非递减排列 
void MergeList(List La,List Lb,List &Lc)
{
	InitList(Lc);//构建空白表Lc
    i=j=1;k=0;
    La_len=ListLength(La);
    Lb_len=ListLength(Lb);
    while((i<=La_len)&&(j<=La_len))
    {
    	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);
    	++i;
    }
    while(j<=Lb_len)
    {
    	GetElem(Lb,j,bj);
    	ListInsert(Lc,++k,bj);
    	++j;
    }
}

1.查找操作

//顺序表查找操作
int LocateElem_Sq(SqList L,ElemType e,Status(*compare)(ElemType,Elemtype))
//在顺序线性表L中查找第1个值与e满足compare()的元素位序 
//若找到,则返回其在L中的位序,否则返回0 
{
	i=1;//i的初值为第一个元素的位序 
	p=L.elem; //p的初值为第一个元素的存储位置
	while(i<=L.length&&!(*compare)(*p++,e)) 
		++i;
	if(i<=L.length)
		return i;
	else
		return 0;
} 

2.合并操作

从例2-2代码中可直接写出形式上极其相似的算法

//顺序表合并操作
//线性表LA、LB非递减有序排列,将LA、LB归并至新线性表LC中,仍非递减排列 
void MergeList_Sq (SqList La,SqList Lb,SqList &Lc)
{
    i=j=1;k=0;
	pa=La.elem;
	Pb=Lb.elem;
	Lc.listsize=Lc.length=La.length+Lb.length;
	Lc.elem=(ElemType *)malloc(Lc.listsize*sizeof(ElemType));//分配内存 
	if(!Lc.elem)
	{
		exit(OVERFLOW);//存储分配失败  退出程序 
	}
	pa_last=La.elem+La.length-1;
	pb_last=Lb.elem+Lb.length-1;
    while((pa<=pa_last)&&(pb<=pb_last))//归并 
    {
    	if(*pa<=*pb)
    	{
	    	*pc++=*pa++;
	    }
	    else
		{
    		*pc++=*pb++;
    	}
    }
    while(pa<=pa_last)
    {
    	*pc++=*pa++;//插入La剩余元素 
    }
    while(pb<=pb_last)
    {
    	*pc++=*pb++;//插入Lb剩余元素 
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值