Lee_Serena 2024-09-08 10:24 采纳率: 14.3%
浏览 7

顺序表执行了插入删除操作后,最后显示元素,为什么多了一个乱码数字啊



#include "SeqList.h"
using namespace std;

int main() {
    SeqList sqList(100);
    int choice;

    while (true) {//while这个大括号里一定要有一个system pause
        //在每一个case执行后能停一下,不然就菜单刷屏了,以前真的落下太多了
        cout << "-------------请选择:------------\n";
        cout << "1.表创建\n2.插入元素\n3.删除元素\n4.显示所有元素\n5.退出" << endl;

        if (!cin) {
            cin.clear(); // 清除错误状态
            cin.ignore(numeric_limits<streamsize>::max(), '\n'); // 忽略剩余输入
            continue; // 重新开始循环
        }//我的菜单如果前一个选的是1,后面菜单显示就没法选择选项了
        //好像因为@不是数字的原因,导致输入流进入错误状态了

        cin >> choice;
        switch (choice) {
        case 1: {
            cout << "请输入任意个整数(<100,@表示结束)" << endl;

            /*int num;
            while (cin >> num && num != '@') {
                sqList.Insert(sqList.GetSize() + 1, num);
            }*/

            int num;
            while (cin >> num) {
                sqList.Insert(sqList.GetLast() + 2, num);
                if (cin.peek()== '@') {
                    cin.ignore();
                    break;
                }
            }

            break;
        }
        case 2: {
            int i, x;
            cout << "插入整数\n请输入您想插入的位置i(0<=i<=100)" << endl;
            cin >> i;
            cout << "请输入您想插入的整数" << endl;
            cin >> x;
            sqList.Insert(i, x);
            break;
        }
        case 3: {
            cout << "请输入您想删除的元素" << endl;

            int x;
            cin >> x;
            sqList.Remove(x);
            break;
        }
        case 4:
            sqList.Display();
            break;
        case 5:
            return 0;

        }
        system("pause");//等待用户输入
    }


    return 0;
}

//构造函数

SeqList::SeqList(int sz)
{
    //判断是否为有效的容量
    if (sz > 0) {
        maxsize = sz;
        data = new int[maxsize];
        last = -1;
    }
    //内存分配失败,显示错误提示
    if (data == NULL) {
        cout << "error!" << endl;
        exit(1);
    }
}
//插入元素

bool SeqList::Insert(int i, int x)
{//判断插入位置是否有效(i>=1)
    if (i<1 || i>last + 2)//位置不合理
        return false;
    if (last + 1 >= maxsize)//表满
        return false;
    for (int j = last; j >= i-1; j--) {
        data[j + 1] = data[j];
    }
    data[i-1] = x;
    //忘写了
    last++;
    return true;
}

//删除第i个元素

bool SeqList::Delete(int i, int& x)
{
    //表空不能删除
    if (last <= -1)
        return false;
    //不合理的位置,不能删除
    if (i <= 0 || i > last + 1)
        return false;
    for (int j = i; j <= last; j++) {//从前往后,元素前移
        data[j - 1] = data[j];
    }
    //忘写了
    last--;
    return true;
}

//删除多个元素(时间复杂度为o(n^2))

//bool SeqList::Remove(int& x) {
//    for (int i = last; i >= 0; i--) {//必须要从后往前删除,从前往后会导致删除后元素前移,会跳过某些元素
//        if (data[i] == x) {
//            for (int j = i; j < last; j++) {
//                data[j] = data[j + 1];
//            }
//        }
//        last--;
//    }
//    return true;
//}

//按元素值删除多个元素
bool SeqList::Remove(int& x) {
    int* tempo = new int[maxsize];//创建临时数组
    int index = 0;//新数组的下标
    for (int i = 0; i <= last; i++) {
        if (data[i] != x) {
            tempo[index] = data[i];// 将不等于x的元素复制到临时数组
            index++;
        }
    }
    delete[]data;//释放原表内存
    data = tempo;//重新赋值给原表
    last = index;//更新最后一个元素的索引
    return true;
}

//获取第i个元素

bool SeqList::getData(int i, int& x)
{
    //异常处理
    if (i<0 || i>last)
        return false;
    x = data[i];
    return true;
}


int SeqList::Search(int& x)
{
    for (int i = 0; i <= last; i++) {
        if (data[i] == x)
            return i + 1;//若找到,则返回是第几个元素
    }
    //没找到,返回异常值
    return 0;
}

// 获取当前元素数量
int SeqList::GetLast() {
    return last;
}

//显示元素
void SeqList::Display() {
    for (int i = 0; i <= last; i++) {
        cout << data[i] << " ";
    }
    cout << endl;
}
//析构函数没实现,报错 链接错误,我服了

SeqList::~SeqList() {
    delete[] data;
}

img

  • 写回答

1条回答 默认 最新

  • 一轮明月照丘壑 2024-09-08 10:47
    关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    这个问题可能由几个因素引起。当你执行插入和删除操作后显示元素时,出现一个乱码数字可能是由于以下几个原因造成的:

    1. 内存问题:在你的代码中,动态内存分配是基于输入的数组大小(maxsize)进行的。如果程序在某处出现异常(比如用户输入的不是预期的值),可能会引发内存损坏的问题,从而导致显示乱码数字。这可能是由于内存访问越界或者未初始化的内存被访问导致的。
    2. 数据插入和删除的问题:在插入和删除元素时,可能存在逻辑错误或越界访问的问题。特别是在删除元素时,如果逻辑实现不当可能导致表内的元素混乱或内存问题。确保插入和删除操作不会影响到未处理的内存部分或者数组的其余部分。此外,对于删除的数组元素来说,必须确保正确释放内存,否则可能导致未定义的行为。在你的代码中,确保在使用数组之前正确地初始化了所有元素。如果某些元素没有被正确初始化,那么输出时就可能显示随机值。因此请确保数组元素的初始值都已设为有效的默认数值。这样显示时就避免了可能出现随机或无效的数据输出的问题。这也适用于显示函数或类似的其他使用数组的函数调用,如输入输出等涉及到访问数据点的场景。你的程序中使用到数组的静态数据还是动态分配的存储(new 和 delete操作)?特别是内存操作方面的使用是否符合预期的用途和操作方式(是否初始化数据空间,或者对使用的变量和对象执行相应的释放操作等)。这些细节可能会导致你所遇到的问题出现一些预期之外的特性(如错误行为、显示异常值等)。要确保使用指针时对对象有清晰的追踪,保证当指针被赋值后实际内存中有相应有效值的填充操作以避免上述的错误输出。这个问题不仅仅是一个表面的问题而是基于具体的底层操作和交互的实现上发生的不正常的情况需要分析和修复涉及该逻辑错误或者对错误输入处理的错误方面如果你使用的IDE或编译器提供了调试工具(如断点调试等)那么更便于你找出可能出现问题的地方特别是在每次修改和调试程序后可以比较查看当前修改的结果与之前出现的异常情况来确定哪里出了问题这可能是解决问题的最直接有效的办法!这里是你的一些建议和方向以供调试分析时的参考代码,按照此路径可能可以逐步缩小问题的范围直到找到具体的出错点并进行修正希望这些分析可以帮助你解决问题并顺利推进项目的开发进程。至于你说的“链接错误”,这可能是由其他原因引起的,比如编译器找不到析构函数的实现等。你需要检查你的代码是否有语法错误或者遗漏的部分,确保所有的函数都已经正确定义和实现。同时,也要确保你的编译器配置正确,能够正确链接所有的库和依赖项。希望这些建议对你有所帮助!
    评论

报告相同问题?

问题事件

  • 创建了问题 9月8日