C語言實(shí)現(xiàn)樹的動(dòng)態(tài)查找實(shí)例代碼
C語言實(shí)現(xiàn)樹的動(dòng)態(tài)查找實(shí)例代碼
本例演示一種樹數(shù)據(jù)結(jié)構(gòu)存儲(chǔ)記錄集合時(shí)的動(dòng)態(tài)查找方法。首先程序通過construct()函數(shù),利用已經(jīng)存在的結(jié)構(gòu)體數(shù)組數(shù)據(jù)建立一個(gè)二叉樹,建立樹的過程中,要保證每個(gè)節(jié)點(diǎn)的值都大于它的左子樹上節(jié)點(diǎn)的值而小于它右子樹所有節(jié)點(diǎn)的值,該函數(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("請(qǐng)輸入要查找的人的名字\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("請(qǐng)輸入該人姓名:\n"); scanf("%s",swap); strcpy(temp->name,swap); printf("請(qǐng)輸入該人所在城市:\n"); scanf("%s",swap); strcpy(temp->city,swap); printf("請(qǐng)輸入該人性別[Male/Female]:\n"); scanf("%s",swap); strcpy(temp->sex,swap); printf("請(qǐng)輸入該人年齡:\n"); scanf("%s",swap); strcpy(temp->age,swap); printf("請(qǐng)輸入該人工作:\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; }
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
圖解C++的STL之stack和queue,輕松理解數(shù)據(jù)結(jié)構(gòu)
聚焦?C++?的?STL?中的?stack?和?queue,讓數(shù)據(jù)結(jié)構(gòu)變得簡(jiǎn)單有趣!?通過圖解的方式,我們將輕松理解這兩個(gè)重要的數(shù)據(jù)結(jié)構(gòu),準(zhǔn)備好開啟?STL?學(xué)習(xí)之旅了嗎?讓我們一起探索?stack?和?queue?的奧秘吧!2024-03-03C++實(shí)現(xiàn)修改函數(shù)代碼HOOK的封裝方法
這篇文章主要介紹了C++實(shí)現(xiàn)修改函數(shù)代碼HOOK的封裝方法,有助于深入了解C++的HOOK原理,需要的朋友可以參考下2014-10-10使用c++編程實(shí)現(xiàn)簡(jiǎn)單的打字小游戲
這篇文章主要為大家介紹了使用c++編程語言來實(shí)現(xiàn)一個(gè)非常簡(jiǎn)單的打字小游戲過程實(shí)現(xiàn)的示例代碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-10-10C語言文件操作中 fgets與fputs 函數(shù)詳解
這篇文章主要介紹了C語言文件操作中 fgets與fputs 函數(shù)詳解的相關(guān)資料,需要的朋友可以參考下2017-06-06詳解C++設(shè)計(jì)模式編程中對(duì)訪問者模式的運(yùn)用
這篇文章主要介紹了C++設(shè)計(jì)模式編程中對(duì)訪問者模式的運(yùn)用,訪問者模式在不破壞類的前提下為類提供增加新的新操作,需要的朋友可以參考下2016-03-03詳解C++中動(dòng)態(tài)內(nèi)存管理和泛型編程
這篇文章主要為大家詳細(xì)介紹了C++中動(dòng)態(tài)內(nèi)存管理和泛型編程的相關(guān)資料,文中示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C++具有一定幫助,感興趣的小伙伴快跟隨小編一起學(xué)習(xí)一2022-10-10