c - 为什么会出现分段错误?
问题描述
我做了一个AA树,循环删除大量元素时,出现这个错误,如何解决?如果单独删除(不是从循环中删除),就不会出现这个错误,怎么删除呢?也许调用堆栈溢出或其他原因,在插入或搜索操作期间没有这样的事情
main.c
int main() {
FILE *f = fopen("file.txt", "w");
AATree aat = NULL;
std::clock_t start;
double duration;
for (int i = 1; i < 1000000; i++) {
aat_insertData(&aat, i);
}
start = std::clock();
for (int i = 1; i < 100000; i++) {
aat_deleteData(&aat, i);
}
duration = ( std::clock() - start ) / (double) CLOCKS_PER_SEC;
}
函数删除
AATree _DeleteData(AATree t, int key)
{
AATree m;
if (t == NULL)
return NULL;
if (key < t->key) // Firstly, Find the node that you want to delete.
{
t->left = _DeleteData(t->left, key);
}
else if (key > t->key)
{
t->right = _DeleteData(t->right, key);
}
else {
if (t->left == NULL && t->right == NULL)
{
free(t);
return NULL;
}
if (t->left == NULL)
{
AATree l;
l = Successor(t);
t->key = l->key;
t->right = _DeleteData(t->right, l->key);
}
else {
AATree l;
l = Predecessor(t);
t->key = l->key;
t->left = _DeleteData(t->left, l->key);
}
}
if ((t->level > 1) && (t->left == NULL || t->right == NULL)) {
t->level--;
t = Decrease_level(t);
t = Skew(t);
t = Split(t);
}
t = Decrease_level(t);
t = Skew(t);
m = t->right;
t->right = Skew(m);
if (m != NULL && m->right != NULL)
{
t->right->right = Skew(m->right);
}
t = Split(t);
t->right = Split(m);
return t;
}
解决方案
推荐阅读
- laravel - 如何清除价值观?
- javascript - 在单击 reactjs 上添加行
- ruby - `each_cons` 如何处理个位数?
- python - 从 Pandas DataFrame 中选择一列中具有相同值但另一列中值不同的行
- ruby-on-rails - ActiveRecord::Migration 前置上下文和方法
- javascript - 如何从具有日期的对象数组中获取平均值?
- php - 我们可以在 Wordpress 主题中从 URL 更改“#comments”吗
- php - 使用 AJAX Laravel 更新数据库字段
- python - Tkinter 简单对话框在 Windows 10 和 Python3 中没有得到关注
- node.js - 如何在nodejs中提供图像原始二进制数据