C語言實現(xiàn)樹的動態(tài)查找實例代碼
C語言實現(xiàn)樹的動態(tài)查找實例代碼
本例演示一種樹數(shù)據(jù)結(jié)構(gòu)存儲記錄集合時的動態(tài)查找方法。首先程序通過construct()函數(shù),利用已經(jīng)存在的結(jié)構(gòu)體數(shù)組數(shù)據(jù)建立一個二叉樹,建立樹的過程中,要保證每個節(jié)點的值都大于它的左子樹上節(jié)點的值而小于它右子樹所有節(jié)點的值,該函數(shù)返回建立樹的根指針;然后通過函數(shù)Search(root,name)查找,如果找到相應(yīng)的數(shù)據(jù),將其打印出來,如果沒有找到,則用戶可以選擇是否將該數(shù)據(jù)插入到樹中。
具體代碼如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NUM 4
struct tree
{
char name[20];
char city[20];
char sex[10];
char age[10];
char job[10];
struct tree *left;
struct tree *right;
};
struct tree Datas[NUM]=
{
"Willing","Tianjing","Female","21","worker",NULL,NULL,
"Tom","Beijing","Male","31","doctor",NULL,NULL,
"Sun","Weifang","Male","24","student",NULL,NULL,
"Marry","Shanghai","Female","19","techer",NULL,NULL
};
struct tree *construct(
struct tree *root,
struct tree *r,
struct tree *Data)
{
if(!r)
{
r = (struct tree *)malloc(sizeof(struct tree));
if(!r)
{
printf("內(nèi)存分配失??!");
exit(0);
}
r->left = NULL;
r->right = NULL;
strcpy(r->name,Data->name);
strcpy(r->city,Data->city);
strcpy(r->sex,Data->sex);
strcpy(r->age,Data->age);
strcpy(r->job,Data->job);
if(!root)
return r;
if(strcmp(Data->name,root->name)<0)
root->left = r;
else
root->right = r;
return r;
}
if(strcmp(Data->name,r->name)<0)
construct(r,r->left,Data);
else
construct(r,r->right,Data);
return root;
}
struct tree *Search(root,name)
struct tree *root;
char name[];
{
struct tree *p;
if(root == NULL)
printf("該樹為空\n");
p = root;
while(strcmp(p->name,name)!=0)
{
if(strcmp(p->name,name)>0)
p = p->left;
else
p = p->right;
if(p == NULL)
break;
}
return(p);
}
void print(struct tree *r)
{
if(!r)
return;
print(r->left);
printf("%s\n",r->name);
print(r->right);
}
void print_currentData(struct tree *point)
{
if(point == NULL)
return;
printf(" 姓名:%s\n",point->name);
printf(" 城市:%s\n",point->city);
printf(" 性別:%s\n",point->sex);
printf(" 年齡:%s\n",point->age);
printf(" 工作:%s\n",point->job);
}
int main(void)
{
int i;
char c[10];
char swap[20];
char name[20];
struct tree *root,*p;
struct tree *temp;
p = NULL;
temp = NULL;
root = NULL;
for(i = 0;i<NUM;i++)
root =construct(root,root,&Datas[i]);
printf("現(xiàn)有人員資料:\n");
print(root);
printf("請輸入要查找的人的名字\n");
scanf("%s",name);
p = Search(root,name);
if(p == NULL)
{
printf("沒有該人資料\n");
printf("是否要插入該人資料[y/n]\n");
scanf("%s",c);
if(strcmp(c,"y")==0)
{
temp = (struct tree *)malloc(sizeof(struct tree));
if(!temp)
{
printf("內(nèi)存分配失??!");
exit(0);
}
printf("請輸入該人姓名:\n");
scanf("%s",swap);
strcpy(temp->name,swap);
printf("請輸入該人所在城市:\n");
scanf("%s",swap);
strcpy(temp->city,swap);
printf("請輸入該人性別[Male/Female]:\n");
scanf("%s",swap);
strcpy(temp->sex,swap);
printf("請輸入該人年齡:\n");
scanf("%s",swap);
strcpy(temp->age,swap);
printf("請輸入該人工作:\n");
scanf("%s",swap);
strcpy(temp->job,swap);
temp->left = NULL;
temp->right = NULL;
root =construct(root,root,temp);
print_currentData(temp);
printf("現(xiàn)有人員資料:\n");
root = root;
print(root);
}
else
return 0;
}
print_currentData(p);
return 1;
}
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關(guān)文章
圖解C++的STL之stack和queue,輕松理解數(shù)據(jù)結(jié)構(gòu)
聚焦?C++?的?STL?中的?stack?和?queue,讓數(shù)據(jù)結(jié)構(gòu)變得簡單有趣!?通過圖解的方式,我們將輕松理解這兩個重要的數(shù)據(jù)結(jié)構(gòu),準(zhǔn)備好開啟?STL?學(xué)習(xí)之旅了嗎?讓我們一起探索?stack?和?queue?的奧秘吧!2024-03-03
C++實現(xiàn)修改函數(shù)代碼HOOK的封裝方法
這篇文章主要介紹了C++實現(xiàn)修改函數(shù)代碼HOOK的封裝方法,有助于深入了解C++的HOOK原理,需要的朋友可以參考下2014-10-10
C語言文件操作中 fgets與fputs 函數(shù)詳解
這篇文章主要介紹了C語言文件操作中 fgets與fputs 函數(shù)詳解的相關(guān)資料,需要的朋友可以參考下2017-06-06

