Морс Алфавит Сегментация Ошибка - PullRequest
0 голосов
/ 20 декабря 2018

Мой код не добавляет второй узел в дерево.Это дает мне ошибку SIGSEGV, когда я добавляю второй узел. Я думаю, что это функция strcmp, но когда я пытаюсь понять, как она работает должным образом в самом низу основной функции, она возвращает -1, поэтому я написал это такthis.And большинство моих переменных по-турецки, так вот их переводы, чтобы вам было легче понять dugum = узел, kok = корень; sol = слева; sag = вправо; anne = mother

// C program to demonstrate insert operation in binary search tree
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct tree {
  char *harf;
  char *morskodu;
  struct tree *left;
  struct tree *right;
} agac;

agac *kok = NULL;

void ekle(char *harf, char *morskodu) {
  if (kok == NULL) {
    kok = (agac *)malloc(sizeof(agac));
    kok->harf = harf;
    kok->morskodu = morskodu;
    kok->left = NULL;
    kok->right= NULL;
  } else {
    agac *yeni = (agac *)malloc(sizeof(agac));
    yeni->harf = harf;
    yeni->morskodu = morskodu;
    yeni->left = NULL;
    yeni->right = NULL;
    agac *dugum = kok, *anne;
    while (dugum != NULL) {
      anne = dugum;
      if (harf <= dugum->harf)
        dugum = dugum->left;
      else
        dugum = dugum->right;
    }
    if (harf <= dugum->harf)
      anne->left = yeni;
    else
      anne->right = yeni;
  }
}

void dolas(agac *dugum) {
  if (dugum != NULL) {
    printf(" %s ", dugum->harf);
    dolas(dugum->left);
    dolas(dugum->right);
  }
}

void main() {
  ekle("a", "-");
  ekle("b", "-.");
  dolas(kok);

  int x = strcmp("A", "B");
  printf("%d", x);
}

1 Ответ

0 голосов
/ 20 декабря 2018

Вы пытаетесь разыменовать нулевой указатель.

while (dugum != NULL) {
  anne = dugum;
  if (harf <= dugum->harf)
    dugum = dugum->sol;
  else
    dugum = dugum->sag;
}

Этот цикл заканчивается, когда dugum равен NULL.Непосредственно после попытки доступа к dugum->harf:

 if (harf <= dugum->harf)

Это приводит к неопределенному поведению.

Также обратите внимание, что это сравнение сравнивает указатели со строковыми литералами и, следовательно, также является неопределенным поведением.Для сравнения двух строк C вы должны использовать strcmp.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...