typedef struct Node{
char Name[100];
char Value[2000];
struct Node *Same;
struct Node *left;
struct Node *right;
}yelp;
//more codes
//this is what I used to search the key within the BST
void search(yelp *root, char* key, char* OP_filename) {
yelp *current;
current = root;
int steps = 0, count= 0;
FILE *outputFile;
outputFile= fopen(OP_filename,"a");
while (current != NULL) {
if (strcmp(current->Name,key)==0) {
count++;
current = current->Same;
fprintf(outputFile,"%s --> %s\n", current->Name, current->Value );
}
if (strcmp(key,current->Name)<0){
current = current->left;
}
if(strcmp(key,current->Name)>0){
current = current->right;
}
steps++;
}
if(count ==0){
fprintf(outputFile,"%s --> NOTFOUND\n",key);
fprintf(stdout, "%s --> NOTFOUND \n",key);
}
else{
fprintf(stdout,"%s --> %d \n",key,steps);`enter code here`
}
fclose(outputFile);
}
我写这个搜索方法,但它一直崩溃,我无法找到逻辑问题。它应该为具有相同键的项目构建bst和链表.plz帮助我找到问题。由于我的英语技能不好,我可能无法清楚地解释我的问题,请问我这个问题。
答案 0 :(得分:0)
假设树本身的实际实现是完美无缺的!
从评论者那里实现提示并添加一些必要的检查给出:
void search(yelp * root, char *key, char *OP_filename)
{
yelp *current;
int steps = 0, count = 0;
FILE *outputFile;
// might fail (most likely reason "too many open files")
outputFile = fopen(OP_filename, "a");
if (outputFile == NULL) {
fprintf(stderr, "Failure to open file\n");
return;
}
// early out (not abs. necessary, of course)
if (root == NULL) {
fprintf(stderr, "root is NULL\n");
fprintf(outputFile, "%s --> NOTFOUND\n", key);
fclose(outputFile);
return;
}
current = root;
while (current != NULL) {
if (strcmp(current->Name, key) == 0) {
count++;
// exchanged lines; see BLUEPIXY's comment for the reason
fprintf(outputFile, "%s --> %s\n", current->Name, current->Value);
current = current->Same;
} else if (strcmp(key, current->Name) < 0) {
current = current->left;
} else if (strcmp(key, current->Name) > 0) {
current = current->right;
}
steps++;
}
if (count == 0) {
fprintf(outputFile, "%s --> NOTFOUND\n", key);
fprintf(stdout, "%s --> NOTFOUND \n", key);
} else {
fprintf(stdout, "%s --> %d \n", key, steps);
}
fclose(outputFile);
}