2013-11-22 52 views
0

因此,我正在做一个大学班级的作业,其目标是构建一个字符串BST,用于读取文本,将它分开并在树中插入每个单词。BST字符串中的分段错误

但是,当我尝试插入一个词(手动)时,我遇到了分段错误,你们能告诉我我做错了什么地方,并提出修复建议吗?

/* Structure for the node */ 
typedef struct node { 
    char *key; 
    int multi; 
    struct node *left, *right; 
} node; 

node *root; 

void Insert(char *x, node *p){ 
    p = root; 

    /* if the pointer points to null, create a new node and insert the key */ 
    if (*p == NULL){ 
    (*p) = (node)malloc(sizeof(node)) 
    (*p)->key = strcpy((*p)->key, x); 
    (*p)->left = NULL; 
    (*p)->right = NULL; 
    return; 
    } 
    else if (strcasecmp(x, p->key) < 0) 
    { 
    Insert(x, &p->left); 
    return; 
    } 

    else if (strcasecmp(x, p->key) > 0) 
    { 
    Insert(x, &p->right); 
    return; 
    } 
    /* if the words are equal, add 1 to the multi (how many times the word appears */ 
    else 
    (*p)->multi = multi + 1; 
} 
+0

这甚至不应该编译!当你将'p'声明为你不能做的指针时,例如'(* p) - > key ...'然后稍后再正确使用它,例如'对 - > key'。 –

+0

另外,为什么传入'p'作为参数并直接重新指派它以指向'root'? –

+0

这段代码坦率地说是一个未定义行为的山峰。从'malloc()'强制转换为一种甚至不是指针类型的类型(**不必要的**)是唯一能够避免编译失败的事情。它迅速从那里下山。 – WhozCraig

回答

0

这是有问题的语句:(*p)->key = strcpy((*p)->key, x);您只需为node分配的内存,但是指针key仍然未初始化。您还需要为key分配内存,例如(*p)->key = malloc(strlen(x) + 1);

+0

谢谢,将尝试此解决方案 – user2903355