数据结构基础之顺序表的应用(一)

现有 2 个集合 A 和 B,求一个新集合 C=A∪B,3 个集合都用顺序表表示。 比如 A={2, 4, 10, 5, 9},B={1, 4, 6, 8},则 C={2, 4, 10, 5, 9, 1, 6, 8}

void listMerge(seqList *&A, seqList *&B, seqList*& C){
	int ia, ib, ic = 0;
	//先将集合A中的元素全部复制到C表中
	for (ia=0; ia<A->listLen; ia++){
		C[ic++] = A[ia];
	}
	//依次从B中取元素,并遍历A表,看是否有重复元素
	for (ib=0; ib<B->listLen; ib++){
		if(!listLocate(A, B[ib]))
			C[ic++] = B[ib];
	}
	
	C->listLen = ic;//修改表长
}

假设顺序表 L 中的元素递增有序,设计算法在顺序表中插入元素 x,要求插 入后仍保持其递增有序特性,并要求算法时间尽可能少。

void insert(seqList *&L, elementType x){
	int i = L->listLen-1;
	//判断是否表满
	if (i>=MAXLEN-1){
		cout << "overflow!" << endl;
		return;
	}
	//因为要进行有序插入,因此肯定有位置插入元素
	//边从后向前比较,边移动元素,提高了时间性能
	while (i>=0 && x < L->data[i]){
		L->data[i+1] = L->data[i];
		i--;
	}
	
	L->data[i+1] = x; //注意是i+1,不是i
	L->listLen++;//修改表长
	
}

假设顺序表 A、B 分别表示一个集合,设计算法以判断集合 A 是否是集合 B的子集,若是,则返回 TRUE,否则返回 FALSE,并要求算法时间尽可能少。

bool subset(seqList *&A, seqList *&B){
	int ia, ib;
	bool suc = false;//标记
	
	for (ia=0; ia<A->listLen; ia++){
		suc = false;
		//遍历B表
		for (ib=0; ib<B->listLen; ib++){
			if (A[ia] == B[ib]){
				suc = true;
				break;
			}
		}
		//如果suc == false, 说明B中没有元素和A的元素相同,则A不是B的子集
		if (suc == false)
			return false;
	}
	//如果正常退出循环,则A是B的子集
	return true;
}

假设递增有序顺序表 A、B 分别表示一个集合,设计算法以判断集合 A 是否 是集合 B 的子集,若是,返回 TRUE,否则返回 FALSE,并要求算法时间尽可能少

bool subset(seqList *&A, seqList *&B){
	int ia = 0, ib = 0;
	//从头开始遍历A,B表
	while (ia < A->listLen && ib < B->listLen){
		if (A->data[ia] == B->data[ib]){
			ia++;
			ib++;
		}
		else if (A->data[ia] > B->data[ib]){
			ib++;
		}
		//A中的元素比B中的小,由于A和B从头开始遍历,且递增有序,则A中的元素B中没有
		else 
			return false;
	}
	
	if (ia >= b->listLen)
		return true;
	else
		return false;
	
}

设计算法将递增有序顺序表 A、B 中的元素值合并为一个递增有序顺序表 C, 并要求算法时间尽可能少

void merge(seqList *&A, seqList *&B, seqList *&C){
	int ia = 0, ib = 0, ic = 0;
	
	while (ia < A->listLen && ib < B->listLen){
		if (A->data[ia] == B->data[ib]){
			
			C->data[ic++] = A->data[ia++];
			C->data[ic++] = B->data[ib++];
		}
		else if (A->data[ia] > B->data[ib]){
			C->data[ic++] = B->data[ib++];
		}
		else 
			C->data[ic++] = A->data[ia++];
	}
	
	if (ia < A->listLen){
		C->data[ic++] = A->data[ia++];
	}
	if (ib < B->listLen){
		C->data[ic++] = B->data[ib++];
	}
	
	C->listLen = ic;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值