2022王道数据结构——第二章线性表代码

2.2顺序表的顺序表示——代码(课后习题)

使用的数据结构

typedef struct {
	int* data;
	int length, MaxSize;
}sqList;

4.有序顺序表中删除其值在给定值s与t之间(包含s,t)的所有元素,若不合理(st)或表为空显示出错并退出

bool Del_s_t2(SqList& L, int s, int t) {
	if (s >= t||L.length==0)return 0;

	int temp = 0;
	for (int i = 0; i < L.length; i++) {
		if (L.data[i] <= s || L.data[i] >= t)
			L.data[temp++] = L.data[i];
	}
	L.length = temp;
	return 0;
}

5.顺序表中删除其值在给定值s与t之间(包含s,t)的所有元素,若不合理(st)或表为空显示出错并退出

bool Del_s_t(SqList& L, int s, int t) {
	if (s >= t || L.length == 0)return 0;
	int move = 0;
	for (int i = 0; i < L.length; i++) {
		if (L.data[i]<s || L.data[i]>t)
			L.data[i - move] = L.data[i];
		else move++;
	}
	L.length -= move;
	return true;
}

6.有序顺序表中删除删除所有其值重复的元素

bool Delete_Same(SqList& L) {
	if (L.length == 0)return false;
	int move = 0;
	for (int i = 1; i < L.length; i++) {
		if (L.data[i] != L.data[i - 1])
			L.data[i-move] = L.data[i];
		else move++;
	}
	L.length -= move;
	return true;
}

标准代码

bool Delete_Same(SqList& L) {
	if (L.length == 0)return false;
	int 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;
}

7.两个有序顺序表合并一个新的有序顺序表,函数返回结果顺序表

bool Merge(SqList A, SqList B, SqList& C) {
	if (A.length+B.length>C.MaxSize)
		return false;
	C.data = (int*)malloc(sizeof(A.length + B.length));
	C.length = A.length + B.length;
	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++];
	return true;
}

8.一维数组里两个线性表,A【m+n】,互换位置

void Reverse(int A[], int left, int right, int arraySize) {
	int exchange;
	for (int i = left; i <(left+right+1)/2 ; i++) {
		exchange = A[i];
		A[i] = A[left+right-i];
		A[left + right - i] = exchange;
	}
}
void Exchange(int A[], int m, int n, int arraySize) {
	//0到m-1  m到m+n-1
	Reverse(A, 0, m + n - 1, arraySize);
	Reverse(A, 0, n - 1, arraySize);
	Reverse(A, n, m + n - 1, arraySize);
}

书中的代码(reverse函数不同,个人感觉书中的不太好理解)

void Reverse(int A[], int left, int right, int arraySize) {
	int mid = (left + right) / 2;
	for (int i = 0; i <= mid - left; i++) {
		int exchange = A[left+i];
		A[left+i] = A[ right - i];
		A[ right - i] = exchange;
	}
}
void Exchange(int A[], int m, int n, int arraySize) {
	//0到m-1  m到m+n-1
	Reverse(A, 0, m + n - 1, arraySize);
	Reverse(A, 0, n - 1, arraySize);
	Reverse(A, n, m + n - 1, arraySize);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值