C中的二进制搜索树,并为重复键构建链接列表

时间:2016-09-09 16:23:36

标签: c binary-search-tree

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帮助我找到问题。由于我的英语技能不好,我可能无法清楚地解释我的问题,请问我这个问题。

1 个答案:

答案 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);
}