顺序表讲解
对长度为n的顺序表L,编写一个时间复杂度为o(n),空间复杂度为o(1)的算法,该算法删除线性表中所有值为x的元素
第一步,为了定义顺序表的数据结构,需要先建立一个结构体。
#define MaxSize 50 // 定义顺序表的最大长度
typedef int ElemType; // 定义顺序表存储的元素类型typedef struct {ElemType data[MaxSize]; // 用于存储顺序表元素的数组int length; // 顺序表当前的长度
} SqList;
解释: 顺序表是一种线性数据结构,我们使用一个固定大小的数组来存储顺序表中的元素。length
字段用来记录顺序表中当前元素的数量。
第二步,为了删除顺序表中所有值为x
的元素,需要编写一个删除函数。
bool Del_Sql_x(SqList &L, ElemType x) {int k = 0; // k用来记录不等于x的元素数量for (int i = 0; i < L.length; i++) {if (L.data[i] != x) { // 如果当前元素不等于xL.data[k] = L.data[i]; // 将该元素移动到前面k++; // 不等于x的元素数量加1}}L.length = k; // 更新顺序表的长度return true; // 返回true表示操作成功
}
解释: 这个函数使用一个遍历顺序表的循环,用一个变量k
来跟踪不等于x
的元素的数量,并将这些元素移动到数组的前面。最后,更新顺序表的长度。
第三步,为了实现算法,需要初始化顺序表,并调用删除函数。
int main() {SqList L;L.length = 10; // 假设顺序表有10个元素// 初始化顺序表的元素for (int i = 0; i < L.length; i++) {printf("Please input L.data[%d]:\n", i);scanf("%d", &L.data[i]);}ElemType x = 2; // 假设我们要删除的元素是2Del_Sql_x(L, x); // 调用删除函数// 打印删除元素后的顺序表printf("The SqList after deleting x is:\n");for (int i = 0; i < L.length; i++) {printf("L.data[%d] = %d\n", i, L.data[i]);}return 0;
}
解释: main
函数是程序的入口点。我们首先初始化顺序表,然后通过用户输入来填充顺序表的元素。接着,我们调用Del_Sql_x
函数来删除所有值为x
的元素,并打印更新后的顺序表。
完整代码:
#include <stdio.h>#define MaxSize 50 // 定义顺序表的最大长度
typedef int ElemType; // 定义顺序表存储的元素类型typedef struct {ElemType data[MaxSize]; // 用于存储顺序表元素的数组int length; // 顺序表当前的长度
} SqList;// 定义删除指定元素的函数
bool Del_Sql_x(SqList &L, ElemType x) {int k = 0; // k用来记录不等于x的元素数量for (int i = 0; i < L.length; i++) {if (L.data[i] != x) { // 如果当前元素不等于xL.data[k] = L.data[i]; // 将该元素移动到前面k++; // 不等于x的元素数量加1}}L.length = k; // 更新顺序表的长度return true; // 返回true表示操作成功
}// 主函数
int main() {SqList L;L.length = 10; // 假设顺序表有10个元素// 初始化顺序表的元素for (int i = 0; i < L.length; i++) {printf("Please input L.data[%d]:\n", i);scanf("%d", &L.data[i]);}ElemType x = 2; // 假设我们要删除的元素是2Del_Sql_x(L, x); // 调用删除函数// 打印删除元素后的顺序表printf("The SqList after deleting x is:\n");for (int i = 0; i < L.length; i++) {printf("L.data[%d] = %d\n", i, L.data[i]);}return 0;
}