王道数据结构课后习题P18(1.5-1.9)

1.5.从顺序表中删除其值在给定值s与t之间,(包含s和t,要求s<t)的所有元素,如果s或t不合理或者顺序表为空则显示出错信息并退出运行
//从前向后扫描顺序表L,用k记下个数,若值不在s到k之间,前移k个位置,否则执行k++
bool del_s_t(SqList &L, ElemType s, ElemType t) {
	int i, k = 0;
	if (i > L.length || s >= t) return false;
	for (i = 0;i < L.length;i++) {
		if (L.data[i] >= s && L.data[i] <= t) //若元素值在s和t之间,记下k的个数
			k++;
		else
			L.data[i - k] == L.data[i]; //否则前移,填补空缺位置
	}
	L.length -= k;
	return true;
}

1.6.从有序顺序表中删除所有其值重复的元素,使表中所有元素的值均不同

//为有序顺序表,所以重复的数字必在相邻位置上
bool Delete_Same(SqList &L) {
	if (L.length == 0)
		return false;
	int i, j; //i存储第一个不相同的元素,j为工作指针
	for (i = 0, j = 1;j < L.length;j++) //查找下一个与上个元素不相同的元素
		if (L.data[i] != L.data[j]) //找到后,则将元素前移
			L.data[++i] = L.data[j];
	L.length = i + 1;
	return true;
}

1.7.将两个有序顺序表合并成一个新的有序顺序表,并由函数返回结果顺序表

//按顺序不断取下顺序表表头较小的结点存入新的顺序表中,那个表还有剩余,将剩下的部分加入到新表后面
bool Merge(SqList A, SqList B, SqList &C) {
	if (A.length + B.length > MaxSize) return false; //大于顺序表的最大长度
	int i = 0, j = 0, k = 0;
	while (i < A.length&&j < B.length) { //循环,两者比较,小的存入结果表
		if (A.data[i] <= B.data[j])
			C.data[k++] = A.data[i++];
		else
			C.data[k++] = B.data[j++];
	}
	while (i < A.length) //剩一个没有比较完的顺序表
		C.data[k++] = A.data[i++];
	while (j < B.length)
		C.data[k++] = B.data[j++];
	C.length = k + 1;
	return true;
}

1.8.已知在一维数组A[m + n]中依次有两个线性表(a1, a2, a3, ..., am),(b1, b2, b3, ..., bn),编写一个函数,将两个顺序表的位置互换,即将(b1, b2, b3, ..., bn)放到(a1, a2, a3, ..., am)的前面

//思路:先将数组整体原地置换,即m与n置换,在对m和n进行内部置换
typedef int DataType;
void Reverse(DataType A[], int left, int right, int arraySize) {
	//将(left, left+1, left+2,...right-2, right-1, right)逆转为(right, right-1, right-2,...left+2, left+1, left)
	if (left >= right || right >= arraySize)
		return;
	int mid = (left + right) / 2;
	for (int i = 0; i <= mid - left; i++) {
		DataType temp = A[left + i];
		A[left + i] = A[right - i];
		A[right - i] = temp;
	}
}

void Exchange(DataType A[], int m, int n, int arraySize) {
	Reverse(A, 0, m + n - 1, arraySize); //换为(bn, bn-1, ..., b2, b1, am, am-1, ..., a2, a2)
	Reverse(A, 0, n - 1, arraySize); //换为(b1, b2, ..., bn-1, bn, am, am-1, ..., a2, a2)
	Reverse(A, n, m + n - 1, arraySize); //换为(b1, b2, ..., bn-1, bn, a1, a2, ..., am-1, am)
}

1.9线性表(a1, a2..an)递增有序请在最少时间在表中查找数值为x的元素,若找到,将其与后继元素交换,若找不到将其插入表中并使表中元素有序

//折半查找
void SearchExchangeInsert(ElemType A[], ElemType x) {
	int n;
	int low = 0, high = n - 1, mid;
	while (low < high) {
		mid = (low + high) / 2; //找中间位置
		if (A[mid] == x) break; //找到x,退出循环
		else if (A[mid] < x) low = mid + 1; //到mid的右半部分查找
		else high = mid - 1; //到mid的左半部分查找
	}
	if (A[mid] == x && mid != n - 1) { //若最后一个元素与x相等,则不存在后继元素
		ElemType t = A[mid];
		A[mid] = A[mid + 1];
		A[mid + 1] = t;
	}
	if (low > high) { //查找失败,插入元素x
		int i;
		for (i = n - 1;i > high;i--) A[i + 1] = A[i];
		A[i + 1] = x;
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_42341986/article/details/80506089
今日推荐