顺序表相关删除算法

1.删除顺序表中所有值为x的元素:

对于顺序表,若想要删除表中所有值为x的元素,简单地嵌套for循环会导致时间复杂度过大(O(n^{2 }))。

因此我们可以一边查找值顺序表中值不为x的元素,一边将该元素记录到顺序表中,并用k值记录当前顺序表的实际表长,此时时间复杂度为O(n)。

具体代码如下:

#include<stdio.h>
#define maxsize 100
typedef struct{
	int data[maxsize];
	int length;
}SqList;
bool Delete_Allx(SqList *L,int x){
	int k=0;
	for(int i=0;i<L->length;i++){
		if(L->data[i]!=x){
			L->data[k]=L->data[i];
			k++;
		}
	}
	if(k==L->length)
		return false;
	L->length=k;
	return true;
}
 int main(){
 	int x;
 	int temp;
 	int i=0;
 	scanf("%d",&temp);
	SqList L;
	L.length=0;
	while(temp!=999){
		L.data[i++]=temp;
		L.length++;
		scanf("%d",&temp);
	}
	scanf("%d",&x);
	if(Delete_Allx(&L,x)){
		for(int i=0;i<L.length;i++)
			printf("%d ",L.data[i]);
	}
	else
		printf("删除失败!");
 	return 0;
 }

运行结果:

2.删除顺序表中重复元素:

在重复元素未知的情况下,简单的暴力算法删除表中重复元素无疑需要经过多次遍历。

因此,可以考虑嵌套两层循环,在原有顺序表上进行更改。

void Delete(SqList *L){
	int k=0;
	for(int i=0;i<L->length;i++){
		int j;
		for(j=0;j<k&&(L->data[i]!=L->data[j]);j++);
		if(k==j){
			if(k!=i) L->data[k]=L->data[i];
			k++;
		}
	}
	
	L->length=k;
}

在上述代码中,j不断遍历0到i之间的数组元素,当j=k或j所指的元素与i所指向的元素相等时,代表当前i指向的元素与前面的元素重复,则跳过这个i值。

完整代码如下: 

#include<stdio.h>
#define maxsize 100

typedef struct{
	int data[maxsize];
	int length;
}SqList;
void Delete(SqList *L){
	int k=0;
	for(int i=0;i<L->length;i++){
		int j;
		for(j=0;j<k&&(L->data[i]!=L->data[j]);j++);
		if(k==j){
			if(k!=i) L->data[k]=L->data[i];
			k++;
		}
	}
	
	L->length=k;
}
 int main(){
 	int temp;
 	int i=0;
	scanf("%d",&temp);
	SqList L;
	L.length=0;
	while(temp!=999){
		L.data[i++]=temp;
		L.length++;
		scanf("%d",&temp);
	}
	Delete(&L);
	for(int i=0;i<L.length;i++)
		printf("%d ",L.data[i]);
 	return 0;
 }

运行结果:

是给自己做的整合,从各处学习到的方法,如果涉及版权问题可随时联系我

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值