二叉排序树算法
1 #include "stdio.h" 2 #include "string.h" 3 #include "malloc.h" 4 5 struct Student{ 6 char Stu_Number[20];//学号 7 char Stu_Name[10];//姓名 8 char Stu_Bedroom[10];//房间号 9 }; 10 11 struct Student student[100]; 12 int Num ;//用于统计总个数 13 14 //输入数据 15 void Create(){ 16 struct Student temp; 17 int Continue; 18 Num = 0;//数据个数初始为0 19 while(1 ){ 20 printf("输入一个学生信息:\n"); 21 printf("学号:"); 22 scanf("%s",&temp.Stu_Number); 23 printf("姓名:"); 24 scanf("%s",&temp.Stu_Name); 25 printf("房间号:"); 26 scanf("%s",&temp.Stu_Bedroom); 27 student[Num++] = temp; 28 printf("\n"); 29 printf("继续|(1:Y,0:N):"); 30 scanf("%d",&Continue); 31 while(Continue!=1&&Continue!=0) 32 { 33 printf("请输入0|1:"); 34 scanf("%d",&Continue); 35 } 36 if(Continue==0) 37 { 38 printf("数据输入结束!\n"); 39 break; 40 } 41 } 42 } 43 44 45 struct Bnode{ 46 struct Student student; 47 Bnode *lchild; 48 Bnode *rchild; 49 }; 50 51 /* 52 *将指针S所指的结点插入到二叉排序树T中 关键字(房号+学号) 53 */ 54 void RoomNum_Number_insert( Bnode * &Tree, Bnode *S) 55 { 56 if(Tree==NULL)//若插入到空树时,插入结点为根结点 57 { 58 Tree = S; 59 }else if(strcmp(S->student.Stu_Bedroom,Tree->student.Stu_Bedroom)<0){ 60 RoomNum_Number_insert(Tree->lchild,S);//插入到Tree的左子树中 61 }else if(strcmp(S->student.Stu_Bedroom,Tree->student.Stu_Bedroom)>0){ 62 RoomNum_Number_insert(Tree->rchild,S);//插入到Tree的右子树中 63 }else if(strcmp(S->student.Stu_Bedroom,Tree->student.Stu_Bedroom)==0)//房号相同的情况下 再比较学号 64 { 65 if(strcmp(S->student.Stu_Number,Tree->student.Stu_Number)<0) 66 { 67 RoomNum_Number_insert(Tree->lchild,S);//插入到Tree的左子树中 68 }else RoomNum_Number_insert(Tree->rchild,S);//插入到Tree的右子树中 69 } 70 } 71 72 73 /* 74 *二叉排序树的构造 关键字(房号+学号) 75 */ 76 void RoomNum_Number_Create_bst(Bnode *&Tree) 77 { 78 int i=0; 79 Tree = NULL; 80 Student x; 81 while(i<Num) 82 { 83 x = student[i]; 84 Bnode *u; 85 u = ( Bnode *)malloc(sizeof(Bnode));//分配存储区域 86 u->student = x; 87 u->lchild = NULL; 88 u->rchild = NULL; 89 RoomNum_Number_insert(Tree,u); 90 i++; 91 } 92 printf("二叉排序树构造完毕!\n"); 93 } 94 95 96 /* 97 *查找某个房间号的所有人 关键字(房号+学号) 98 */ 99 void Room_Num_inorder(Bnode *Tree,char temp[]) 100 { 101 if(Tree!=NULL) 102 { 103 Room_Num_inorder(Tree->lchild,temp); 104 if (strcmp(Tree->student.Stu_Bedroom,temp)==0) 105 { 106 printf("房号:%s 学号:%s 姓名:%s\n",Tree->student.Stu_Bedroom,Tree->student.Stu_Number,Tree->student.Stu_Name); 107 } 108 Room_Num_inorder(Tree->rchild,temp); 109 } 110 } 111 112 113 /* 114 *将指针S所指的结点插入到二叉排序树T中 关键字(姓名+学号) 115 */ 116 void Name_Number_insert(Bnode * &Tree,Bnode *S) 117 { 118 if(Tree==NULL)//插入到空树时,插入结点为根结点 119 { 120 Tree = S; 121 }else if(strcmp(S->student.Stu_Name,Tree->student.Stu_Name)<0){ 122 Name_Number_insert(Tree->lchild,S);//插入到Tree的左子树中 123 }else if(strcmp(S->student.Stu_Name,Tree->student.Stu_Name)>0){ 124 Name_Number_insert(Tree->rchild,S);//插入到Tree的右子树中 125 }else if(strcmp(S->student.Stu_Name,Tree->student.Stu_Name)==0)//房号相同的情况下 再比较学号 126 { 127 if(strcmp(S->student.Stu_Number,Tree->student.Stu_Number)<0) 128 { 129 Name_Number_insert(Tree->lchild,S);//插入到Tree的左子树中 130 }else Name_Number_insert(Tree->rchild,S);//插入到Tree的右子树中 131 } 132 } 133 134 135 /* 136 *二叉排序树的构造 关键字(姓名+学号) 137 */ 138 void Name_Number_Create_bst(Bnode *&Tree) 139 { 140 int i=0; 141 Tree = NULL; 142 Student temp; 143 while(i<Num) 144 { 145 temp = student[i]; 146 Bnode *u; 147 u = (Bnode *)malloc(sizeof(Bnode));//分配存储区域 148 u->student = temp; 149 u->lchild = NULL; 150 u->rchild = NULL; 151 Name_Number_insert(Tree,u); 152 i++; 153 } 154 printf("二叉排序树构造完毕!\n"); 155 } 156 157 158 /* 159 *查找同名的所有人 关键字(姓名+学号) 160 */ 161 void Name_Num_inorder(Bnode *Tree,char temp[]) 162 { 163 if(Tree!=NULL) 164 { 165 Name_Num_inorder(Tree->lchild,temp); 166 if (strcmp(Tree->student.Stu_Name,temp)==0) 167 { 168 printf("姓名:%s 学号:%s 房号:%s\n",Tree->student.Stu_Name,Tree->student.Stu_Number,Tree->student.Stu_Bedroom); 169 } 170 Name_Num_inorder(Tree->rchild,temp); 171 } 172 } 173 174 175 /* 176 *中序输出二叉排序树 177 */ 178 void inorder(Bnode *Tree) 179 { 180 if(Tree!=NULL) 181 { 182 inorder(Tree->lchild); 183 printf("房号:%s 学号:%s 姓名:%s\n",Tree->student.Stu_Bedroom,Tree->student.Stu_Number,Tree->student.Stu_Name); 184 inorder(Tree->rchild); 185 } 186 } 187 188 189 int main() 190 { 191 192 Bnode *Tree_Room_Number; 193 Tree_Room_Number = (Bnode *)malloc(sizeof(Bnode));//分配存储区域 194 Bnode *Tree_Name_Number; 195 Tree_Name_Number = (Bnode *)malloc(sizeof(Bnode));//分配存储区域 196 197 int Continue; 198 char name[20],room[20]; 199 while(1) 200 { 201 printf(" ------------------菜单---------------------\n"); 202 printf("|-----1:数据输入----------------------------|\n"); 203 printf("|-----2:二叉排序树(房号+学号)---------------|\n"); 204 printf("|-----3:查找同房号所有人--------------------|\n"); 205 printf("|-----4:二叉排序树(姓名+学号)---------------|\n"); 206 printf("|-----5:姓名查找同名的所有人----------------|\n"); 207 printf("|-----6:二叉排序树中序输出------------------|\n"); 208 printf(" -------------------------------------------\n"); 209 210 printf("请选择菜单:"); 211 scanf("%d",&Continue); 212 while(Continue!=1&&Continue!=2&&Continue!=3&&Continue!=4&&Continue!=5&&Continue!=6) 213 { 214 printf("请输入1|2|3|4|5|6:"); 215 scanf("%d",&Continue); 216 } 217 switch(Continue) 218 { 219 case 1: 220 Create(); 221 break; 222 case 2: 223 RoomNum_Number_Create_bst(Tree_Room_Number);//创建二叉排序树 关键字(房号+学号) 224 break; 225 case 3: 226 printf("输入房间号:"); 227 scanf("%s",&room); 228 Room_Num_inorder(Tree_Room_Number,room); 229 break; 230 case 4: 231 Name_Number_Create_bst(Tree_Name_Number);//创建二叉排序树 关键字(姓名+学号) 232 break; 233 case 5: 234 printf("输入姓名:"); 235 scanf("%s",&name); 236 Name_Num_inorder(Tree_Name_Number,name); 237 break; 238 case 6: 239 printf(" ------------查看(中序输出)-----------\n"); 240 printf("|-----1:二叉排序树(房号+学号)--------|\n"); 241 printf("|-----0:二叉排序树(姓名+学号)--------|\n"); 242 printf(" ------------------------------------\n"); 243 printf("请选择:"); 244 scanf("%d",&Continue); 245 while(Continue!=1&&Continue!=0) 246 { 247 printf("输入有误,请输入0|1:"); 248 scanf("%d",&Continue); 249 } 250 if(Continue==1) inorder(Tree_Room_Number); 251 else inorder(Tree_Name_Number); 252 break; 253 } 254 printf("\n1:主菜单,0:退出 :"); 255 scanf("%d",&Continue); 256 while(Continue!=1&&Continue!=0) 257 { 258 printf("输入有误,请输入0|1:"); 259 scanf("%d",&Continue); 260 } 261 if(Continue==0)break; 262 } 263 return 0; 264 }
宿舍管理查询软件(限2 人完成)
任务:为宿舍管理人员编写一个宿舍管理查询软件, 程序设计要求:
1) 输入数据 ,要求输入学号,姓名,房号。
2) 建立一棵二叉排序树。关键字(房号+学号)
3) 输入房号找到此房间的所有人,打印房号、学号、姓名
4) 建立一棵二叉排序树。关键字(姓名+学号)
5) 输入姓名找到同名的所有人,打印姓名、学号、房号
1 #include <iostream> 2 #include <string> 3 using namespace std; 4 5 enum error{rangeerror,overflow,underflow,success}; 6 7 struct Infor{ 8 string Number;//学号 9 string Name;//姓名 10 int Room_Num;//房间号 11 }; 12 13 struct node{ 14 Infor data; 15 node *next; 16 }; 17 18 class list{ 19 public: 20 list(); 21 int length() const;//求长度的函数 22 int get_int(const int i ,Infor & x)const;//按序号取元素运算函数 23 void create();//创建链表 24 private: 25 int count; 26 node * head; 27 }; 28 29 /* 30 *初始化对应的构造函数 31 */ 32 list::list(){ 33 head =new node; 34 head->next=NULL; 35 count=0; 36 } 37 38 /* 39 *求长度 40 */ 41 int list::length() const{ 42 return count; 43 } 44 45 46 /* 47 *创建链表,输入数据 48 */ 49 void list::create(){ 50 Infor Data; 51 bool flags = true;//是否继续输入数据标识 52 int select; 53 node * rear=head; 54 while(flags ){ 55 cout<<"请输入一组数据:"<<endl; 56 cout<<"学号:"; 57 cin>>Data.Number; 58 cout<<"姓名:"; 59 cin>>Data.Name; 60 cout<<"房间号:"; 61 cin>>Data.Room_Num; 62 cout<<endl; 63 count++; 64 node *s=new node; 65 s->data=Data; 66 rear->next=s; 67 rear=s; 68 rear->next=NULL; 69 70 cout<<"继续输入数据?|(1:继续,0不继续):"; 71 cin>>select; 72 while(select!=1&&select!=0) 73 { 74 cout<<"输入有误,请输入0|1:"; 75 cin>>select; 76 } 77 if(select==0) 78 { 79 flags = false; 80 cout<<"数据输入完毕!"<<endl; 81 } 82 } 83 } 84 85 /* 86 *按序号取元素 87 */ 88 int list::get_int(const int i,Infor &x)const{ 89 node *p=new node; 90 p=head->next; 91 int j=1; 92 while(p!=NULL&&j!=i){//当前节点不是目标节点,并且不空时就继续搜索 93 p=p->next; 94 j++; 95 } 96 if(p==NULL)return rangeerror; 97 else { 98 x=p->data; 99 return success; 100 } 101 } 102 103 struct Bnode{ 104 Infor data; 105 Bnode *lchild; 106 Bnode *rchild; 107 }; 108 109 110 //---------------------关键字(房号+学号)------------------- 111 /* 112 *将指针S所指的结点插入到二叉排序树T中 关键字(房号+学号) 113 */ 114 void RoomNum_Number_insert(Bnode * &Tree,Bnode *S) 115 { 116 if(Tree==NULL)//插入到空树时,插入结点为根结点 117 { 118 Tree = S; 119 }else if(S->data.Room_Num<Tree->data.Room_Num){ 120 RoomNum_Number_insert(Tree->lchild,S);//插入到Tree的左子树中 121 }else if(S->data.Room_Num>Tree->data.Room_Num){ 122 RoomNum_Number_insert(Tree->rchild,S);//插入到Tree的右子树中 123 }else if(S->data.Room_Num==Tree->data.Room_Num)//房号相同的情况下 再比较学号 124 { 125 if(S->data.Number<Tree->data.Number) 126 { 127 RoomNum_Number_insert(Tree->lchild,S);//插入到Tree的左子树中 128 }else RoomNum_Number_insert(Tree->rchild,S);//插入到Tree的右子树中 129 } 130 } 131 132 /* 133 *二叉排序树的构造 关键字(房号+学号) 134 */ 135 void RoomNum_Number_Create_bst(list A,Bnode *&Tree) 136 { 137 int i=0; 138 Tree = NULL; 139 Infor x; 140 while(i<A.length()) 141 { 142 A.get_int(i+1,x); 143 Bnode *u = new Bnode; 144 u->data = x; 145 u->lchild = NULL; 146 u->rchild = NULL; 147 RoomNum_Number_insert(Tree,u); 148 i++; 149 } 150 cout<<"二叉排序树构造完毕!"<<endl; 151 } 152 153 /* 154 *查找某个房间号的所有人 关键字(房号+学号) 155 */ 156 void Room_Num_inorder(Bnode *Tree,int x) 157 { 158 if(Tree!=NULL) 159 { 160 Room_Num_inorder(Tree->lchild,x); 161 if (Tree->data.Room_Num == x) 162 { 163 cout<<"房号:"<<Tree->data.Room_Num <<" 学号:"<<Tree->data.Number<<" 姓名:"<<Tree->data.Name<<endl; 164 } 165 Room_Num_inorder(Tree->rchild,x); 166 } 167 } 168 169 //---------------------关键字(房号+学号)------------------- 170 171 172 173 //---------------------关键字(姓名+学号)------------------- 174 /* 175 *将指针S所指的结点插入到二叉排序树T中 关键字(姓名+学号) 176 */ 177 void Name_Number_insert(Bnode * &Tree,Bnode *S) 178 { 179 if(Tree==NULL)//插入到空树时,插入结点为根结点 180 { 181 Tree = S; 182 }else if(S->data.Name<Tree->data.Name){ 183 Name_Number_insert(Tree->lchild,S);//插入到Tree的左子树中 184 }else if(S->data.Name>Tree->data.Name){ 185 Name_Number_insert(Tree->rchild,S);//插入到Tree的右子树中 186 }else if(S->data.Name==Tree->data.Name)//房号相同的情况下 再比较学号 187 { 188 if(S->data.Number<Tree->data.Number) 189 { 190 Name_Number_insert(Tree->lchild,S);//插入到Tree的左子树中 191 }else Name_Number_insert(Tree->rchild,S);//插入到Tree的右子树中 192 } 193 } 194 195 /* 196 *二叉排序树的构造 关键字(姓名+学号) 197 */ 198 void Name_Number_Create_bst(list A,Bnode *&Tree) 199 { 200 int i=0; 201 Tree = NULL; 202 Infor x; 203 while(i<A.length()) 204 { 205 A.get_int(i+1,x); 206 Bnode *u = new Bnode; 207 u->data = x; 208 u->lchild = NULL; 209 u->rchild = NULL; 210 Name_Number_insert(Tree,u); 211 i++; 212 } 213 cout<<"二叉排序树构造完毕!"<<endl; 214 } 215 216 /* 217 *查找同名的所有人 关键字(姓名+学号) 218 */ 219 void Name_Num_inorder(Bnode *Tree,string x) 220 { 221 if(Tree!=NULL) 222 { 223 Name_Num_inorder(Tree->lchild,x); 224 if (Tree->data.Name == x) 225 { 226 cout<<"姓名:"<<Tree->data.Name<<" 学号:"<<Tree->data.Number<<" 房号:"<<Tree->data.Room_Num<<endl; 227 } 228 Name_Num_inorder(Tree->rchild,x); 229 } 230 } 231 232 //---------------------关键字(姓名+学号)------------------- 233 234 235 /* 236 *中序输出 237 */ 238 void inorder(Bnode *Tree) 239 { 240 if(Tree!=NULL) 241 { 242 inorder(Tree->lchild); 243 cout<<"房号:"<<Tree->data.Room_Num <<" 学号:"<<Tree->data.Number<<" 姓名:"<<Tree->data.Name<<endl; 244 inorder(Tree->rchild); 245 } 246 } 247 248 249 int main() 250 { 251 252 Bnode *Room_Number_Tree =new Bnode; 253 Bnode *Name_Number_Tree =new Bnode; 254 list A; 255 int room,select; 256 string name; 257 bool flags = true; 258 while(flags) 259 { 260 cout<<" ------------------菜单---------------------\n"; 261 cout<<"|-----1:输入数据----------------------------|\n"; 262 cout<<"|-----2:建立二叉排序树(房号+学号)-----------|\n"; 263 cout<<"|-----3:输入房号查找同房号所有人------------|\n"; 264 cout<<"|-----4:建立二叉排序树(姓名+学号)-----------|\n"; 265 cout<<"|-----5:输入姓名查找同名的所有人------------|\n"; 266 cout<<"|-----6:二叉排序树中序输出------------------|\n"; 267 cout<<" -------------------------------------------\n"; 268 cout<<"提示:"<<endl; 269 cout<<" 1.数据只需输入一遍即可\n"; 270 cout<<" 2.二叉排序树建立一遍即可\n"; 271 cout<<" 3.顺序:输入数据,建立二叉排序树,再查找\n"; 272 cout<<" -------------------------------------------\n"; 273 cout<<"请选择菜单:"; 274 cin>>select; 275 while(select!=1&&select!=2&&select!=3&&select!=4&&select!=5&&select!=6) 276 { 277 cout<<"输入有误,请输入1|2|3|4|5|6:"; 278 cin>>select; 279 } 280 switch(select) 281 { 282 case 1: 283 A.create(); 284 break; 285 case 2: 286 RoomNum_Number_Create_bst(A,Room_Number_Tree);//创建二叉排序树 关键字(房号+学号) 287 break; 288 case 3: 289 cout<<"输入房间号:"; 290 cin>>room; 291 Room_Num_inorder(Room_Number_Tree,room); 292 break; 293 case 4: 294 Name_Number_Create_bst(A,Name_Number_Tree);//创建二叉排序树 关键字(姓名+学号) 295 break; 296 case 5: 297 cout<<"输入姓名:"; 298 cin>>name; 299 Name_Num_inorder(Name_Number_Tree,name); 300 break; 301 case 6: 302 cout<<" ------------查看(中序输出)-----------\n"; 303 cout<<"|-----1:二叉排序树(房号+学号)--------|\n"; 304 cout<<"|-----0:二叉排序树(姓名+学号)--------|\n"; 305 cout<<" ------------------------------------\n"; 306 cout<<"请选择:"; 307 cin>>select; 308 while(select!=1&&select!=0) 309 { 310 cout<<"输入有误,请输入0|1:"; 311 cin>>select; 312 } 313 if(select==1) inorder(Room_Number_Tree); 314 else inorder(Name_Number_Tree); 315 break; 316 } 317 cout<<"\n1:返回菜单,0:退出 :"; 318 cin>>select; 319 while(select!=1&&select!=0) 320 { 321 cout<<"输入有误,请输入0|1:"; 322 cin>>select; 323 } 324 if(select==0)flags = false; 325 } 326 return 0; 327 }