第一章课后题代码

bool deletelem(Sqlist& L, int &e) {
	if (L.length == 0) {
		return false;
	}//表空,删除失败
	int min = L.data[0];
	int pos = 0;
	for (int i = 0; i < L.length; i++) {
		if (L.data[i] < min) {
			min = L.data[i];
			pos = i;
		}
	}//遍历找到最小元素及其下标
	e = min;
	L.data[pos] = L.data[L.length - 1];
	L.length--;//删除最小元素并用末尾元素替补
	return true;
}

bool listreverse(Sqlist& L) {
	if (L.length == 0) {
		return false;
	}//表空,置错
	int temp;//暂存元素;
	for (int i = 0; i < L.length / 2; i++) {
		temp = L.data[i];
		L.data[i] = L.data[L.length-i-1];
		L.data[L.length - i - 1] = temp;
	}//将表的元素逆置
	return true;
}

bool deleterep(Sqlist& L,int e) {
	int i = 0, k = 0;
	if (L.length == 0) {
		return false;
	}//表空,置错
	for (int i = 0; i < L.length; i++) {
		if (L.data[i] == e) {
			k++;
		}//k计数器
		else {
			L.data[i - k] = L.data[i];
		}
	}//遍历找到需要删除的元素;进行删除
	L.length = L.length - k;//改变表长
	return true;
}

bool deletespec(Sqlist& L,int s,int t) {
	int i = 0;
	int p = -1, q =-1;
	int k;//记录最小值和最大值下标位置
	if (L.length == 0|| s >= t||s>L.data[L.length-1]||t<L.data[0]){
		return false;
	}//表空或给定区间不满足要求
	while (i < L.length) {
		if (L.data[i] <=s) {
			p++;
		}
		if (L.data[i] < t) {
			q++;
		}
		i++;//遍历找到需要删除的最小元素的前一位和最大元素的位置
	}
	k = q - p ;//需要删除的元素个数
	for (q+1 ; q < L.length; q++) {
		L.data[q+1 - k] = L.data[q+1];
	}//将后面元素前移
	L.length = L.length - k;//修改数组长度
	return true;
}

bool deletespecram(Sqlist& L,int s,int t) {
	int k=0;
	if (L.length == 0|| s >= t){
		return false;
	}//表空或给定区间不满足要求
	for (int 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 true;
}

bool deleterep(Sqlist& L) {
	int i = 0, j = 1,k=0;
	while(j<L.length){
		if (L.data[i] != L.data[j]) {
			L.data[i + 1] = L.data[j];
			i++;
			j++;
		}//发现不相等元素,移入前部
		else { k++; j++; }//元素相等,指针后移
	}
	L.length = L.length - k;//改变数组长度
	return true;
}

bool listmerger(Sqlist &L1, Sqlist &L2, Sqlist &L3) {
	if (L3.length < L1.length + L2.length) {
		return false;
	}//若合并数组长度不够,置错
	int i = 0, j = 0, k = 0;
	while (i < L1.length && j < L2.length) {
		if (L1.data[i] < L2.data[j]) {
			L3.data[k++] = L1.data[i++];
		}
		else {
			L3.data[k++] = L2.data[j++];
		}
	}//遍历L1,L2,以此将最小元素插入L3
	while (i < L1.length) {
		L3.data[k++] = L1.data[i++];
	}
	while (j < L2.length) {
		L3.data[k++] = L2.data[j++];
	}//若有剩余,全部插入L3
	L3.length = k;//改变数组长度
	return true;
}

bool listchange(Sqlist L1, Sqlist L2, Sqlist &L3) {
	int temp;
	for (int i = 0; i < L3.length/2; i++) {
		temp = L3.data[i];
		L3.data[i] = L3.data[L3.length - i - 1];
		L3.data[L3.length - i - 1] = temp;
	}//将整个数组逆置
	for (int i = 0; i < L2.length/2; i++) {
		temp = L3.data[i];
		L3.data[i] = L3.data[L2.length - i - 1];
		L3.data[L2.length - i - 1] = temp;
	}//将L2逆置
	for (int i = 0; i < L1.length/2; i++) {
		temp = L3.data[i + L2.length ];
		L3.data[i + L2.length] = L3.data[L1.length - i - 1+L2.length];
		L3.data[L1.length - i - 1 + L2.length] = temp;
	}//将L1逆置
	return true;
}

int binarysearch(Sqlist L, int e) {
	int low = 0, high = L.length - 1, mid = 0;
	mid = (low + high) / 2;
	while (low <= high) {
		while (L.data[mid] > e) {
			high = mid - 1;
			mid = (low + high) / 2;
		}
		while (L.data[mid] < e) {
			low = mid + 1;
			mid = (low + high) / 2;
		}
		if (L.data[mid] == e) {
			return mid;
		}
		else {
			return -1;
		}
	}
}//二分查找
void listinsert(Sqlist& L, int e) {
	int i = 0;
	while( i<L.length) {
		if (L.data[i] <= e) {
			i++;
		}
		else { break; }
	}
	for (int j = L.length - 1; j >= i; j--) {
		L.data[j + 1] = L.data[j];
	}
	L.data[i] = e;
	L.length++;
}//插入函数
bool findandchange(Sqlist &L,int x) {
	int reg,temp;
	reg=binarysearch(L,x);
	if (reg >= 0&&reg<L.length-1) {
		temp = L.data[reg];
		L.data[reg] = L.data[reg + 1];
		L.data[reg + 1] = temp;
		return true;
	}//置换元素
	else if(reg>=0&& reg == L.length - 1) {
		return false;
	}//若查找到的元素在表尾,置错
	else {
		listinsert(L, x);//查找失败,进行插入操作
	}
	return true;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值