题目目录
下面是22考研王道数据结构书上,课后习题所遇到的代码题,可以字节运行的,哈哈哈做个记录,可能算法不够优秀,一点点更新一点点进步吧,嘻嘻嘻!!
1、从线性表中删除最小元素,并将最后一个值赋值
/**
* 从顺序表中删除具有最小的元素(假设唯一)并由函数返回被删除元素的值,
* 空出的位置由最后一个元素填补,若顺序表为空,则显示出错信息并退出运行
* @return
*/
#include "bits/stdc++.h"
using namespace std;
#define Max 50
struct SqList {
int a[Max]{2, 3, 4, 6, 7, 1, 8, 9};
int length = 8;
};
bool listdelete(SqList &s, int &ele) {
if (s.length == 0) {
return false;
}
int minn = s.a[0];
int flag = 0;
for (int i = 0; i < s.length; ++i) {
if (s.a[i] < minn) {
minn = s.a[i];
flag = i;
}
}
ele = s.a[flag];
s.a[flag] = s.a[s.length - 1];
return true;
}
int main() {
SqList s;
cout << "原先数组" << endl;
for (int i = 0; i < s.length; ++i) {
cout << s.a[i] << " ";
}
cout << endl;
int k = 0;
if (listdelete(s, k)) {
cout << "最小元素k=" << k << endl;
cout << "修改后的线性表为:" << endl;
for (int i = 0; i < s.length; ++i) {
cout << s.a[i] << " ";
}
cout << endl;
} else {
cout << "错误" << endl;
}
return 0;
}
输出结果:
2、逆置线性表
/**
* 逆置线性表,使空间复杂度为 O(1)
* @return
*/
#include "bits/stdc++.h"
using namespace std;
#define Max 50
struct SqList {
int a[Max]{2, 3, 4, 6, 7, 1, 8, 9};
int length = 8;
};
void reverse(SqList &s) {
for (int i = 0; i <s.length / 2; i++) {
int v = s.a[i];
s.a[i] = s.a[s.length - i - 1];
s.a[s.length - i - 1] = v;
}
}
int main() {
SqList s;
cout << "原先数组" << endl;
for (int i = 0; i < s.length; ++i) {
cout << s.a[i] << " ";
}
cout << endl;
reverse(s);
cout << "逆置后数组" << endl;
for (int i = 0; i < s.length; ++i) {
cout << s.a[i] << " ";
}
cout << endl;
return 0;
}
输出结果:
3、删除线性表所有值为x的元素
#include "bits/stdc++.h"
using namespace std;
/**
* 长度为n的顺序表,删除线性表所有值为x的元素,使得时间复杂度为O(n),空间复杂度为O(1)
*/
#define Max 50
struct SqList {
int a[Max]{2, 3, 4, 6, 1, 1, 8, 9};
int length = 8;
};
void deleteList(SqList &L, int x) {
int k = 0;//用来记录总共有几个x
for (int i = 0; i < L.length; ++i) {
if (L.a[i] == x) {
k++;
} else {
L.a[i - k] = L.a[i];
}
}
L.length = L.length - k;
}
int main() {
SqList s;
cout << "原先数组" << endl;
for (int i = 0; i < s.length; ++i) {
cout << s.a[i] << " ";
}
cout << endl;
deleteList(s, 1);
cout << "修改后数组" << endl;
for (int i = 0; i < s.length; ++i) {
cout << s.a[i] << " ";
}
cout << endl;
return 0;
}
输出结果:
4、删除线性表值在s和t之间的元素(包含s和t)
#include "bits/stdc++.h"
using namespace std;
/**
* 删除线性表中值在s与t之间的元素(s<t),s和t不合理或者顺序表为空则显示出错信息并退出运行
*/
#define Max 50
struct SqList {
int a[Max]{1, 2, 3, 4, 4, 4, 6, 7, 8, 9};
int length = 10;
};
bool deleteList(SqList &L, int s, int v) {
if (s >= v || L.length == 0) return false;
//ss是第一个大于s的值的下标
//vv是第一个大于v的值的下标
int ss = 0, vv = 0;
bool flag = false;
for (int i = 0; i < L.length; ++i) {
if (L.a[i] >= s) {
ss = i;
flag = true;
break;
}
}
if (!flag) { return false; }
for (int i = ss; i < L.length; ++i) {
if (L.a[i] > v) {
vv = i;
break;
} else {
vv = L.length;
}
}
int s1 = ss, v1 = vv;
for (int j = vv; j < L.length; j++) {
L.a[ss] = L.a[j];
ss++;
}
L.length = L.length - (v1 - s1);
return true;
}
int main() {
SqList s;
cout << "原先数组" << s.length << endl;
for (int i = 0; i < s.length; ++i) {
cout << s.a[i] << " ";
}
cout << endl;
if (!deleteList(s, 1, 5)) { cout << "错误" << endl; }
cout << "修改后数组" << s.length << endl;
for (int i = 0; i < s.length; ++i) {
cout << s.a[i] << " ";
}
cout << endl;
return 0;
}
运行结果:
5、略
6、从有序表中删除重复元素,使表中所有元素值均不相同
#include "bits/stdc++.h"
using namespace std;
/**
* 删除线性表中值重复的元素
*/
#define Max 50
struct SqList {
int a[Max]{1, 2, 2, 4, 4, 4, 6, 7, 8, 9};
int length = 10;
};
bool deleteRepeat(SqList &L) {
int difCount = 1;//用来记录有几个不同的数字
for (int i = 1; i < L.length; ++i) {
if (L.a[i - 1] != L.a[i]) {
//如果前面一个元素值和当前不同,difCount++
//然后将当前位置的值移动到
L.a[difCount] = L.a[i];
difCount++;
}
}
L.length = difCount;
}
int main() {
SqList s;
cout << "原先数组" << s.length << endl;
for (int i = 0; i < s.length; ++i) {
cout << s.a[i] << " ";
}
cout << endl;
deleteRepeat(s);
cout << "修改后数组" << s.length << endl;
for (int i = 0; i < s.length; ++i) {
cout << s.a[i] << " ";
}
cout << endl;
return 0;
}
运行结果:
7、将两个有序顺序表合并成一个新的有序表,并有函数返回有序顺序表
#include "bits/stdc++.h"
using namespace std;
/**
* 将两个有序顺序表合并成一个新的有序表,并有函数返回有序顺序表
*/
#define Max 20
struct SqList {
int data[Max];
int length;
};
bool mergeList(SqList A, SqList B, SqList &C) {
if (C.length < A.length + B.length) {
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 = A.length + B.length;
return true;
}
int main() {
SqList A = {{2,3,5,5,7}, 5};
SqList B = {{1,3,9}, 3};
SqList s;
s.length =8;
cout << "A数组" << A.length << endl;
for (int i = 0; i < A.length; ++i) {
cout << A.data[i] << " ";
}
cout << endl;
cout << "B数组" << B.length << endl;
for (int i = 0; i < B.length; ++i) {
cout << B.data[i] << " ";
}
cout << endl;
mergeList(A,B,s);
cout << "修改后数组" << s.length << endl;
for (int i = 0; i < s.length; ++i) {
cout << s.data[i] << " ";
}
cout << endl;
return 0;
}
运行结果:
8、将数组中两个顺序表位置互换
#include "bits/stdc++.h"
using namespace std;
/**
* 1、题目:
* 已知在一维数组A[m+n]中一次存放着两个线性表(a1,a2,a3...am),
* (b1,b2,b3...bn),试编写一个函数,将数组中两个顺序表位置互换,即将
* (b1,b2,b3...bn)放在(a1,a2,a3...am)前面。
* 2、思想:
* 123 4567整体逆置————7654 321,然后对前面一半逆置得4567,再对后一半逆置得123
* 即先(0,m+n-1)逆置,然后(0,n-1)逆置,然后(n,m+n-1)逆置
*/
#define Max 20
struct SqList {
int data[Max];
int length;
};
void reverse(SqList &A, int left, int right) {
//0 1 2 3 4 5 逆置,只需要两个元素交换,0和5,1和4,它们加起来的和总是一样
//将i和left+right-i两个数交换,遍历只需要遍历到中间就可以
int temp;
for (int i = left; i <= (left + right) / 2; ++i) {
temp = A.data[i];
A.data[i] = A.data[left + right - i];
A.data[left + right - i] = temp;
}
}
void changeList(SqList &A, int m) {
reverse(A, 0, A.length - 1);
cout << "全部逆置" << endl;
for (int i = 0; i < A.length; ++i) {
cout << A.data[i] << " ";
}
cout << endl;
cout << "逆置第1个到" << m << "个" << endl;
reverse(A, 0, m - 1);
for (int i = 0; i < A.length; ++i) {
cout << A.data[i] << " ";
}
cout << endl;
cout << "逆置第" << m+1<< "到" << A.length << "个" << endl;
reverse(A, m, A.length - 1);
for (int i = 0; i < A.length; ++i) {
cout << A.data[i] << " ";
}
cout << endl;
}
int main() {
SqList A = {{1, 2, 3, 4, 5, 6, 7}, 7};
cout << "A初始化数组" << A.length << endl;
for (int i = 0; i < A.length; ++i) {
cout << A.data[i] << " ";
}
cout << endl;
changeList(A, 3);
cout << "修改后数组" << A.length << endl;
for (int i = 0; i < A.length; ++i) {
cout << A.data[i] << " ";
}
cout << endl;
return 0;
}
运行结果: