C++ 顺序表删除元素逻辑错误修复 - 代码示例与分析
C++ 顺序表删除元素逻辑错误修复 - 代码示例与分析
这段代码演示了如何使用C++实现顺序表删除元素的功能。代码本身没有语法错误,但存在逻辑错误。原代码只删除了第一个值为'item'的元素,而没有删除所有值为'item'的元素。
问题分析
原代码中,当找到一个值为'item'的元素后,只进行了一次循环,将后面的元素往前移动一个位置,并减小顺序表的长度。因此,只删除了第一个值为'item'的元素,后续相同的元素并未被删除。
修复方案
为了删除所有值为'item'的元素,需要对代码进行如下修改:
- 使用一个变量'k'记录当前找到的第一个值为'item'的元素的下标。
- 从这个下标开始,将后面的元素依次往前移动一个位置。
- 将顺序表长度减1。
- 继续查找,直到没有值为'item'的元素为止。
代码示例
#include <iostream>
#define MAXSIZE 100
using namespace std;
tydedef struct {
int* elem; //存储空间的基地址
int length; //当前长度
} SqList;
void InitList_Sq(SqList& L, int n) {
//构造顺序表
L.elem = new int[MAXSIZE]; //为顺序表分配一个大小为MAXSIZE的数组空间
L.length = n; //空表长度为0
}
void DeleteItem(SqList& A, int item) {
/**************begin************/
//删除顺序表A中所有值为item的元素
int k = 0;
for (int i = 0; i < A.length; i++) {
if (A.elem[i] == item) {
k = i;
do {
A.elem[k] = A.elem[k + 1];
k++;
} while (k < A.length - 1);
A.length = A.length - 1;
i--; // 继续从当前位置查找
}
}
/**************end************/
}
void PrintA(SqList A) {//输出数组元素
for (int i = 0; i < A.length - 1; i++)
cout << A.elem[i] << ' ';
cout << A.elem[A.length - 1] << endl;
}
int main() {
int n;
while (cin >> n) {
if (n == 0) break;
SqList A;
InitList_Sq(A, n);
for (int i = 0; i < n; i++)
cin >> A.elem[i];
int item;
cin >> item;
DeleteItem(A, item);
PrintA(A);
}
return 0;
}
代码说明
- 在
DeleteItem函数中,循环遍历顺序表,找到值为'item'的元素后,使用'do-while'循环将后面的元素依次往前移动一个位置,并将顺序表长度减1。 - 在删除一个值为'item'的元素后,将循环变量'i'减1,以便继续从当前位置查找。
总结
本文分析了C++顺序表删除元素代码中存在的逻辑错误,并提供了详细的修复方案,并附带了示例代码帮助理解。在编写代码时,要仔细检查逻辑,确保代码的正确性和完整性。
原文地址: https://www.cveoy.top/t/topic/mNCA 著作权归作者所有。请勿转载和采集!