Как вставить строку в узел (как введено пользователем)?(Дерево бинарного поиска) - PullRequest
0 голосов
/ 21 сентября 2019

Я пытаюсь создать бинарное дерево поиска, используя C. Что мне нужно сделать, это вставить идентификатор (только цифры) в узел и связать этот же узел с именем (строкой).Используя этот идентификатор, я могу отобразить дерево с помощью InOrder Searching.

Проблема в том, что я получил (спасибо, интернет) числа для вставки, выполните поиск InOrder.

Что мне не удалось сделать, так это связать строку с узлом, т. Е. Я не могу сохранить имена.Я нашел ответ на то же самое в связанном списке, но, похоже, я не понимаю код.Пожалуйста, помогите мне.

То, что я нашел, было memset () {Я понятия не имею, что это такое} и каким-то образом я должен использовать stringcpy {Я знаю это, но не знаю, как его применить}

Код моей структуры:

struct node
{
    int employeeid;
    struct node *left;
    struct node *right;
    char employeename[100];
}*temp=NULL,*link=NULL;

Внутри моей функции я попытался вставить имя, но получил ошибку:

    printf("Enter the employee name: ");
    gets(name);
    temp = (struct node *)malloc(sizeof(struct node));
    temp->employeeid = data;
    temp->employeename = name;
    temp->left = temp->right = NULL;

Строка кода с ошибкой: temp->employeename = name;

Ошибка:

error: assignment to expression with array type

То, что я ожидал, было, очевидно, кодом для запуска.Пожалуйста, помогите.

Ответы [ 2 ]

0 голосов
/ 21 сентября 2019

Вы не можете использовать оператор = с массивом.Вам необходимо использовать такую ​​функцию, как strcpy, strncpy или memcpy.И вам нужно убедиться, что employeename имеет нулевое значение.

Я настоятельно рекомендую вам использовать fgets вместо gets.На самом деле, вы, вероятно, никогда не должны использовать gets.fgets позаботится о нулевом завершении (при условии, что буфер name не больше employeename) и не переполнит ваш буфер.

Не забудьте проверить malloc returnстоимость.Вы хотите обрабатывать ошибку правильно, а не сбой, когда она происходит.

Использование fgets, с некоторой обработкой ошибок и BUFF_SIZE = 100:

temp = (struct node *)malloc(sizeof(struct node));
if (temp == NULL)
{
    printf("Malloc has failed\n");
    return (-1);
}
printf("Enter the employee name: ");
fgets(name, BUFF_SIZE, stdin);
temp->employeeid = data;
strcpy(temp->employeename, name);
temp->left = temp->right = NULL;

РЕДАКТИРОВАНИЕ:

stdin является стандартным вводом.Проще говоря, это то, что обычно содержит текст, который вы пишете с помощью клавиатуры в своем терминале.И это то, что scanf и gets используют, не спрашивая вас.Имейте в виду, что я объясняю это объяснение.

BUFF_SIZE - это удобный способ представления постоянного значения.Лучший способ настроить его - использовать определение, например, в верхней части вашей программы:

# define BUFF_SIZE 100

int all_your_function()
{
...

Это очень полезно, когда вы хотите:

  • присвоить осмысленное имя конкретному номеру (чтобы вашу программу было легче читать)
  • изменить этот номер во всей вашей программе (можно перезаписать только одно место)
0 голосов
/ 21 сентября 2019
struct node
{
    int employeeid;
    struct node *left;
    struct node *right;
    char *employeename; //Updated
}*temp=NULL,*link=NULL;

data = (char*)malloc( ... );
temp->employeeid = data;
...