C++ 顺序表删除元素算法优化与解析

本文将分析一段 C++ 代码,该代码用于实现顺序表中删除所有值为 item 的元素。代码中存在一个错误,我们将对其进行修正,并详细解释原因。

代码分析与错误修正

#include<iostream>
#define MAXSIZE 100
using namespace std;
typedef 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) {
    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--;
        }
    }
}

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 函数中,循环条件应该是 i < A.length 而不是 i < A.length - 1。这是因为循环需要遍历整个顺序表,而 A.length - 1 会导致最后一个元素被遗漏。

修正后的代码:

void DeleteItem(SqList& A, int 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,这是因为顺序表长度需要随着元素的删除而减少。

总结

本文分析了 C++ 中顺序表删除元素的算法,并针对代码中存在的错误进行修正。通过分析代码逻辑,我们详细讲解了循环条件的错误,并提供了修正后的代码,同时解释了为什么需要在删除元素后将长度减一。希望本文能帮助读者更好地理解顺序表删除元素算法的实现。

C++ 顺序表删除元素算法优化与解析

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

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