2015-11-06 2 views
0

Я пытаюсь удалить узел из дерева двоичного поиска. Но когда я хочу проверить функцию, я получу сообщение об ошибке в «case 3: two children».Удалить узел из двоичного дерева поиска в C

clist->name = temp->name; 

Эта строка вызывает сообщение об ошибке. В нем говорится: левый операнд должен быть l-значением. Я новичок в C и деревьях двоичного поиска. Я не могу понять, почему эта строка не работает. Я нашел много идей в Интернете, как реализовать функцию удаления. И все эти подходы используют эту строку кода.

Ниже приведена полная функция.

(GreaterThan, LessThan, toLowerCase являются вспомогательной функцией, что я реализовывал. И они работают отлично точно)

struct student { 
    int ID; 
    char name[20]; 
    struct student *left; 
    struct student *right; 
}; 

struct student * minValueNode(struct student* node) { 
    struct student* current = node; 
    while (current->left != NULL) 
     current = current->left; 

    return current; 
} 

struct student * bst_delete (struct student *clist, char* token, struct student **parent) 
{ 

    if (clist == NULL) 
     return clist; 

    char* clistName = clist->name; 
    char* tok = token; 
    toLowerCase(clistName); 
    toLowerCase(tok); 

    if (lessThan(tok, clistName)) 
     clist->left = bst_delete(clist->left, token, &clist->left); 

    else if (greaterThan(tok, clistName)) 
     clist->right = bst_delete(clist->right, token, &clist->right); 

    else 
    { 
     //Case 1: No children 
     if (clist->left == NULL && clist->right == NULL) { 
      free(clist); 
      clist = NULL; 
     } 
     //Case 2: One Child 
     if (clist->left == NULL) { 
      struct student *temp = clist; 
      clist = clist->right; 
      free(temp); 
     } else if (clist->right == NULL) { 
      struct student *temp = clist; 
      clist = clist->left; 
      free(temp); 
     } 
     //Case 3: Two Children 
     else { 
      struct student *temp = minValueNode(clist->right); 
      clist->name = temp->name; 
      clist->right = bst_delete(clist->right, temp->right, &clist->right); 
     } 

    } 
    return clist; 
} 

Было бы замечательно, если бы кто-нибудь может сказать мне, почему эта линия не работает. И как я могу исправить эту ошибку.

Спасибо!

ответ

1

Вы не можете копировать массив в с прямым присваиванием, что вы действительно хотите сделать, это скопировать элементы массива - для этого можно использовать STRCPY -

strcpy(clist->name, temp->name); 

или поскольку размер константа, используйте немного безопаснее -

strncpy(clist->name, temp->name, 20); 

на самом деле вы были повезло здесь, вы могли бы использовать указатели для имен строк (выделяющих их динамически), который бы сделал это задание правильный код (хотя до сих пор не копирует строку как вы хотите, просто переопределяя одну точку с другим) и разрешить компиляцию кода, но затем вызвали бы утечки памяти и указатели обмена между узлами - это было бы намного сложнее отладить.

В этом случае значение правой руки в присваивании может распадаться на указатель, но значение левой руки не может (поскольку этот массив статически помещен внутри структуры), поэтому компилятор жалуется на значение l ,

Смежные вопросы