Lee_Serena 2024-09-15 16:07 采纳率: 14.3%
浏览 4

c++顺序表的基本操作


#include"SeqList.h"
using namespace std;

//创建链表
bool SeqList::Init()
{
    maxsize = 100;  last = -1;
    data = new int[maxsize];       //创建顺序表存储数组
    if (data == NULL) {        //动态分配失败
        cerr << "存储分配错误!" << endl;
        exit(1);
    }
    cout << "请输入任意个整数(<100,@表示结束)" << endl;

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

    int num;
    while (cin >> num) {//顺序表赋值
        data[++last] = num;
    
        if (cin.peek() == '@') {//结束符
            cin.ignore();
            break;
        }
    }
    return true;
}


bool SeqList::Insert()
{
    int i, x;
    cout << "插入整数\n请输入您想插入的位置i(0<=i<=100)" << endl;
    cin >> i;
    cout << "请输入您想插入的整数" << endl;
    cin >> 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()
{
    cout << "请输入您想删除的元素" << endl;

    int x;
    cin >> 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 << "h"<<endl;
}
//析构函数没实现,报错 链接错误,我服了

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

第一个问题:创建表之后,每次第一个元素都没有。刚刚运行了一下,突然又可以了。什么鬼啊
第二个问题:

img


数组执行删除之后输出,会出现一个乱码。

  • 写回答

1条回答 默认 最新

  • 乔没乔见Joe 2024-09-15 16:36
    关注

    1. 创建表之后第一个元素缺失

    如果你的第一个元素有时缺失,可能是由于输入处理不当。在 Init 函数中,你使用了以下代码:

    while (cin >> num) {
        data[++last] = num;
        if (cin.peek() == '@') {
            cin.ignore();
            break;
        }
    }
    

    这种方法在输入流中没有有效整数时可能会导致意外行为。建议在读取输入时先检查是否遇到 @ 字符,或者使用其他方法处理输入。例如:

    int num;
    while (true) {
        cin >> num;
        if (cin.fail()) { // 如果输入不是整数
            char ch = cin.get();
            if (ch == '@') break; // 遇到'@'结束输入
            cin.clear(); // 清除错误状态
            cin.ignore(numeric_limits<streamsize>::max(), '\n'); // 忽略错误输入
            continue;
        }
        data[++last] = num; // 存储有效整数
    }
    

    2. 删除后输出乱码

    删除元素后出现乱码可能是因为数组大小和 last 索引管理不当。在你的 Delete 函数中,确保在元素移动后正确更新 last 索引:

    bool SeqList::Delete(int i, int& x) {
        if (last < 0) // 检查列表是否为空
            return false;
        if (i < 1 || i > last + 1) // 检查位置是否有效
            return false;
    
        x = data[i - 1]; // 存储要返回的值
        for (int j = i; j <= last; j++) { // 元素左移
            data[j - 1] = data[j];
        }
        last--; // 更新最后一个元素的索引
        return true;
    }
    

    其他建议

    • 内存管理:确保始终释放动态分配的内存,以避免内存泄漏。
    • 输入验证:始终验证用户输入,以处理意外情况。
    • 调试:使用打印语句或调试工具跟踪变量值和程序流程,尤其是在进行删除等操作后。
    评论

报告相同问题?

问题事件

  • 创建了问题 9月15日