已知长度为n的线性表L采用顺序存储结构 (定义如下),编写一个时间复杂度为O(n)、空间复杂度为O(1)的算法,该算法删除线性表中所有值为x的数据元素。 typedef structi ElemType *elem; int length; }SqList;用c语言写
时间: 2024-09-17 18:04:28 浏览: 58
数据结构课后习题2.doc
5星 · 资源好评率100%
为了删除线性表 L 中所有值为 x 的数据元素,我们可以遍历整个列表,每当遇到值为 x 的元素时,就跳过它并将指针向后移动一位。由于我们只需要遍历一次,并不需要额外的空间,所以这个算法的时间复杂度是 O(n),空间复杂度是 O(1)。
以下是用 C 语言实现的示例:
```c
#include <stdio.h>
#include <stdlib.h>
void deleteX(SqList* L, int x) {
if (L == NULL || L->length == 0) return; // 如果列表为空直接返回
elem_t* current = L->elem; // 初始化当前元素指针
while (current != NULL) { // 遍历直到链表结束
if (*current != x) { // 如果不是 x,则将当前元素移到下一个位置
*current = *(current + 1); // 移动元素
}
current++; // 指针向前移动
if (*current == NULL) break; // 当前元素已经是最后一个时跳出循环
}
L->length--; // 更新列表长度,因为最后可能有一个空槽
}
// 示例
int main() {
SqList L = { .elem = malloc(sizeof(elem_t) * 5), .length = 5 };
// 初始化列表...
L.elem[0] = 5;
L.elem[1] = x; // 要删除的值
L.elem[2] = 3;
L.elem[3] = x;
L.elem[4] = 7;
deleteX(&L, x);
for (int i = 0; i < L.length; i++) {
printf("新的列表元素 %d, ", L.elem[i]);
}
free(L.elem); // 别忘了释放内存
return 0;
}
阅读全文