数据结构实验错误汇总
实验错误汇总:
重载运算符函数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