Как использовать двоичное дерево поиска для хранения строк? - PullRequest
0 голосов
/ 04 июня 2019

Ранее я писал код C для вставки и обхода целочисленных значений в двоичном дереве поиска.Я пытался заставить это работать и для струн.Я сделал несколько изменений, таких как преобразование всех целых чисел в строки, а также добавил функции, такие как strcpy () и strcmp () для обработки строковых операций.Но код, похоже, не работает.Может кто-нибудь объяснить мне, что пошло не так?

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

struct node  
{
    char *str;
    struct node *left;
    struct node *right;
};
struct node *root=NULL;

void preorder(struct node *temp)
{
    if(temp==NULL)
        return;
    printf("%s ", temp->str);
    preorder(temp->left);
    preorder(temp->right);

}

void inorder(struct node *temp)
{
    if(temp==NULL)
        return;
    inorder(temp->left);
    printf("%s ", temp->str);
    inorder(temp->right);

}
void postorder(struct node *temp)
{
    if(temp==NULL)
        return;
    postorder(temp->left);
    postorder(temp->right);
    printf("%s ", temp->str);
}

struct node* create(char *str)   // Function to create new node
{
    struct node *new1;
    new1=(struct node*)malloc(strlen(str)+10);
    strcpy(new1->str,str);
    new1->left=NULL;
    new1->right=NULL;
    return new1;
}

struct node* insert(struct node *root,char *str) // Function to insert a node
{
    if(root==NULL)
    {
        root=create(str);
    }
    else if(strcmp(str,root->str)<0)
    {
        root->left = insert(root->left,str);
    }
    else if(strcmp(str,root->str)>0)
    {
       root->right =  insert(root->right,str);
    }
    return root;
}

int main()
{
    char *str;
    while(1)
    {
        printf("Enter value to insert: ");
        scanf("%s",str);
        if(strcmp(str,"-1")==0)
        {
            break;
        }
        else
        {
            root=insert(root,str);
        }
    }
    printf("\nThe values of the BST traversed in PREORDER are: ");
    preorder(root);
    printf("\nThe values of the BST traversed in INORDER are: ");
    inorder(root);
    printf("\nThe values of the BST traversed in POSTORDER are: ");
    postorder(root);
    return 0;
}

Если кто-нибудь сможет исправить это для меня, я буду благодарен.

1 Ответ

5 голосов
/ 04 июня 2019

Основная проблема: в create у вас есть

new1=(struct node*)malloc(strlen(str)+10);
strcpy(new1->str,str);

Требуется новый узел

new1=(struct node*)malloc(sizeof(node));

И место для строки

new1->str=malloc(strlen(str)+1); //plus 1 for null terminator

ТогдаВы можете сделать это:

strcpy(new1->str,str);
...