王道数据结构线性表课后习题

1.1.从顺序表中删除具有最小值的元素(假设唯一)并由函数返回被删除的元素的值,空出的位置由最后一个元素填补,若顺序表为空则显示出错信息并退出运行 。

bool Del_Min(SqList &L, ElemType &value) {
	if (L.length == NULL)
		return false;
	value = L.data[0]; //假设0号元素的值最小
	int pos = 0;
	for (int i = 1;i < L.length;i++) {
		if (L.data[i] < value) {
			value = L.data[i];
			pos = i;
		}
	}
	L.data[pos] = L.data[L.length - 1]; //空出的位置由最后一个元素填补
	L.length--;
	return true;
}

1.2.设计一个高效的算法,将顺序表的所有元素逆置,要求算法的空间复杂度为O(1)

算法思想:扫描顺序表L的前半部分元素,对于元素L.data[i],将其余后半部分对应元素L.data[L.length-i-1]进行交换。

void Reverse(SqList &L) {
	ElemType temp;
	for (int i = 0;i < L.length;i++) {
		temp = L.data[i];
		L.data[i] = L.data[L.length - i - 1];
		L.data[L.length - i - 1] = temp;
	}
}

1.3长度为n的顺序表L,编写一个时间复杂度为O(n),空间复杂度为O(1)的算法,该算法删除线性表中所有值为x的数据元素

//解法一:用k标记不等于x的元素,将不等于x的元素向前放到k的位置上,修改L的长度
void del_x_1(SqList &L, ElemType x) {
	int k = 0;
	for (int i = 0;i < L.length;i++) {
		if (L.data[i] != x) {
			L.data[k] = L.data[i];
			k++; //用k记录不等于x的元素的个数
		}
	}
	L.length = k; //顺序表长度等于k
}
//解法二:用k记录顺序表中等于x的元素个数,边扫描边统计k,并将不等于k的元素向前移动k个位置。
void del_x_2(SqList &L, ElemType x) {
	int k = 0;
	for (int i = 0;i < L.length;i++) {
		if (L.data[i] == x)
			k++;
		else
			L.data[i - k] = L.data[i]; //当前元素前移k个位置
		i++;
	}
	L.length = L.length - k; //顺序表长度递减
}

1.4. 从有序顺序表中删除其值在给定值s与t之间(要求s<t)的所有元素,如果s或t不合理或者顺序表为空则显示出错信息并退出运行

//先找出>=s的第一个元素,再找出>t的第一个元素,将后面元素前移
bool del_s_t2(SqList &L, ElemType s, ElemType t) {
	int i, j;
	if (i > L.length || s >= t)
		return false;
	for (i = 0; i < L.length&&L.data[i] < s;i++); //寻找>=s的第一个元素
	if (i >= L.length) return false; //所有元素值都小于s则返回
	for (j = i;j <= L.length&&L.data[j] <= t;j++); //寻找>t的第一个元素
	for (;j < L.length;i++,j++) //前移,填补被删除元素位置
		L.data[i] = L.data[j];
	L.length = i + 1;
	return true;
}


猜你喜欢

转载自blog.csdn.net/weixin_42341986/article/details/80505647