Lee_Serena 2024-09-17 10:35 采纳率: 14.3%
浏览 10

数据结构 顺序表在所有满足等于x的元素之后插入y



#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()
{
    //按位置插入或按值插入
    cout << "请选择:\n[1]按位置插入\n[2]按值插入\n";
    int choice;
    cin >> choice;

    //按位置插入
    switch (choice) {
    case 1: {
        int x, i;
        cout << "请输入您想插入的数字\n";
        cin >> x;
        cout << "您想插入到哪个位置,请输入位置i \n";
        cin >> i;

        //判断插入位置是否有效(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;
    }

          //按值插入
    case 2: {
        int x, y;
        cout << "请输入您想插入的数字\n";
        cin >> x;
        cout << "您想从哪个数字后插入,请输入数字\n";
        cin >> y;

        cout << "您想进行单插还是多插\n【1】单插【2】多插" << endl;
        int flag;
        cin >> flag;

        int index = 0;
        int count = 0;
        int newSize = 2 * maxsize;//创建临时数组,保存插入后的顺序表
        int* temp = new int[newSize];
        for (int i = 0; i <= last; i++) {
            temp[index++] = data[i];//遍历将原表复制到新表
            if (data[i] == y) {//如果找到指定元素,往后插入
                temp[index++] = x;
                count++;
            }
        }
        delete[]data;
        last = index - 1;
        length = last + 1+count;
        maxsize = newSize;
        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;

    cout << "您想进行单删还是多删\n【1】单删【2】多删" << endl;
    int flag;
    cin >> flag;

    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++;
            if (flag == 1)//单删
                break;
        }
    }
    delete[]data;//释放原表内存
    data = tempo;//重新赋值给原表
    last = index-1;//更新最后一个元素的索引
    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;
}

bool SeqList::InsertLast()
{
    cout << "请输入您想要表中添加的元素\n";
    int num;
    cin >> num;
    data[++last] = num;
    length++;
    return true;
}

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

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

多插有问题,但是找不出来

  • 写回答

1条回答 默认 最新

  • 越重天 新星创作者: Java技术领域 2024-09-17 13:00
    关注

    在你的代码中,多插功能存在一些问题。主要问题在于插入操作后没有正确更新 data 数组,导致插入的元素没有被保存到原始的顺序表中。以下是修正后的代码,并对代码进行了详细的注释说明:

    #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) {  // 顺序表赋值
            data[++last] = num;
    
            if (cin.peek() == '@') {  // 结束符
                cin.ignore();
                break;
            }
        }
        return true;
    }
    
    bool SeqList::Insert()
    {
        // 按位置插入或按值插入
        cout << "请选择:\n[1]按位置插入\n[2]按值插入\n";
        int choice;
        cin >> choice;
    
        // 按位置插入
        switch (choice) {
        case 1: {
            int x, i;
            cout << "请输入您想插入的数字\n";
            cin >> x;
            cout << "您想插入到哪个位置,请输入位置i \n";
            cin >> i;
    
            // 判断插入位置是否有效(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;
        }
    
        // 按值插入
        case 2: {
            int x, y;
            cout << "请输入您想插入的数字\n";
            cin >> x;
            cout << "您想从哪个数字后插入,请输入数字\n";
            cin >> y;
    
            cout << "您想进行单插还是多插\n【1】单插【2】多插" << endl;
            int flag;
            cin >> flag;
    
            int index = 0;
            int count = 0;
            int newSize = 2 * maxsize;  // 创建临时数组,保存插入后的顺序表
            int* temp = new int[newSize];
            for (int i = 0; i <= last; i++) {
                temp[index++] = data[i];  // 遍历将原表复制到新表
                if (data[i] == y) {  // 如果找到指定元素,往后插入
                    temp[index++] = x;
                    count++;
                    if (flag == 1)  // 单插
                        break;
                }
            }
    
            // 更新 data 数组
            delete[] data;
            data = temp;
            last = index - 1;
            maxsize = newSize;
            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;
    }
    
    // 按元素值删除多个元素
    bool SeqList::Remove()
    {
        cout << "请输入您想删除的元素" << endl;
        int x;
        cin >> x;
    
        cout << "您想进行单删还是多删\n【1】单删【2】多删" << endl;
        int flag;
        cin >> flag;
    
        int* tempo = new int[maxsize];  // 创建临时数组
        int index = 0;  // 新数组的下标
        for (int i = 0; i <= last; i++) {
            if (data[i] != x) {
                tempo[index++] = data[i];  // 将不等于x的元素复制到临时数组
                if (flag == 1)  // 单删
                    break;
            }
        }
        delete[] data;  // 释放原表内存
        data = tempo;  // 重新赋值给原表
        last = index - 1;  // 更新最后一个元素的索引
        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;
    }
    
    bool SeqList::InsertLast()
    {
        cout << "请输入您想要表中添加的元素\n";
        int num;
        cin >> num;
        data[++last] = num;
        length++;
        return true;
    }
    
    // 显示元素
    void SeqList::Display() {
        for (int i = 0; i <= last; i++) {
            cout << data[i] << " ";
        }
        cout << endl;
    }
    
    // 析构函数
    SeqList::~SeqList() {
        delete[] data;
    }
    

    主要修正点:

    1. 插入操作后的更新

      • Insert 函数中,当进行多插操作时,插入操作完成后需要将临时数组 temp 赋值给原始数组 data,并更新 lastmaxsize
    2. 删除操作后的更新

      • Remove 函数中,删除操作完成后需要将临时数组 tempo 赋值给原始数组 data,并更新 last
    3. 显示元素

      • Display 函数中,增加了换行符 endl,以便输出更清晰。

    通过这些修正,你的代码应该能够正确地进行多插操作,并在插入后正确显示顺序表的内容。

    评论

报告相同问题?

问题事件

  • 创建了问题 9月17日