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 に答える