C语言顺序表实现:删除首元素、尾部插入、高效删除指定值元素
以下是使用 C 语言定义并实现一个长度为 n 的顺序表 L,并完成您提出的要求:
#include <stdio.h>
#include <stdbool.h>
#define MAX_SIZE 100 // 定义顺序表的最大长度
typedef struct {
int data[MAX_SIZE]; // 存储数据的数组
int length; // 当前顺序表的长度
} SeqList;
// 初始化顺序表
void InitList(SeqList* L) {
L->length = 0;
}
// 删除顺序表中的第一个元素
bool DeleteFirstElement(SeqList* L) {
if (L->length == 0) {
printf("顺序表为空,无法删除元素\n");
return false;
}
for (int i = 0; i < L->length - 1; i++) {
L->data[i] = L->data[i + 1];
}
L->length--;
return true;
}
// 在顺序表末尾插入元素
bool InsertAtEnd(SeqList* L, int item) {
if (L->length >= MAX_SIZE) {
printf("顺序表已满,无法插入新元素\n");
return false;
}
L->data[L->length] = item;
L->length++;
return true;
}
// 删除顺序表中所有值为item的数据元素
void DeleteAllElements(SeqList* L, int item) {
int count = 0; // 记录删除的元素个数
for (int i = 0; i < L->length; i++) {
if (L->data[i] == item) {
count++;
} else {
L->data[i - count] = L->data[i];
}
}
L->length -= count;
}
int main() {
int n = 10; // 定义顺序表长度为10
SeqList L;
InitList(&L); // 初始化顺序表
// 向顺序表中插入一些元素(示例)
for (int i = 1; i <= n; i++) {
L.data[L.length] = i * 10;
L.length++;
}
// 删除顺序表中的第一个元素
DeleteFirstElement(&L);
// 在顺序表末尾插入元素
int item = 100;
InsertAtEnd(&L, item);
// 输出删除第一个元素并插入新元素后的顺序表
for (int i = 0; i < L.length; i++) {
printf("%d ", L.data[i]);
}
printf("\n");
// 删除顺序表中所有值为item的数据元素
DeleteAllElements(&L, item);
// 输出删除元素后的顺序表
for (int i = 0; i < L.length; i++) {
printf("%d ", L.data[i]);
}
printf("\n");
return 0;
}
上述代码中,首先定义了一个SeqList结构体,其中包含一个整型数组data用于存储数据,以及一个整型变量length表示当前顺序表的长度。通过InitList函数进行初始化,然后使用DeleteFirstElement函数删除顺序表中的第一个元素,使用InsertAtEnd函数在顺序表末尾插入元素。最后,使用DeleteAllElements函数删除顺序表中所有值为item的数据元素。
请注意,删除所有值为item的数据元素的算法是使用了时间复杂度为O(n),空间复杂度为O(1)的算法实现的。该算法通过遍历顺序表并记录需要删除的元素个数,然后在同一次遍历中,将不需要删除的元素向前移动至正确的位置。这样可以在一次遍历中完成删除操作,达到了时间复杂度为O(n),并且使用了常量级的额外空间。
注意,在实际应用中,可能需要根据具体需求进行适当的修改。
原文地址: http://www.cveoy.top/t/topic/oyi 著作权归作者所有。请勿转载和采集!