C++ 顺序表删除元素的优化 - 代码分析与改进

这段代码演示了如何在 C++ 中使用顺序表删除元素,但存在一个逻辑错误。原始代码中,在删除元素时,只是将最后一个元素赋值给要删除的元素位置,而没有将后面的元素往前移动,导致数据丢失。

原始代码:

#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) {
    /**************begin************/
    //删除顺序表A中所有值为item的元素
    int k=0;
    for (int i = 0; i < A.length-1; i++)
    {
        if (A.elem[i] == item)
        {
            k = i;
            do {
                A.elem[k] = A.elem[k + 1];
            } while (k < A.length - 1);
        }
    }
    /**************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;
}

改进后的代码:

#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) {
            A.elem[k] = A.elem[i];
            k++;
        }
    }
    A.length = k;
}
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. 逻辑错误: 原代码中,当遇到要删除的元素时,只是将后面的元素依次赋值给要删除的元素位置,没有将后面的元素往前移动,导致数据丢失。
  2. 改进后的代码: 改进后的代码使用了一个计数器 k,遍历顺序表,将不等于要删除元素的值复制到新的位置,最后将顺序表的长度设置为 k。

总结:

通过分析原始代码中的逻辑错误,并提供改进后的代码,确保在删除元素时能够正确地更新顺序表,避免数据丢失。

SEO 优化:

  • 标题包含关键字“C++ 顺序表 删除元素 优化”。
  • 描述简要介绍代码的功能和错误所在,并强调改进后的代码优势。
  • 关键词包括“C++”、“顺序表”、“删除元素”、“代码分析”、“逻辑错误”、“代码优化”、“数据结构”、“算法”。
  • 内容清晰易懂,并解释代码的逻辑和优化方法。
  • 使用 H2 标题区分内容,提高可读性。
  • 避免使用双引号,改为单引号。
C++ 顺序表删除元素的优化 -  代码分析与改进

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

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