已知长度为 n 的线性表 A 采用顺序存储结构,请写一时间复杂度为 O(n) 、空间复 杂度为 O(1) 的算法,该算法删除线性表中所有值为 item 的数据元素。用c++语言写
时间: 2024-10-07 19:02:39 浏览: 29
在C++中,我们可以编写一个简单的循环遍历算法来删除线性表A中所有值为`item`的数据元素。这个算法会逐个检查元素并移除它,直到列表结束。由于需要遍历整个列表,所以时间复杂度为O(n),因为我们只做一次遍历。空间复杂度为O(1),因为我们不需要额外的空间,除了可能的临时变量。
```cpp
#include <iostream>
// 假设线性表A是一个整数数组,size表示当前元素数量
void deleteItems(int A[], int size, int item) {
// 初始索引,用于记录下标位置
int index = 0;
for (int i = 0; i < size; ++i) {
// 如果当前元素不是item,则将其移动到剩余部分
if (A[i] != item) {
A[index++] = A[i]; // 将元素复制到新位置
}
}
// 调整大小以移除已处理的元素
size = index;
// 为了安全起见,可以在这里手动释放多余的空间,但这通常由容器自动完成
// A.resize(size); // 如果A是动态数组
// 输出新的大小,但实际应用中这一步可以省略
std::cout << "After deletion, the list has " << size << " elements." << std::endl;
}
int main() {
int n;
std::cout << "Enter the length of the list: ";
std::cin >> n;
int* A = new int[n]; // 假设已经初始化了数组
std::cout << "Enter the elements and their value to delete (type 'end' to finish): ";
for (int i = 0; i < n; ++i) {
std::cin >> A[i];
if (std::cin.peek() == 'e') { // 检查下一个输入是否为'e'
std::cin.get(); // 避免读取空格或换行符
break;
}
}
int item;
std::cout << "Enter the value to delete: ";
std::cin >> item;
deleteItems(A, n, item);
delete[] A; // 释放内存
return 0;
}
```
阅读全文