C++ 顺序表删除元素逻辑错误修复 - 代码示例与分析

这段代码演示了如何使用C++实现顺序表删除元素的功能。代码本身没有语法错误,但存在逻辑错误。原代码只删除了第一个值为'item'的元素,而没有删除所有值为'item'的元素。

问题分析

原代码中,当找到一个值为'item'的元素后,只进行了一次循环,将后面的元素往前移动一个位置,并减小顺序表的长度。因此,只删除了第一个值为'item'的元素,后续相同的元素并未被删除。

修复方案

为了删除所有值为'item'的元素,需要对代码进行如下修改:

  1. 使用一个变量'k'记录当前找到的第一个值为'item'的元素的下标。
  2. 从这个下标开始,将后面的元素依次往前移动一个位置。
  3. 将顺序表长度减1。
  4. 继续查找,直到没有值为'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;
}

代码说明

  1. DeleteItem 函数中,循环遍历顺序表,找到值为'item'的元素后,使用'do-while'循环将后面的元素依次往前移动一个位置,并将顺序表长度减1。
  2. 在删除一个值为'item'的元素后,将循环变量'i'减1,以便继续从当前位置查找。

总结

本文分析了C++顺序表删除元素代码中存在的逻辑错误,并提供了详细的修复方案,并附带了示例代码帮助理解。在编写代码时,要仔细检查逻辑,确保代码的正确性和完整性。

C++ 顺序表删除元素逻辑错误修复 - 代码示例与分析

原文地址: https://www.cveoy.top/t/topic/mNCA 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录