数据结构(1)

73 阅读1分钟

“开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 12 天,点击查看活动详情

1.1.题目描述

对于长度为n的线性表,编写一个时间复杂度为O(n)m空间复杂度为O(1)的算法,删除线性表中值为x的数据元素。

1.2算法思想

方法一:用k来记录线性表中不等于k元素的个数(也就是需要保存的元素个数),扫描时将不等于x的元素移动到下标为k的位置,并且更新k的值,扫描结束后修改线性表的长度。

方法二:用k来记录线性表中等于x的元素的个数,便扫描线性表边进行统计k,并且将不等于x的元素前移k个位置,扫描结束后修改线性表的长度。

1.3 代码实现

L:我们扫描的线性表(顺序表;

x:我们想要删除的值;

k:用来记录不等于x的元素的个数;

void dele_1(SqList &L,ElemType x){
	
	int k=0,i;
	for(i=0;i<L.length;i++)
	if(L.data[i]!=x){
		L.data[k]=L.data[i];
	    k++;
	}
	L.length=k;
}

void dele2(SqList &L,ElemType x){
	
	int k=0,i=0;
	while(i<L.length){
		if(L.data[i]==x)
		k++;
		else
		L.data[i-k]=L.data[i];//当前元素前移k个位置 
		i++;
	}
	L.length=L.length-k;
}

2.1题目描述

从有序顺序表中删除给定值在s到t之间的(s<t),如果s或者t不合理或者线性表为空,那么显示错误信息并且退出。

2.2算法思想

找到值大于等于s的第一个元素(第一个要删除的元素),再找到值大于t的第一个元素(最后要删除的元素的下一个元素),想要删除这一段,直接将后面的元素前移即可。

2.3代码实现

bool Del(SqList &L,ElemType s,ElemType t){
	int i,j;
	if(s>=t||L.length==0)
	return false;
	for(i=0;i<L.length&&L.data[i]<s;i++);
	if(i>=L.length)
	return false;
	for(j=i;j<L.length&&L.data[j]<=t;j++);
	for(;j<L.length;i++,j++)
	L.data[i]=L.data[j];
	L.length=i;
	return true;
}

“开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 12 天,点击查看活动详情