2017-02-16 2 views
1

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

Так, например, в Фремонт синтаксического дерева будет выглядеть

F-> R-> Е-> М-> О-> N-> Т -> (широта и долгота)

Я могу успешно вставить значения в синтаксическое дерево, но когда я пытаюсь искать для конкретного города, значение долготы и широты возвращения (нуль)

Вот моя реализация

void readFile(){ 

       //the functions that deal with the trie 
       struct trieNode *node = initializeTrie(); 
       trieInsert(node, place, longitude, latitude); 
       getTrie(node, place); 
       trieFree(node); 
} 

struct trieNode{ 
     char *longi; 
     char *lat; 
     struct trieNode *children[27]; 
     char value; 
}; 

struct trieNode *initializeTrie(){ 
     struct trieNode *pNode = NULL; 

     pNode = (struct trieNode *)malloc(sizeof(struct trieNode)); 
     if(pNode){ 
       pNode->longi = '\0'; 
       pNode->lat = '\0'; 
       pNode->value = '\0'; 
       memset(pNode->children, 0, sizeof(pNode->children)); 
     } 

     return pNode; 
} 


void trieFree(struct trieNode *root){ 
     int i; 
     if(root){ 
       for(i = 0; i<= 26; i++){ 
         trieFree(root->children[i]); 
       } 
     } 
     free(root); 
} 

int trieInsert(struct trieNode *node, char *key, char *longitude, char *latitude){ 
     struct trieNode *parent = node; 
     //printf("Longi: %s", longitude); 
     //printf(" "); 
     //printf("Latitude: %s \n", latitude); 
     if(key){ 
       int index = 0; 
       int i = 0; 

       if(node){ 
         while(key[i] != '\0'){ 
           int indexVal = convertLetterToIndex(key[i]); 
           if(!parent->children[indexVal]){ 
             parent->children[indexVal] = initializeTrie(); 
             parent->children[indexVal]->value = key[i]; 
           } 
           parent = parent->children[indexVal]; 
           i++; 
         } 

         int longitudeLen = strlen(longitude); 
         int latitudeLen = strlen(latitude); 

         node->longi = malloc(longitudeLen + 1); 
         strncpy(node->longi, longitude, longitudeLen + 1); 
         node->longi[longitudeLen] = '\0'; 
         //printf("Longi: %s", node->longi); 
         node->lat = malloc(latitudeLen + 1); 
         strncpy(node->lat, latitude, latitudeLen + 1); 
         node->lat[latitudeLen] = '\0'; 
         //printf("Lati: %s \n", node->lat); 
         //free(node->longi); 
         //free(node->lat); 
       } 
     } 


} 

//function to print the long and lat values based on the city 
void getTrie(struct trieNode *root, char *key){ 
     struct trieNode *pNode = root; 
     //bool flag = false; 
     if(!key){ 
      printf("Not found \n"); 
     } 

     if(!root){ 
       printf("Not found \n"); 
     } 
     int i = 0; 
     while(key[i] != '\0'){ 
       int indexVal = convertLetterToIndex(key[i]); 
       if(!pNode->children[indexVal]){ 
         printf("Not found \n"); 
       } 

       pNode = pNode->children[indexVal]; 
       i++; 
     } 

     printf("Longitude: %s", pNode->longi); 
     printf(" "); 
     printf("Latitude: %s \n", pNode->lat); 


} 
+0

Я не вижу никаких очевидных проблем, которые приведут к описанному вами поведению. Я думаю, что [MCVE] (http://stackoverflow.com/help/mcve) было бы полезно. Кроме того, взгляните на [Как отладить] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/). – yeputons

+2

Несколько других проблем: 'pNode-> longi = '\ 0';' инициализирует не пустую строку, а инициализирует 'longi' до NULL, в основном« никакой строки вообще ». У вас нет 'return' в 'getTrie' после ошибок« Не найдено ». – yeputons

+0

@yeputons, но у меня есть операторы печати в функции getTrie. – RRP

ответ

0

Прежде всего longi и lat имеют тип char *, не char в value, поэтому инициализация

pNode->longi = '\0'; 
    pNode->lat = '\0'; 
    pNode->value = '\0'; 

выглядит не так хорошо.

Это скорее должно быть

pNode->longi = NULL; 
    pNode->lat = NULL; 
    pNode->value = '\0'; 

(я не хочу, чтобы спросить, почему value только один символ - это особый способ представления данных)

Следующая точка внимания использует strncpy и strlen функции.

Когда вы действуете trieInsert получить указатели на символ, вы должны проверить их if(longitude != NULL) перед использованием в выражениях, как strlen(longitude) и strncpy(node->longi, longitude, longitudeLen + 1). И, конечно, логика с указателем должна быть такой:

  • определить указатель и инициализировать его с помощью NULL;

  • выделяет память malloc или любую другую функцию для распределения (функция стандартного динамического распределения памяти возвращает нулевой указатель, если не удается выделить);

  • проверить значение указателя и использовать его после if(p != NULL) или if(p).

Это какая-то хорошая практика.

+0

Итак, последний бит подходит для хорошего стиля кодирования, просто хочу убедиться, что в этом бите нет ошибки, Я смог распечатать значения для node-> longi и node-> lat. Который говорит мне, что значения заполняются в trie – RRP

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