【发布时间】:2016-02-13 19:03:51
【问题描述】:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct node *tree_ptr;
typedef struct table * Table;
struct node
{
char* element;
tree_ptr left, right;
};
typedef struct table
{
tree_ptr head;
int tree_h;
}table;
char* key = NULL;
Table insert(char* insert_key,Table t)
{
int height = 0;
//tree_ptr ptr = t->head;
tree_ptr *ptr = &(t->head);
key = strdup(insert_key);
tree_ptr new_node = malloc(sizeof(struct node));
new_node->element = key;
new_node->left = NULL;
new_node->right = NULL;
if ( t->head==NULL ){
*ptr = new_node;
t->tree_h = 0;
printf("head:%s\n",t->head->element);
return t;
}
while(1){
if ( strcmp(insert_key, (*ptr)->element)<0 ){
if ( (*ptr)->left ==NULL ){
(*ptr)->left = new_node;
height++;
if ( height > t->tree_h)
t->tree_h = height;
break;
}
else{
(*ptr) = (*ptr)->left;
height++;
}
}
else if ( strcmp(insert_key, (*ptr)->element)>0 ){
if ( (*ptr)->right ==NULL ){
(*ptr)->right = new_node;
height++;
if ( height > t->tree_h)
t->tree_h = height;
break;
}
else{
(*ptr) = (*ptr)->right;
height++;
}
}
else break;
}
return t;
}
int main() {
Table t = malloc(sizeof(table));
t->head = NULL;
t = insert("one", t);
t = insert("two", t);
t = insert("three", t);
printf("%s\n",t->head->element);
return 0;
}
上面是一个简化的程序,给出了一些定义代码,所以我不能改变基本的结构,比如table,Table,node,tree_ptr,而其他的可以改变。 我要实现的是拼写检查,该表存储了树的头部和树的一些其他属性(这里省略),树实现为有序二叉树。
我发现,在 (*ptr) = (*ptr)->right; 之后,insert() 最多可以工作两次。 t->head 也发生了变化。所以用了两次之后,树头就丢了。
如何修改我的 insert()?
【问题讨论】:
-
我们需要一个专门用于链接列表的网站。我认为每个数据结构类都必须给链表赋值是有规律的。 :)
-
对不起,你是什么意思?
-
我只是在评论这个网站上弹出的链接列表问题的数量。无意冒犯。
-
数据结构是迄今为止我最喜欢的comp sci类。
标签: c struct pointer-to-pointer