首页 > 解决方案 > 为什么会出现分段错误?

问题描述

我做了一个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;
}

标签: c

解决方案


推荐阅读