0

我一直在尝试自己编写二叉树。它似乎一直在工作,直到我想扫描要添加的新字符串。相同的字符串有效,新字符串给了我分段错误和核心转储。我怀疑分配新元素的内存有问题。

#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;
}
4

1 回答 1

3

线

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

是错的。 nowy->word没有任何指向任意内存的存储点。将字符串复制到其中会产生未定义的结果,但可能会出现段错误。

您可以通过word在定义中创建一个固定大小的数组node或动态为其分配内存来解决此问题

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

或者

nowy->word=strdup(wordtmp); // not standard C but available in Posix systems
于 2013-01-14T17:13:44.630 回答