#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関数はツリーの右側にのみデータを追加し、左側には追加しないことに気付きました。比較関数が行っているのは、入力の同じ値を比較することです。私が望むのは、比較関数がルート値と追加したい値を比較して、データをどちら側に追加する必要があるかを判断することです。この問題を修正してください。このコードが長すぎる場合は申し訳ありません。コード レビューにも投稿しましたが、コードが完全ではないため、ここに投稿する方が適切と思われます。