第二章-线性表算法题 笔记记录
- 1.从顺序表中删除具有最小值的元素(假设唯一)并由函数返回被删元素的值。空出的位置由最后一个元素填补,若顺序表为空,则显示出错信息并退出运行。
- 2. 设计一个高效算法,将顺序表L的所有元素逆置,要求算法的空间复杂度为O(1)。
- 3. 对长度为n的顺序表L,编写一个时间复杂度为O(n)、空间复杂度为 O(1)的算法,该算法删除顺序表中所有值为x的数据元素。
- 4. 从顺序表中删除其值在给定值s和t之间(包含s和t,要求s<t)的所有元素,若s或t不合理或顺序表为空,则显示出错信息并退出运行。
- 5. 从有序顺序表中删除所有其值重复的元素,使表中所有元素的值均不同。
1.从顺序表中删除具有最小值的元素(假设唯一)并由函数返回被删元素的值。空出的位置由最后一个元素填补,若顺序表为空,则显示出错信息并退出运行。
#include <iostream>
#define MAXSIZE 5
typedef struct {int data[MAXSIZE];int length;
} SeqList;
bool deleteMinElement(SeqList &seqList, int &value) {if (seqList.length == 0) {return false;}int pos = 0;int minValue = seqList.data[0];for (int i = 1; i < seqList.length; i++) {if (seqList.data[i] < minValue) {minValue = seqList.data[i];pos = i;}}seqList.data[pos] = seqList.data[seqList.length - 1];value=minValue;seqList.length--;return true;
}int main() {SeqList seqList;seqList.length = 5;srand((unsigned) time(NULL));for (int i = 0; i < seqList.length; i++) {seqList.data[i] = rand() % 100;printf("%d ", seqList.data[i]);}int value=0;if (deleteMinElement(seqList, value)) {printf("\n");for (int i = 0; i < seqList.length; i++) {printf("%d ", seqList.data[i]);}printf("\n");printf("最小值:%d", value);} else {printf("没有最小值\n");}return 0;
}
2. 设计一个高效算法,将顺序表L的所有元素逆置,要求算法的空间复杂度为O(1)。
#include <iostream>
#define MAXSIZE 5
typedef struct {int data[MAXSIZE];int length;
} SeqList;
void invert(SeqList &seqList) {for (int i = 0; i < seqList.length / 2; i++) {int temp = seqList.data[i];seqList.data[i] = seqList.data[seqList.length - 1 - i];seqList.data[seqList.length - 1 - i] = temp;}
}int main() {SeqList seqList;seqList.length = 5;srand((unsigned) time(NULL));for (int i = 0; i < seqList.length; i++) {seqList.data[i] = rand() % 100;printf("%d ", seqList.data[i]);}invert(seqList);printf("\n");for (int i = 0; i < seqList.length; i++) {printf("%d ", seqList.data[i]);}return 0;
}
3. 对长度为n的顺序表L,编写一个时间复杂度为O(n)、空间复杂度为 O(1)的算法,该算法删除顺序表中所有值为x的数据元素。
#include <iostream>
#define MAXSIZE 5
typedef struct {int data[MAXSIZE];int length;
} SeqList;
void deleteX(SeqList &seqList, int x) {int k = 0;for (int i = 0; i < seqList.length; i++) {if (seqList.data[i] != x) {seqList.data[k++] = seqList.data[i];}}seqList.length = k;
}
void deleteX2(SeqList &seqList, int x) {int k = 0, i = 0;;while (i < seqList.length) {if (seqList.data[i] == x) {k++;} else {seqList.data[i - k] = seqList.data[i];}i++;}seqList.length -= k;
}
int main() {SeqList seqList;seqList.length = 5;srand((unsigned) time(NULL));for (int i = 0; i < seqList.length; i++) {seqList.data[i] = rand() % 10;printf("%d ", seqList.data[i]);}deleteX(seqList, 5);printf("\n");for (int i = 0; i < seqList.length; i++) {printf("%d ", seqList.data[i]);}return 0;
}
4. 从顺序表中删除其值在给定值s和t之间(包含s和t,要求s<t)的所有元素,若s或t不合理或顺序表为空,则显示出错信息并退出运行。
#include <iostream>
#define MAXSIZE 5typedef struct {int data[MAXSIZE];int length;
} SeqList;
bool deleteRange(SeqList &seqList, int s, int t) {if (s >= t || seqList.length == 0) {return false;}int k = 0;for (int i = 0; i < seqList.length; i++) {if (seqList.data[i] < s || seqList.data[i] > t) {seqList.data[k++] = seqList.data[i];}}seqList.length = k;return true;
}
bool deleteRange2(SeqList &seqList, int s, int t) {int k = 0, i = 0;if (s >= t || seqList.length == 0) {return false;}for (int i = 0; i < seqList.length; i++) {if (seqList.data[i] >= s && seqList.data[i] <= t) {k++;} else {seqList.data[i - k] = seqList.data[i];}}seqList.length -= k;return true;
}int main() {SeqList seqList;seqList.length = 5;srand((unsigned) time(NULL));for (int i = 0; i < seqList.length; i++) {seqList.data[i] = rand() % 10;printf("%d ", seqList.data[i]);}deleteRange(seqList, 2, 5);printf("\n");for (int i = 0; i < seqList.length; i++) {printf("%d ", seqList.data[i]);}return 0;
}
5. 从有序顺序表中删除所有其值重复的元素,使表中所有元素的值均不同。
#include <iostream>
#define MAXSIZE 50typedef struct {int data[MAXSIZE];int length;
} SeqList;
bool deleteRepeat(SeqList &seqList) {if (seqList.length == 0) {return false;}int k=0;for (int i=1; i < seqList.length; i++) {if (seqList.data[k] != seqList.data[i]) {seqList.data[++k] = seqList.data[i];}}seqList.length = k + 1;return true;
}int main() {SeqList seqList={1, 1, 1, 2, 2, 3, 3, 3, 4, 4};seqList.length = 10;deleteRepeat(seqList);printf("\n");for (int i = 0; i < seqList.length; i++) {printf("%d ", seqList.data[i]);}return 0;
}