计划更新23王道数据结构所有课后代码习题的实现,虽然考试写的一般都是伪代码,但是强迫症的我还是全部实现了一遍,仓库在这里
代码全部是用 C++ 写的,都可以编译运行,包含暴力解和最优解。
持续更新,目前更新进度:
- 线性表 7/14
- …
仅供参考! 会包含一些考试不让写的语法,可能也会有一些错误。
考试直接使用,一般不会让你写出结构体
#define ElemType int
#define MaxSize 50
typedef struct {
ElemType data[MaxSize];
int length;
}SqList;
int del_min(SqList &list) {
if (list.length == 0) {
cout << "Error!" << endl;
return -1;
}
// 1.假设0号元素最小
int min = list.data[0];
int pos = 0;
// 2.循环找出最小元素并记录位置, 从1开始
for (int i = 1; i < list.length; i++) {
if (list.data[i] < min) {
min = list.data[i];
pos = i;
}
}
// 3.删除最小元素并用最后一个元素替换
list.data[pos] = list.data[list.length - 1];
list.length--;
return min;
}
< length/2
,因为如果长度为4或者5,都是循环到下标为1即停,为5的时候最中间的元素(下标为2)不需要移动。void reverse(SqList &list) {
for (int i = 0; i < list.length / 2; i++) {
// 不让用swap()的话,可以定义一个辅助变量来交换
swap(list.data[i], list.data[list.length - 1 - i]);
}
}
void del_x(SqList &list, int x) {
int k = 0;
for (int i = 0 ; i < list.length ; i++) {
// 1.把所有要保存的值都放在前面
if (list.data[i] != x) {
list.data[k++] = list.data[i];
}
}
// 2.直接扔掉后面的元素
list.length = k;
}
// 太麻烦了,不如上一个方法
void del_x_2(SqList &list, int x) {
int i = -1, j = list.length, k = 0;
while (i < j) {
while (list.data[++i] != x);
while (list.data[--j] == x) k++;
if (i < j) {
swap(list.data[i], list.data[j]);
k++;
}
}
list.length -= k;
}
void del_st(SqList &list, int s, int t) {
if (s >= t || list.length == 0) {
cout << "ERROR!" << endl;
return;
}
// 1.要保存的值都放在前面
int k = 0;
for (int i = 0; i < list.length; i++) {
if (list.data[i] < s || list.data[i] > t) {
list.data[k++] = list.data[i];
}
}
// 2.直接扔掉后面的值
list.length = k;
}
>= s
,继续找 >t
的元素while
+ ++
真的非常好用,最好像我这样:先-1然后用前++void del_st2(SqList &list, int s, int t) {
if (s >= t || list.length == 0) {
cout << "ERROR!" << endl;
return;
}
// 1.找到大于等于s的值
int i = -1;
while (list.data[++i] < s);
// 2.如果全部元素均小于s
if (i >= list.length) {
cout << "ERROR!" << endl;
return;
}
// 3.找到大于t的元素
int j = i-1;
while (list.data[++j] <= t);
// 4.前移,直接占住被删元素的位置
while(j < list.length) {
list.data[i++] = list.data[j++];
}
list.length = i;
}
void del_st(SqList &list, int s, int t) {
if (s >= t || list.length == 0) {
cout << "ERROR!" << endl;
return;
}
// 1.要保存的值都放在前面
int k = 0;
for (int i = 0; i < list.length; i++) {
if (list.data[i] < s || list.data[i] > t) {
list.data[k++] = list.data[i];
}
}
// 2.直接扔掉后面的值
list.length = k;
}
void del_same(SqList &list) {
if (list.length == 0) return;
// 1.新开一个数组
SqList copied = list;
copied.data[0] = list.data[0];
// 2.把不同元素存入
int k = 0;
for (int i = 1; i < list.length; i++) {
if (list.data[k] != copied.data[i]) {
copied.data[++k] = list.data[i];
}
}
// 3.新换旧
copied.length = k + 1;
list = copied;
}
void del_same2(SqList &list) {
if (list.length == 0) return;
int k = 0;
for (int i = 1; i < list.length; i++) {
if (list.data[k] != list.data[i]) {
list.data[++k] = list.data[i];
}
}
list.length = k + 1;
}
SqList merge(SqList A, SqList B) {
SqList C;
if (A.length + B.length > MaxSize) {
cout << "ERROR!" << endl;
return C;
}
int i = 0, j = 0, k = 0;
// 1.两两比较,小的存入结果表
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++];
}
// 2.剩下的全部加入结果表,两个循环只会有一个运行
while (i < A.length)
C.data[k++] = A.data[i++];
while (i < B.length)
C.data[k++] = B.data[j++];
// 3.返回结果表
C.length = k;
return C;
}
void merge_sort(int l, int r) {
if (l >= r) return;
int mid = (l+r) >> 1;
merge_sort(l, mid);
merge_sort(mid+1, r);
int k = 0, i = l, j = mid+1;
while (i <= mid && j <= r) {
if (q[i] <= q[j])
tmp[k++] = q[i++];
else
tmp[k++] = q[j++];
}
while (i <= mid)
tmp[k++] = q[i++];
while (j <= r)
tmp[k++] = q[j++];
for (i = l, j = 0; i <= r; i++, j++)
q[i++] = tmp[j++];
}