王道_线性表_顺序表习题

#include<stdio.h>
#include<stdlbib.h>
#define MaxSize 20

typedef strict{
	int data[MaxSize];
	int length;
}SqList;


//第一题,删除最小的元素,并返回,空出位置由最后一个元素补上
bool DeleteMin(SqList &L,ElemType &value){
	if(L.length ==0) //表空,中止操作返回
		return false;
	int temp=L.data[0];
	for(int i=1;i<L.length;i++){ //找到最小元素的位置i,并使该元素值富于value
		if(L.data[i]<L.data[t]){
			t=i;
			value=L.data[i];
		}
	}
	L.data[t] = L.data[L.length-1];//空出位置由最后一个元素值填补
	return true;
}


//第二题,顺序表L逆置,空间复杂度为O(1)
void Reverse(SqList &L){
	ElemType p;//辅助变量
	for(int i=0;i<L.length/2;i++){
		p = L.data[i];
		L.data[i] = L.data[L.length-i-1];
		L.data[L.length-i-1] = p;
	}
}


//第三题,删除线性表中所有值为x的元素,时间复杂度为O(n),空间复杂度为O(1)
void delete_x_1(SqList &L,ElemType x){
	//记录不等于x的元素个数k,并将不等于x的元素前移k位
	int k = 0;
	for(int i = 0;i<L.length;i++){
		if(L.data[i]!=x){
			L.data[k] = L.data[i];
			k++;//不等于x的元素增1
		}
	} 
	L.length = k;
}

void delete_x_2(SqList &L,ElemType x){
	//记录等于x的元素个数k,并把不等于x的元素向前移动k位
	int k=0,i=0;//k记录等于x的元素个数
	while(i<L.length){
		if(L.data[i] == x) k++;
		else{
			L.data[i-k] = L.data[i];//当前元素前移k位
		}
		i++;
	}
	L.length -=k;//顺序表表长递减
}


//第四题,删除值为给定s与t之间的所有元素
bool Delete_s_t1(SqList &L, ElemType s,ElemTypr t){
	//这个效率比较低,无论线性表是否有序都能将整个范围内的删除
	if(L.length == 0 || s>=t)
		return false;
	int k = 0;//用k记录不在s到范围内的元素
	for(int i = 0;i<L.length;i++){
		if(L.data[i]<=s || L.data[i]>=t){
			L.data[k] = L.data[i];//将不在范围的元素前移k位
			k++;
		}
	}
	L.length = k;//顺序表长为k
	return ture;	
}

bool Delete_s_t2(SqList &L,ElemType s,ElemType t){
	if(L.length ==0 || s>=t)
		return false;
	int i,j
	for(i=0;i<L.length&&L.data[i]<s;i++){ //寻找大于等于s的第一个元素位置
		if(i>=L.length)//元素全都小于s
			return false;
	}
	for(j=i;j<L.length && L.data[j]<=t;j++){//找到大于t的第一个元素
		for(;j<L.length;i++,j++){//将大于t的第一个元素及其后边所有元素前移,填补被删除元素位置
			L.data[i] = L.data[j];
		}
	}
	L.length = i;
	return ture;
}


//删除值在s到t之间(包含s、t)所有与元素
bool Delet_s_t1(SqList &L,ElemType s,ElemType t){
	if(L.length==0 || s>=t)//线性表为空或者s、t不合法
		return false;
	int k=0;//k用于记录值不在s、t范围内的元素
	for(int i=0;i<L.length;i++){
		if(L.data[i]<s || L.data[i]>t){
			L.data[k] = L.data[i];//将不在该范围的元素前移k位
			k++;
		}
	}
	L.length = k;
	return ture;
}

bool Delete_s_t2(Sqlist &L,ElemType s,ElemType t){
	if(L.length == 0 || s>=t)
		return false;
	int k=0,i;//k来记录在s、t范围内的元素
	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]//将不在该范围内的元素前移k个位置
		}
	}
	L.length -=k;
	return ture;
}

//第六题,有序表删除其重复元素

bool Delete_same(SqList &L){
	if(L.length == 0)
		return false;
	int i,j;//i记录第一个不相同的元素
	for(i=0,j=1;j<l.length;j++){
		if(L.data[i]!=L.data[j]){
			i++;
			L.data[i]=L.data[j];//找到下一个与上一个元素值不同的元素前移
		}
	}
	L.length = i-1;	
	return true;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值