我一直在尝试自己编写二叉树。它似乎工作,直到我想scanf为要添加的新字符串。相同的字符串工作,新的字符串给我分段错误&核心转储。我怀疑mallocing new元素的内存有问题。
#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;
}
答案 0 :(得分:3)
该行
nowy->word=strcpy(nowy->word, wordtmp);
错了。 nowy->word
没有任意存储器的存储点。将字符串复制到它具有未定义的结果,但可能存在seg错误。
您可以通过在word
的定义中使node
固定大小的数组或动态分配内存来解决此问题
nowy->word=malloc(strlen(wordtmp)+1);
strcpy(nowy->word, wordtmp);
或
nowy->word=strdup(wordtmp); // not standard C but available in Posix systems