删除顺序表中为x的元素,要求时间复杂的为o(n),利用数据结构顺序表的知识写C语言代码
时间: 2024-09-18 18:02:09 浏览: 55
在顺序表中删除特定值(x)的元素,如果允许遍历整个列表,则时间复杂度确实是O(n),因为我们需要找到目标元素的所有实例并将它们替换为最后一个元素,然后将数组长度减一。以下是C语言的一个简单实现:
```c
#include <stdio.h>
#include <stdlib.h> // 包含用于内存管理的头文件
// 定义顺序表结构体
typedef struct {
int* data; // 存储元素的指针
int size; // 数组长度
int capacity; // 数组当前容量
} SequenceList;
// 动态分配和初始化顺序表
SequenceList* init_list() {
SequenceList* list = (SequenceList*) malloc(sizeof(SequenceList));
list->data = NULL;
list->size = 0;
list->capacity = 5; // 初始容量设为5
return list;
}
// 插入元素到列表末尾
void insert(SequenceList* list, int value) {
if (list->size == list->capacity) {
list->capacity *= 2; // 当达到容量上限,翻倍容量
list->data = (int*) realloc(list->data, list->capacity * sizeof(int)); // 扩容
}
list->data[list->size++] = value; // 插入元素并更新大小
}
// 删除所有等于value的元素
void remove_all(SequenceList* list, int value) {
int index = 0;
while (index < list->size) {
if (list->data[index] == value) {
for (int i = index; i < list->size - 1; i++) {
list->data[i] = list->data[i + 1]; // 将后续元素前移
}
list->size--;
} else {
index++;
}
}
}
// 打印列表内容
void print_list(SequenceList* list) {
for (int i = 0; i < list->size; i++) {
printf("%d ", list->data[i]);
}
printf("\n");
}
int main() {
SequenceList* list = init_list();
int n, x;
printf("Enter number of elements to delete and the value to be deleted: ");
scanf("%d %d", &n, &x);
for (int i = 0; i < n; i++) {
int input;
scanf("%d", &input);
insert(list, input);
}
printf("Original List: ");
print_list(list);
remove_all(list, x);
printf("List after deleting all '%d's: ", x);
print_list(list);
free(list->data); // 释放内存
free(list); // 释放结构体本身
return 0;
}
```
这段代码首先创建了一个顺序表,然后插入用户指定数量的目标元素。接着删除所有匹配的元素,最后打印结果。
阅读全文