顺序表习题

本文探讨了在顺序表中删除值为x的元素和指定范围内的元素两种情况,提供了两种时间复杂度为O(n)的解法。第一种是统计不等于x的元素个数并重构,第二种是计数等于x的元素并向前移位。同时,针对删除指定区间元素的功能进行了错误检查。
摘要由CSDN通过智能技术生成

1

在长度为n的顺序表L中,删除所有值为x的数据元素,要求时间复杂程度为O(n),空间复杂程度为(1)
**解法1:**用k记录有序表中不等于x元素的个数,边扫描边统计k,同时把不等于x的数放在k位置上,最后修改L的长度为k`

void f1(SqList *L,ElemType x){
	int k = 0;
	for(i = 0;i < L->length;i++)
		if(L->data[i] != x){
			L->data[k] = L->data[i];
			k++;
		}
	L->length = k;
}

**解法2:**用k记录顺序表L中等于x的元素个数,边扫描边统计k,并将不等于x的元素向前移k个位置

void f2(SqList *L,ElemType x){
	int k = 0;
	for(int i = 0;i<L->length;i++){
		if(L->data[i] == x)
			k++;
		else 
			L->data[i-k] = L->data[i];
	}
	L->length = L->length - k;
}

2

在有序顺序表中L中删除s-t之间的元素,要求s-t不合理或者顺序表为空,返回错误

bool f(SqList *L,ElemType s,ElemType t){
	int i,j;
	if(s >= t||L->length == 0)
		return 0;
	for(i = 0;i < length&&L->data[i]<s;i++);//寻找大于等于s的第一个元素
	if(i >= L->length)//所有的值都小于s,返回
		return 0;
	for(j = i;j<L->length&&j <= L->length;j++);//寻找大于t的第一个元素
	for(;j < L->length;i++,j++)
		L->data[i] = L->data[j];//前移,填补元素位置
	L->length = i;
	return 1;
	
}

3

在顺序表中L中删除s-t之间的元素,要求s-t不合理或者顺序表为空,返回错误

bool f(SqList *L,ElemType s,ElemType t){
	int i,k;
	if(L->length == 0&&s >= t)
		return 0;
	for(i = 0;i < L->length;i++){
		if(L->data[i] >= s&&L->data[i] <= t)
			k++;
		else
			L->data[i-k] = L->data[i];
	}
	L->length = L->length - k;
	return 1;
}

也可以模仿第二题的第一种解法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值