跟着我老婆学的欸嘿嘿嘿嘿 b站搜金可鱼哟
线性表
01
从顺序表中删除具有最小值的元素(假设唯一)并由函数返回被删元素的值。空出的位
置由最后一个元素填补,若顺序表为空,则显示出错信息并退出运行。
算法思想:假设第0 个位置的元素是最小的,设其为min 下标为flag,依次遍历,若有比一个小的元素将其赋值给min
#include <stdio.h>
typedef int ElemType;
#define MaxSize 50
typedef struct SqList
{
ElemType data[MaxSize] = {2, 3, 4, 6, 7, 1, 8, 9};
int length = 8;
} SqList;
bool move(SqList &L, int &e)
{
if (L.length == 0) {
return false;
}
int min = L.data[0];
int flag = 0;
for (int i = 1; i < L.length; i++) {
if (L.data[i] < min) {
min = L.data[i];
flag = i;
}
}
e = L.data[flag];
L.data[flag] = L.data[L.length - 1];
return true;
}
int main() {
SqList L;
printf("original list: ");
for (int i = 0; i < L.length; i++) {
printf("%d ", L.data[i]);
}
printf("\n");
int e;
if (move(L, e)) {
printf("min value: %d\n", e);
printf("result list: ");
for (int i = 0; i < L.length; i++) {
printf("%d ", L.data[i]);
}
printf("\n");
} else {
printf("empty list\n");
}
return 0;
}
02
设计一个高效算法,将顺序表L的所有元素逆置,要求算法的空间复杂度为 O(1)
#include <stdio.h>
#define MaxSize 50
typedef int ElemType;
typedef struct {
ElemType data[MaxSize];
int length;
} SqList;
void move(SqList& L)
{
ElemType temp;
for (int i = 0; i < L.length / 2; i++)
{
temp = L.data[i];
L.data[i] = L.data[L.length - i - 1];
L.data[L.length - i - 1] = temp;
}
}
int main()
{
SqList L;
L.length = 6;
L.data[0] = 1;
L.data[1] = 2;
L.data[2] = 3;
L.data[3] = 6;
L.data[4] = 5;
L.data[5] = 4;
printf("Original Array: ");
for (int i = 0; i < L.length; i++)
{
printf("%d ", L.data[i]);
}
printf("\n");
move(L);
printf("Reversed Array: ");
for (int i = 0; i < L.length; i++)
{
printf("%d ", L.data[i]);
}
printf("\n");
return 0;
}
03
对长度为”的顺序表L,编写一个时间复杂度为 O(m)、空间复泰度为 O()的算法,该算
法删除线性表中所有值为x的数据元素。
算法思想:设置一个k用来记录,x的个数,例如:本代码中的 第一个1是data[2],k = 1 那么data[3]就往前挪一个位置(删除:将其覆盖)。第二个1是data[5],k = 2 ,data[6]往前挪两个位置
总结规律:a[i-k] = a[i] L.length = n-k
#include <stdio.h>
#define MaxSize 50
typedef int ElemType;
typedef struct
{
ElemType data[MaxSize] = {5,2,0,1,3,1,4,1,1,4};
int length = 10;
} SqList;
void Reverse(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];
}
L.length = L.length - k;
}
int main()
{
SqList L;
ElemType x = 1;
printf("Original Array: ");
for (int i = 0; i < L.length; i++)
{
printf("%d ", L.data[i]);
}
printf("\n");
Reverse(L, x);
printf("Modified Array: ");
for (int i = 0; i < L.length; i++)
{
printf("%d ", L.data[i]);
}
printf("\n");
return 0;
}
04
从序顺序表中删除其值在给定值,与1之间(要求s<)的所有元素,若s或t不合理
或顺序表为空,则显示出错信息并退出运行。
#include <stdio.h>
#define MaxSize 50
typedef int ElemType;
typedef struct
{
ElemType data[MaxSize] = {1, 2, 3, 3, 4, 5, 6, 7, 7, 7, 8, 9}; // 原有数列数据
int length; // 原有数列实际长度
} SqList;
/**
* 删除有序顺序表 *L 中在给定值 s 与 t 之间的所有元素。
* 删除成功返回 true,否则返回 false。
*/
bool Del(SqList *L, ElemType s, ElemType t)
{
int i, j; // 定义循环移位起始下标
// 无需删除
if (s >= t || L->length == 0)
return false;
// 寻找第一个需删除的元素
for (i = 0; i < L->length && L->data[i] < s; i++);
// 所有元素值均小于 s,无需删除
if (i >= L->length)
return false;
// 寻找第一个大于 t 的元素
for (j = i; j < L->length && L->data[j] <= t; j++);
// 数组前移,填补被删元素位置
for (; j < L->length; i++, j++)
L->data[i] = L->data[j];
L->length = i; // 数组长度更新为实际元素个数
return true;
}
int main()
{
SqList L;
L.length = 12;
ElemType s, t;
printf("Enter the range to delete (elements between s and t will be deleted):\n");
scanf("%d %d", &s, &t);
if (Del(&L, s, t))
{
printf("The updated sequence list: ");
for (int i = 0; i < L.length; i++)
printf("%d ", L.data[i]);
printf("\n");
}
else
{
printf("Deletion failed\n");
}
return 0;
}
05
从顺序表中删除其值在给定值,与1之间 (包含s和1,要求s<1)的所有元素,若s或
r不合理或顺序表为空,则显示出错信息并退出运行。
#include <stdio.h>
#include <stdbool.h> // 引入stdbool.h头文件用于定义bool类型及相应的true和false值
#define MaxSize 50 // 定义SqList的最大长度
typedef int ElemType;
typedef struct {
ElemType data[MaxSize]; // 存储数据的数组
int length; // 数组中实际存储的元素个数
} SqList;
bool move(SqList &L, ElemType s, ElemType t) // 删除SqList中符合某一区间的元素。函数返回值为bool类型,表示是否删除成功。
{
int k = 0; // 用于存储满足删除条件的元素的个数,初始值为0。
if (L.length == 0 || s >= t)
return false; // 若SqList长度为0或者s大于等于t,则无法删除,函数返回false。
for (int i = 0; i < L.length; i++) { // 遍历SqList中的元素。
if (L.data[i] >= s && L.data[i] <= t) // 若当前元素的值在区间内,则需要删除该元素。
k++; // 记录当前需要删除的元素的个数。
else
L.data[i - k] = L.data[i]; // 若不需要删除,将当前元素向前移k位(即将需要删除的元素剔除)。
}
L.length -= k; // 更新SqList的长度,即使删除后SqList的长度变为原来的长度k。
return true; // 删除成功,函数返回true。
}
int main() {
SqList L = { {3, 4, 1, 2, 6, 7}, 6 }; // 定义一个SqList并初始化。
ElemType s, t;
printf("Initial array: ");
for (int i = 0; i < L.length; i++) { // 输出SqList中的初始元素。
printf("%d ", L.data[i]);
}
printf("\n");
printf("Enter the lower and upper bound of the interval (separated by a space): ");
scanf("%d %d", &s, &t); // 读入需要删除的区间。
if (move(L, s, t)) { // 若删除成功,输出删除区间后的元素。
printf("Array after deleting elements in the interval [%d, %d]: ", s, t);
for (int i = 0; i < L.length; i++) {
printf("%d ", L.data[i]);
}
printf("\n");
}
else { // 若删除失败,输出相应的信息。
printf("Unable to delete elements in the interval [%d, %d]\n", s, t);
}
return 0;
}
06
从有序顺序表中删除所有其值重复的元素,使表中所有元素的值均不同。
#include <stdio.h>
#define MaxSize 50
typedef int ElemType;
typedef struct {
ElemType data[MaxSize];
int length ;
}SqList;
bool move(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;
}
int main() {
SqList L;
// 输入数组长度
printf("Enter the length of the array: ");
scanf("%d", &L.length);
// 输入数组元素
printf("Enter the elements of the array: ");
for (int i = 0; i < L.length; i++) {
scanf("%d", &L.data[i]);
}
printf("Original array: ");
for (int i = 0; i < L.length; i++) {
printf("%d ", L.data[i]);
}
printf("\n");
if (move(L)) {
printf("Array after removing duplicates: ");
for (int i = 0; i < L.length; i++) {
printf("%d ", L.data[i]);
}
printf("\n");
} else {
printf("Failed to remove duplicates.\n");
}
return 0;
}
07
将两个有序顺序表合并为一个新的有序顺序表,并由函数返回结果顺序表。
#include <stdio.h>
#define MaxSize 50
typedef int ElemType;
typedef struct {
ElemType data[MaxSize];
int length;
} SqList;
bool merge(SqList A, SqList B, SqList &C)
{
if (A.length + B.length > C.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 = k;
return true;
}
int main() {
SqList A;
SqList B;
SqList C;
// Initialize list A
A.data[0] = 1;
A.data[1] = 3;
A.data[2] = 5;
A.length = 3;
// Initialize list B
B.data[0] = 2;
B.data[1] = 4;
B.length = 2;
// Initialize list C
C.length = A.length + B.length;
// Merge lists A and B into C
if (merge(A, B, C))
{
printf("Merge successful. The merged list C is:");
for (int i = 0; i < C.length; i++)
{
printf("%d ", C.data[i]);
}
printf("\n");
}
else
{
printf("Merge failed. The merged list C would exceed the maximum capacity.\n");
}
return 0;
}