jarahard 2024-05-17 11:07 采纳率: 0%
浏览 3

关于#c++#的问题,请各位专家解答!(相关搜索:顺序表)

#初学顺序表,自己做的顺序表的动态插入代码,能成功运行,但是有debug,怎么调试都不对,望解答


```c++
#include<iostream>
#include<cstdlib>

using namespace std;

int const bigsize = 5;

typedef struct
{
    int* data;
    int maxsize;
    int length;
}Sqlist;

void InitList(Sqlist& L);//初始化表
void IncreaseList(Sqlist& L, int len);//添加表的长度
bool ListInsert(Sqlist& L, int i, int e);//在第i个位置插入指定元素e

int main()
{
    Sqlist L;
    InitList(L);//初始化表
    for (int i = 0; i < L.maxsize; )
    {
        cout << "请输入第" << ++i << "个元素:";
        cin >> L.data[i];
        L.length++;
    }
    IncreaseList(L, 2);//扩展顺序表内存空间
    if (ListInsert(L, 3, 184))
    {
        cout << "已成功插入所选元素至所选位置" << endl;
    }
    else {
        cout << "所插入元素不合法,请重新输入" << endl;
    }
    if (ListInsert(L, 3, 170))
    {
        cout << "已成功插入所选元素至所选位置" << endl;
    }
    else {
        cout << "所插入元素不合法,请重新输入" << endl;
    }
    for (int i = 0; i <L.length;)
    {
        cout << "该顺序表的第" << ++i << "个元素是:" << L.data[i] << endl;
    }

    system("pause");
}

void InitList(Sqlist& L)//初始化表
{
    L.data = (int*)malloc(sizeof(int) * bigsize);
    L.maxsize = bigsize;
    L.length = 0;
}

void IncreaseList(Sqlist& L, int len)//延长表
{
    int* ptr = L.data;
    L.data = (int*)malloc(sizeof(int) * (len + bigsize));
    for (int i = 0; i < L.length; i++)
    {
        L.data[i] = ptr[i];
    }
    free(ptr);
    L.maxsize += len;
    
}

bool ListInsert(Sqlist& L, int i, int e)//在顺序表中插入元素
{
    if (i<1 || i>L.length + 1)
        return false;
    if (L.length >= L.maxsize)
        return false;
    L.length += 1;
    for (int j = L.length; j >= i; j--)
    {
        L.data[j] = L.data[j - 1];
    }
    L.data[i - 1] = e;
    
    return true;
}

```

  • 写回答

2条回答 默认 最新

  • 阿里嘎多学长 2024-05-17 11:07
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    您想要解决的问题

    您希望解决的问题是调试您自己编写的C++顺序表的动态插入代码。您的代码能够成功运行,但在调试过程中遇到了问题,您希望得到帮助以找到并解决问题。

    问题出现原因

    1. 数组索引错误:在ListInsert函数中,您试图在索引i的位置插入元素,但实际上数组索引应该从0开始,而不是1。这可能导致数组越界。
    2. 内存管理:您在IncreaseList函数中重新分配了内存,但没有检查malloc是否成功返回了新的内存地址。
    3. 内存泄漏:在IncreaseList函数中,您释放了旧的内存,但在函数结束前没有更新指针ptr,这可能导致悬挂指针问题。

    问题解决方案

    1. 修改ListInsert函数中的索引处理方式,确保索引从0开始。
    2. IncreaseList函数中检查malloc的返回值,确保内存分配成功。
    3. 修复IncreaseList函数中的内存泄漏问题。

    提供代码

    以下是修改后的代码:

    #include<iostream>
    #include<cstdlib>
    
    using namespace std;
    
    int const bigsize = 5;
    
    typedef struct
    {
        int* data;
        int maxsize;
        int length;
    } Sqlist;
    
    void InitList(Sqlist& L); // 初始化表
    void IncreaseList(Sqlist& L, int len); // 增加表的长度
    bool ListInsert(Sqlist& L, int i, int e); // 在第i个位置插入指定元素e
    
    // ...(其他函数保持不变)
    
    bool ListInsert(Sqlist& L, int i, int e) // 在顺序表中插入元素
    {
        if (i < 1 || i > L.length + 1)
            return false;
        if (L.length >= L.maxsize)
            return false;
        
        // 移动元素为插入位置腾出空间
        for (int j = L.length; j >= i; --j)
        {
            L.data[j] = L.data[j - 1];
        }
        L.data[i - 1] = e;
        L.length += 1;
        
        return true;
    }
    
    void IncreaseList(Sqlist& L, int len) // 增加表的长度
    {
        int* new_data = (int*)malloc(sizeof(int) * (L.maxsize + len));
        if (!new_data) // 检查malloc是否成功
        {
            cerr << "Memory allocation failed." << endl;
            exit(EXIT_FAILURE);
        }
        
        // 复制旧数据到新内存
        for (int i = 0; i < L.length; i++)
        {
            new_data[i] = L.data[i];
        }
        
        free(L.data); // 释放旧内存
        L.data = new_data; // 更新数据指针
        L.maxsize += len; // 更新最大容量
    }
    
    // ...(main函数保持不变)
    
    int main()
    {
        // ...(main函数代码保持不变)
    }
    

    代码运行方式

    您可以将上述代码复制到任何支持C++的编译器中,如GCC或Clang,并在命令行或集成开发环境中编译和运行。

    代码预期运行结果

    假设您输入了5个元素,然后调用IncreaseList函数扩展了2个元素的空间,接着在位置3插入了两个元素(184和170),顺序表的输出应该是:

    请输入第1个元素:...(用户输入)
    ...
    请输入第5个元素:...(用户输入)
    已成功插入所选元素至所选位置
    已成功插入所选元素至所选位置
    该顺序表的第1个元素是:...(第一个输入的元素)
    ...
    该顺序表的第7个元素是:170
    

    推荐相关链接

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 5月17日