如何按名称(字符串)对BST进行排序和搜索?

时间:2014-03-24 06:43:59

标签: c debugging sorting search binary-search-tree

我必须编写一个程序,将.txt文件读入树中,然后它允许用它执行特定的操作。我被困在我需要按名称排序树并按名称搜索的部分,任何输入都会很棒。所以,我的输入文件格式为:

3800 Lee, Victor; 2.8 
3000 Brown, Joanne; 4.0

而且,我的二叉树格式为:

typedef struct
 {
 int   id;
 char  name[MAX_NAME_LEN];
float gpa;
 } STUDENT;

typedef struct node
{
 STUDENT*        dataPtr;
 struct node* left;
 struct node* right;
} NODE;

typedef struct
{
 int   count;
 int  (*compare) (void* argu1, void* argu2); // Was provided by teacher, not really sure    how this works
 NODE*  root;
} BST_TREE;

ReadFile和insert函数工作得很好,但我不知道如何按名称(字符串)实现搜索。我知道我必须使用这部分代码,但我真的迷失了如何做到这一点。

/*  ====================== compareStu ======================
    Compare two student names's and return low, equal, high.
    Pre  stu1 and stu2 are valid pointers to students
    Post return low (-1), equal (0), or high (+1)
*/

int  compareStu   (void* stu1, void* stu2)
{
//  Local Definitions
STUDENT s1 = *((STUDENT*)stu1);
    STUDENT s2 = *((STUDENT*)stu2);;

//  Statements
if ( s1.name < s2.name)
      return -1;

if ( s1.name == s2.name)
      return 0;

return +1;
}   // compareStu

我被告知我需要做一些具体的行动,但我也不理解它们,任何详细的解释或步骤都会非常有用:

“您只需将BST_TREE的compare元素设置为compareStu:      BST_TREE root = {0,cmp_by_name,0}; 然后,使用&amp; root作为树的根调用您的函数。这不是您提供的比较功能。您应该使用单个比较函数构建和搜索树;在不同时间使用不同的比较器会导致混乱。“(c)Jonathan Leffler

“如果您在创建树时将其设置为树中的比较,则您显示的代码将使用cmp_by_name()函数。我无法再向您显示;您没有显示所有代码和我不准备为你编写你的代码只是为了演示我是如何做的。我会注意到名称_retrieve()不适合你使用;你应该把名字以_开头作为'保留给实现'(它比那更细微,但不是很多,更简单的规则更容易记住)。你可以通过使用if(root == NULL)返回0来简化代码;否则如果(...)“ (c)Jonathan Leffler

因此:

1)如何在树中搜索名称?

/*  ====================== findStu ======================
    Finds a student and prints id and gpa.
    Pre  student id
    Post student data printed or error message
*/

void findStu (BST_TREE* tree)
{
//  Local Definitions
STUDENT  s;
STUDENT* stuPtr;

//  Statements
printf("Enter student name that you want to find: ");
fflush(stdin);
gets(s.name);
fflush(stdin);

stuPtr = (STUDENT*)BST_Retrieve (tree, &s);
if (stuPtr)
   {
    printf("Student id:   %04d\n",  stuPtr->id);
    printf("Student name: %s\n",    stuPtr->name);
    printf("Student gpa:  %4.1f\n", stuPtr->gpa);
   } // if
else
   printf("Student %s has NOT been found in the file\n", s.name);
}   // findStu

2)如何按名称对BST进行排序?我知道整数排序是如何工作的以及如何将值与彼此进行比较,但是我不知道名字。

1 个答案:

答案 0 :(得分:1)

按名称排序就像使用strcmp function

整数排序一样简单
int strcmp ( const char * str1, const char * str2 );

如果字符串相等则返回0,如果第一个字符串在词法上“更大”则返回0,否则返回-1。

您的compareStu函数应使用strcmp返回值。