王道数据结构—线性表的顺序表示应用题2

数据结构—线性表的顺序表示应用题-2

题目六

从有序顺序表中删除所有其值重复的元素,使表中的所有元素的值均不同。

算法思想:

用双指针算法,初始时将第一个元素视为非重复的有序表,之后依次判断后面的元素是否与前面非重复的有序表的最后一个元素相同,若相同的话,则继续向后判断,若不同的话,则插入到前面的非重复有序表的最后,直到判断到表尾结束。

代码:

bool Delete_Same(SeqList &L)
{
	if (L.length == 0)
		return false;
	int i,j;							//i存储第一个不相同的元素,j为工作指针 
	for (i=0,j<1;j<L.L.length;j++)
		if (L.data[i] != L.data[j])		//查找下一个与上个元素值相同的元素 
			L.data[++i] = L.data[j];	//找到后,将元素后移 
	L.length = i + 1;
	return true;	
}

题目七

将两个有序顺序表合并为一个新的有序顺序表,并由函数返回结果顺序表。

算法思想:

按顺序不断取两个顺序表表头元素较小的结点存入新的顺序表中,直到有一个表中没有元素,则将另一个表剩余的元素加到新的顺序表后面。

代码:

bool Merge(SeqList A,SeqList B,SeqList &C)
{
	if (A.length + B.length > C.maxSize) //大于顺序表的长度 
		return false;
	int i = 0, j = 0, k = 0;
	while (i<A.length && j<A.length)	//循环比较,较小的存入C表中 
	{
		if (A.data[i] < B.data[j])
			C.data[k++] = A.data[i++];
		else
			C.data[k++] = B.data[j++];
	}
	while (i<A.length)					//A表还有剩余元素 
		C.data[k++] = A.data[i++];
	while (j<B.length)					//B表还有剩余元素 
		C.data[k++] = B.data[j++];
	C.length = k;
	return true;
 } 

题目八

已知在一维数组 A[m+n] 中依次存放两个线性表 a 和 b。试写一个函数,将数组中的两个顺序表的位置互换,即将 b 中元素放在 a 中元素的前面。

算法思想:

先将数组中的所有数逆置,再把前 n 个数逆置,最后将数组后 m 个数逆置就可以了。

代码:

void Reverse(int A[], int left, int right, int length)
{
	if (r>=l || right>=length)
		return;
	int mid = (left + right) / 2;
	for (int i=0;i<=mid-l;i++)
		swap(A[left+1],A[right-1]);
} 
void Exchange(int A, int m, int n, int length)
{
	Reverse(A,0,m+n-1,length);
	Reverse(A,0,n-1,length);
	Reverse(A,n,m+n-1,length);
 } 

题目九

线性表 a 中的元素递增有序切按顺序存储在计算机内。要求设计一个算法,完成用最少时间在表中查找数值为 x 的元素,若找到则将其与后继元素位置相互换,若找不到则将其插入表中并使表中元素仍递增有序。

算法思想:

顺序存储的线性表递增有序,可以顺序查找,也可以二分查找,因为题目要用最少的时间,所以用二分查找。

代码:

void find_x(int A[], int &length, int x)
{
	int l = 0, r = length - 1;
	while (l<r)
	{
		int mid = (l + r) >> 1;
		if (A[mid] >= x) 
			r = mid;
		else 
			l = mid + 1;
	}
	// 如果找到该元素
	if (A[l]==x && l!=n-1)
	{
		swap(A[l],A[l+1]);
	}
	else // 如果未找到该元素
	{
		A[length] = x;
		for (int i=length; i>0;i--)
		{
			if (A[i]<A[i-1])
				swap(A[i], A[i - 1]);
			else
				break;
		}
		length++;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

suxiaorui

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值