数据结构实验错误汇总

数据结构实验错误汇总

实验错误汇总:


重载运算符函数operator的返回值为什么总是声明为引用。

TODO

  • 解决方案:

    重载运算符函数operator的返回值为什么总是声明为引用

错误位置:链表的应用——多项式的存储与运算 运算符的重载

错误时间:2020.03.13


VS C2131:表达式的计算结果不是常数;

  • 错误代码:

    int array[cols];
    
  • 正确写法:

    	int* array = new int[cols];
    
  • 错误原因:

    创建数组时数组长度是不能用变量的 !!!

错误位置:稀疏矩阵的封装及快速转置——transposeMatrix()转置算法的实现

错误时间:2020.04.13


未加载wntdll.pdb ,引发异常 :String.exe 已触发了一个断点。

  • 错误代码:

    void insert(String A, int pos)
    {
        //TODO:将A插入到pos位置上
        if (length + A.length > capacity)		//如果长度不够扩容
        {
            resize(length + A.length);
        }
        for (int i = length - 1; i >= pos; i--)
        {
            items[A.length + i] = items[i];
        }
        for (int i = 0; i < A.length; i++)
        {
    
            items[pos + i] = A.items[i];
        }
        length += A.length;
    }
    
    
  • 报错显示:

  • 正确写法:

    void insert(String& A, int pos)
    {
        //TODO:将A插入到pos位置上
        if (length + A.length > capacity)		//如果长度不够扩容
        {
            resize(length + A.length);
        }
        for (int i = length - 1; i >= pos; i--)
        {
            items[i + A.length] = items[i];
        }
        for (int i = 0; i < A.length; i++)
        {
    
            items[pos + i] = A.items[i];
        }
        length += A.length;
    }
    
  • 错误原因:

  • 原因分析:

    1. 此错误发生一般由于代码不规范,有漏洞,未释放内存空间,导致内存泄漏,或由于访问到了已经释放的内存空间!!!

    2. 调用insert函数接口用于插入子串到指定位置,注意!!!传参数时要传字符串的引用,直接对字符串进行一系列操作,而不是操作字符串拷贝后的副本。

错误位置:串的封装——insert()接口的实现 (insert是在指定位置插入字符串的接口)

错误时间:2020.04.14


函数调用的问题。

  • 注意:

    Index_KMP()函数实现中的 ( j == 0 || S[i] == T[j] )条件判断重点观察

  • 错误描述:

    头文件中实现的函数在测试文件的主函数中不能调用

错误位置:串的快速匹配——KMP算法

错误时间:2020.04.13


VS C2664:BinTree ::create(char *, int &):无法将参数从 "const char[14]" 转换为 "char *" 。

  • 错误代码:

    static BinTree* create(char* str, int& index)
    {
        //实现由先序遍历字符串创建二叉树
    }
    
  • 正确写法:

    static BinTree* create(const char* str, int& index)
    {
        //实现由先序遍历字符串创建二叉树
    }
    
  • 错误原因:

    函数的实参要声明为指针常量,防止执行函数是对数据进行修改,以保障数据的安全!!!

  • 关键字 const 的用法详解:

    c++中const的作用

错误位置:二叉树的封装与遍历——create()由先序遍历字符串创建二叉树的函数

错误时间:2020.04.26


未加载wntdll.pdb ,引发异常 :MST Algorithm.exe 已触发了一个断点。&& 输出结果与预期不相符。

  • 错误代码:

    for (int i = 0; i < G.arcNum; i++)
    {
        int v1 = edges[i].head;			// 当前边的起点
        int v2 = edges[i].tail;			// 当前边的终点
        if (union_set[v1] != union_set[v2])
        {
            edges[i].output();
            for (int j = 0; j < G.vexNum; j++)		// 合并连通分支,保证每一个连通分支下的顶点标记相同
            {
                if (union_set[j] == union_set[v2])
                    union_set[j] = union_set[v1];	// 更新连通分量
            }
        }
    }
    
  • 正确写法:

    for (int i = 0; i < G.arcNum; i++)
    {
        int v1 = edges[i].head;			// 当前边的起点
        int v2 = edges[i].tail;			// 当前边的终点
        int us1 = union_set[v1];		// 记录与v1连通的点
        int us2 = union_set[v2];		// 记录与v2连通的点
        if (us1 != us2)
        {
            edges[i].output();
            for (int j = 0; j < G.vexNum; j++)		// 合并连通分支,保证每一个连通分支下的顶点标记相同
            {
                if (union_set[j] == us2)
                    union_set[j] = us1;	// 更新连通分量
            }
        }
        else
            continue;
    }
    
  • 错误截图:

  • 错误原因:

    程序错误

    if (union_set[v1] != union_set[v2])
    {
        edges[i].output();
        for (int j = 0; j < G.vexNum; j++)		// 合并连通分支,保证每一个连通分支下的顶点标记相同
        {
            if (union_set[j] == union_set[v2])
                union_set[j] = union_set[v1];	// 更新连通分量
        }
    }
    

    if条件判断中当j == v2时,修改了union_set[v2]的值导致if (union_set[v1] != union_set[v2])条件判断出现遗漏,造成输出结果的错误!!!

错误位置:图的应用——最小生成树Kruskal算法的实现

错误时间:2020.05.20


析构函数执行时,释放已释放的内存,引发程序中断

  • 问题位置:

    Hash Search.hpp include SeqList.hpp’s destructor

  • 错误代码:

    SeqList(SeqList& s)  {}
    
    ~SeqList()		//释放存储空间
    {
        if (items != NULL)
            delete[]items;
    }
    
  • 正确代码:

    SeqList(SeqList& s)		// 拷贝构造函数(深拷贝)
    {
        length = s.length;
        capacity = s.capacity;
        items = new ElemType[capacity];
        memcpy(items, s.items, s.length * sizeof(ElemType));
    }
    
    ~SeqList()		//释放存储空间
    {
        if (items != NULL)
            delete[]items;
    }
    
  • 解决方案:

    浅析C++中的深浅拷贝

    c++析构函数delete位置访问冲突问题

  • 错误原因:

  • 原因分析:

    String类继承了SeqList,当执行 HashCode(key) 时调用拷贝构造函数。如果调用默认拷贝构造函数,则是浅拷贝,执行完函数后,析构函数会企图释放一块已经被释放的内存区域,程序将会崩溃。只有利用引用做形参,或者重载SeqList的拷贝构造函数为深层构造函数,开辟出和源对象大小一样的空间,然后将源对象里的内容拷贝到目标拷贝对象中去,这样执行析构函数时才不会出现异常!!!

错误位置:散列查找法——HashMap中String的父类SeqList的析构函数

错误时间:2020.06.07


hmoban主题是根据ripro二开的主题,极致后台体验,无插件,集成会员系统
自学咖网 » 数据结构实验错误汇总