1
    #include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>

#include "BST_ADT.h"


// Structure
typedef struct
    {
        char* name;
        char* market;
        char* initial;
        float stock;
    }COMPANY;

// Prototype Delarations
void addComp    (BST_TREE* list);
void deleteComp (BST_TREE* list);
void findComp   (BST_TREE* list);
void printList (BST_TREE* list);
int  compareComp (void* Comp1, void* Comp2);
void processComp (void* dataPtr);


int main (void)
{
// Local Definitions
   BST_TREE* list;

// Statements
   list = BST_Create(compareComp);
   addComp(list);
   deleteComp(list);
   findComp (list);
   printList(list);

    return 0;
}


/*===================== addComp =========================*/

void addComp    (BST_TREE* list)
{
// Local Declarations
   COMPANY* CompPtr;
   FILE* fp;
   char fileName[25];
   char buffer [100];
   char* tempString;
// Statements

   CompPtr = (COMPANY*)malloc (sizeof (COMPANY));
   CompPtr->name = (char*) malloc(128 * sizeof(char));
   CompPtr->market = (char*) malloc(128 * sizeof(char));
   CompPtr->initial = (char*) malloc(128 * sizeof(char));
   tempString = (char*) malloc(128 * sizeof(char));

   printf("Enter the file name: ");
           gets(fileName);
           fp = fopen(fileName, "r");
           if(fp == NULL)
           {
              printf("Error cannot open the file!\n");
              exit(101);
           }
   while(fgets(buffer, 100, fp) != NULL)
        {
            if (!CompPtr)
                printf("MEmory overflow!\n"), exit(101);
            strcpy(tempString, strchr(buffer, ';') + 2);
            CompPtr->name = strtok(buffer, ";");
            sscanf(tempString, "%15s   %15s    %f ", CompPtr->market, CompPtr->initial, &(CompPtr->stock));
            BST_Insert(list, CompPtr);
        } // end while

} //addComp

/*===================== deleteComp =========================*/

void deleteComp (BST_TREE* list)
{
// local definitions
   char name[100];
   char* namePtr = (char*) malloc(128 * sizeof(char));
   namePtr = name;
// statements
   printf("Enter Company name: ");
   scanf ("%39s", namePtr);
   if (!BST_Delete (list, namePtr))
       printf("ERROR: No Company: %0\n", *namePtr);
   else
       BST_Delete(list, namePtr);
} // deleteComp


/*===================== findComp =========================*/

void findComp   (BST_TREE* list)
{
// Local Definitions
   char initial[15];
   COMPANY* CompPtr;

// Statements
   printf("Enter Company initial: ");
   scanf("%s", initial);
   CompPtr = (COMPANY*)BST_Retrieve (list, &initial);
   if (CompPtr)
      {
        printf("Company name:  %s", initial);
        printf("market name:  %s", *CompPtr->market);
        printf("company's initial:  %s", *CompPtr->initial);
        printf("stock price is:  %f", CompPtr->stock);
      } // if
   else
       printf("Company %s not in the file\n", initial);



}

/*===================== printList =========================*/

void printList (BST_TREE* list)
{
// Statements
   printf("\nCOMPANY list:\n");
   BST_Traverse(list, processComp);
   printf("end of COMPANY list\n");
   return;
} // printList


/*===================== compareComp =========================*/

int  compareComp (void* Comp1, void* Comp2)
{
// Local definitions
   COMPANY s1;
   COMPANY s2;

// Statements
   s1 = *(COMPANY*)Comp1;
   s2 = *(COMPANY*)Comp2;

   if (s1.initial < s2.initial)
       return -1;
   if (s1.initial == s2.initial)
       return 0;
   return +1;
} // compareComp

/*===================== processComp =========================*/

void processComp (void* CompPtr)
{
// Local Definitions
    COMPANY aComp;

// Statements
    aComp = *(COMPANY*) CompPtr;
    printf("%20s  %20s  %20s  %4.1f\n", *aComp.name, aComp.market, aComp.initial, aComp.stock);

    return;
} // processComp

このコードでは、テキスト ファイルからバイナリ ツリーにデータを挿入しようとしています。データを CompPtr に読み込むことができましたが、それを BST_Insert 関数に渡したときに、BST ツリーに何も読み込まれませんでした。データが BST ツリーに追加されないのはなぜですか? 助けてくれてありがとう。

これは私の BST_Insert ADT 関数です

/*===================== BST_Insert =========================*/

bool BST_Insert (BST_TREE* tree, void* DATA)
{
NODE* newPtr;

newPtr = (NODE*)malloc(sizeof(NODE));
if (!newPtr)
return false;

newPtr->right = NULL;
newPtr->left = NULL;
newPtr->dataPtr = DATA;

if (tree->count == 0)
tree->root = newPtr;
else
_insert(tree, tree->root, newPtr);

(tree->count)++;
return true;
}

/*===================== _insert =========================*/

NODE* _insert (BST_TREE* tree, NODE* root, NODE* newPtr)
{

if (!root)
return newPtr;
if (tree->compare(newPtr->dataPtr,
root->dataPtr) < 0)
{
root->left = _insert(tree, root->left, newPtr);
return root;
}
else
{
root->right = _insert(tree, root->right, newPtr);
return root;
}
return root;
} 

しばらくデバッグした後、2つのパラメーターが等しいため、比較関数が実行されるたびに0が返されるため、_insert関数はツリーの右側にのみデータを追加し、左側には追加しないことに気付きました。比較関数が行っているのは、入力の同じ値を比較することです。私が望むのは、比較関数がルート値と追加したい値を比較して、データをどちら側に追加する必要があるかを判断することです。この問題を修正してください。このコードが長すぎる場合は申し訳ありません。コード レビューにも投稿しましたが、コードが完全ではないため、ここに投稿する方が適切と思われます。

4

0 に答える 0