#include
#include
#include
typedef struct
{
char Name[20]; //* 姓名
char NameChar; //* 姓的拼音的首字母
int Age; //* 年龄
char Job[20]; //* 职业
char Friends[50][20]; //* 好友列表
}Person;
typedef struct
{
Person *data;
struct BSTree *lchild;
struct BSTree *rchild;
}BSTree;
void InsertBST(BSTree *T,Person P)
{
BSTree *s = (BSTree *)malloc(sizeof(BSTree));
if(!T)
{
s->lchild = s->rchild =NULL;
s->data->NameChar = P.NameChar;
strcpy(P.Name,s->data->Name);
T = s;
return 1;
}
else if(P.NameChar < s->data->NameChar)
InsertBST(T->lchild,P);
else if(P.NameChar > s->data->NameChar)
InsertBST(T->rchild,P);
}
void CreateBSTree(BSTree *T,int Num,Person *P)
{
T = NULL;
for(int i=0;iInsertBST(T,P[i]);
}
BSTree* SearchBST(BSTree *T,char c)
{
if(T==NULL||c==T->data->NameChar )
return T;
else if(c < T->data->NameChar)
SearchBST(T->lchild,c);
else
SearchBST(T->rchild,c);
}
void main()
{
/**初始化社交网络的节点的值**/
printf("请输入该社交网络中的人数:\n");
int Num; //* 社交网络中的人数
int i;
scanf("%d",&Num);
Person Pinfo[Num];
for(i=0;iprintf("请输入第%d个人的名字:\n",i+1);
scanf("%s",Pinfo[i].Name);
getchar();
printf("请输入%s的姓氏的拼音的首字母(小写):\n",Pinfo[i].Name);
scanf("%c",&Pinfo[i].NameChar);
printf("请输入%s的年龄:\n",Pinfo[i].Name);
scanf("%d",&Pinfo[i].Age);
printf("请输入%s的职业:\n",Pinfo[i].Name);
scanf("%s",Pinfo[i].Job);
getchar();
}
BSTree *T = malloc(sizeof(BSTree)*1);
CreateBSTree(T,Num,Pinfo); //* 构建一棵二叉排序数
/**查找二叉树**/
char c;
BSTree *t;
printf("请输入你要查找的对象的姓氏的首字母(小写)");
scanf("%c",c);
t = SearchBST(T,c);
if(t)
printf("查找成功,结果为%\n",t->data->Name);
else
printf("查找失败\n");
system("pause");
}
修改完善如下,改动处见注释,供参考:
#include<string.h>
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
char Name[20]; //* 姓名
char NameChar; //* 姓的拼音的首字母
int Age; //* 年龄
char Job[20]; //* 职业
char Friends[50][20]; //* 好友列表
}Person;
typedef struct _BSTree //修改
{
Person* data;
struct _BSTree* lchild; //修改
struct _BSTree* rchild; //修改
}BSTree;
void InsertBST(BSTree** T, Person P) //修改
{
//BSTree* s = (BSTree*)malloc(sizeof(BSTree)); //修改
if (!(*T)) //修改
{
(*T) = (BSTree*)malloc(sizeof(BSTree)); //修改
(*T)->lchild = (*T)->rchild = NULL; //s->lchild = s->rchild = NULL; 修改
Person* s = (Person*)malloc(sizeof(Person)); //修改
s->NameChar = P.NameChar; //s->data->NameChar = P.NameChar; 修改
strcpy(s->Name, P.Name); //strcpy(P.Name, s->data->Name); 修改
(*T)->data = s; //T = s; 修改
return; // 1; 修改
}
else if (P.NameChar < (*T)->data->NameChar) //(P.NameChar < s->data->NameChar) 修改
InsertBST(&(*T)->lchild, P);
else if (P.NameChar > (*T)->data->NameChar) //(P.NameChar > s->data->NameChar) 修改
InsertBST(&(*T)->rchild, P); //修改
}
void CreateBSTree(BSTree** T, int Num, Person* P) //修改
{
(*T) = NULL; //修改
for (int i = 0; i < Num; i++)
InsertBST(&(*T), P[i]); //修改
}
BSTree* SearchBST(BSTree* T, char c)
{
if (T == NULL || c == T->data->NameChar)
return T;
else if (c < T->data->NameChar)
SearchBST(T->lchild, c);
else
SearchBST(T->rchild, c);
}
void main()
{
/**初始化社交网络的节点的值**/
printf("请输入该社交网络中的人数:\n");
int Num; //* 社交网络中的人数
int i;
scanf("%d", &Num);
Person Pinfo[100]; //修改 Person Pinfo[Num];
for (i = 0; i < Num; i++)
{
printf("请输入第%d个人的名字:\n", i + 1);
scanf("%s", Pinfo[i].Name);
getchar();
printf("请输入%s的姓氏的拼音的首字母(小写):\n", Pinfo[i].Name);
scanf("%c", &Pinfo[i].NameChar);
printf("请输入%s的年龄:\n", Pinfo[i].Name);
scanf("%d", &Pinfo[i].Age);
printf("请输入%s的职业:\n", Pinfo[i].Name);
scanf("%s", Pinfo[i].Job);
getchar();
}
BSTree* T = NULL; //(BSTree*)malloc(sizeof(BSTree)); //BSTree* T = malloc(sizeof(BSTree) * 1); 修改
CreateBSTree(&T, Num, Pinfo); //修改
/**查找二叉树**/
char c;
BSTree* t;
printf("请输入你要查找的对象的姓氏的首字母(小写):");
scanf(" %c", &c); //修改
t = SearchBST(T, c);
if (t)
printf("查找成功,结果为%s\n", t->data->Name);
else
printf("查找失败\n");
system("pause");
}
你应该先判断s->data是否为为空