0

I've been trying to code up binary tree by my own. It seems to be working until I want to scanf for new string to add. Same string works, new string gives me segmentation fault & core dump. I suspect there's something wrong with mallocing memory of new element.

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
//------- wezel -------//
struct node{
char *word;
unsigned int arity;
struct node *left, *right, *parent;
};
struct node *root;
/* Adding new string to tree */
void dopisz(char wordtmp[50], struct node *start){

    if(root==NULL){ // empty tree, add as root
    root=(struct node*)malloc(sizeof *root);
    root->word=(char*)malloc(sizeof wordtmp);
    root->word=strcpy(root->word, wordtmp);
    root->arity=1;
    root->left=NULL;
    root->right=NULL;
    root->parent=NULL;
    }
    else if(strcmp(wordtmp, start->word)==0){
        start->arity=start->arity+1;
    }
    else if(strcmp(wordtmp, start->word)<0){  //if the added element is <
        if(start->left==NULL){ //if there's no left son
            struct node *nowy=(struct node*)malloc(sizeof *root);
            nowy->word=strcpy(nowy->word, wordtmp);
            nowy->arity=1;
            nowy->left=NULL;
            nowy->right=NULL;
            nowy->parent=start;
            start->left=nowy;
        }
        else if(start->left!=NULL){ //if there's left son
            dopisz(wordtmp, start->left);
        }

    }
    else if(strcmp(wordtmp, start->word)>0){  //if the added element is >
        if(start->right==NULL){ //if there's no right son
            struct node *nowy=(struct node*)malloc(sizeof *root);
            nowy->word=strcpy(nowy->word, wordtmp);
            nowy->arity=1;
            nowy->left=NULL;
            nowy->right=NULL;
            nowy->parent=start;
            start->right=nowy;
        }
        else if(start->right!=NULL){ //if there's right son
            dopisz(wordtmp, start->right);
        }

    }


}
//-------looking for minimum -------//
struct node* least(struct node *start){
    if(start->left != NULL){
        return least(start->left);
    }
    else return start;
}

//------- deleting -------//
void usun(){

}
//------- printing -------//
void drukuj(struct node *start){ //printing in order in order
    if(start->left!=NULL){
        drukuj(start->left); 
    }
    printf("%s (%d)\n", start->word, start->arity);
    if(start->right!=NULL){
        drukuj(start->right);
    }
}
//------- main -------//
int main(){
char wordtmp[50];
printf("\t Drzewo Poszukiwan Binarnych \n------------------------\n\n");
int x, y=0;
while(y==0){
    printf("\n MENU: \n 0 -> zakoncz \n 1 -> dopisz\n 2 -> usun\n 3 -> drukuj\n\n"); // 0 - exit, 1 - add, 2 - delete, 3 - print
    scanf("%d", &x);
    switch(x){
    case 0: y++;        break;
    case 1:
    printf("wpisz slowo: ");
    scanf("%s", wordtmp);
    dopisz(wordtmp, root);
    break;
    case 2: usun();     break;
    case 3: drukuj(root);   break;
    }
}
return 0;
}
Tomasz
  • 99
  • 2
  • 6

1 Answers1

3

The line

nowy->word=strcpy(nowy->word, wordtmp);

is wrong. nowy->word doesn't have any storage points to arbitrary memory. Copying a string to it has undefined results but a seg fault is likely.

You can fix this by making word a fixed size array in node's definition or by allocating memory for it dynamically

nowy->word=malloc(strlen(wordtmp)+1);
strcpy(nowy->word, wordtmp);

or

nowy->word=strdup(wordtmp); // not standard C but available in Posix systems
simonc
  • 41,632
  • 12
  • 85
  • 103
  • Thank you sir. I haven't though about mallocing memory for nowy->word itself. That makes sense. – Tomasz Jan 14 '13 at 17:36