修改宠物俱乐部程序,使所有同名的宠物存储在相同节点中的一个列表中。当用户选择查找一个宠物时,程序要求用户给出宠物名,而后列出所有具有此名字的宠物(连同它们的种类)。
//petclub.c #include <stdio.h> #include <string.h> #include <ctype.h> #include "tree.h" #define LMAX 100 char menu(void); void display(Node *node); int main(void) { char choice; Tree pets; Item temp; InitializeTree(&pets); while ((choice = menu()) != 'q') { switch (choice) { case 'a' : puts("Please enter name of pet:"); gets(temp.petname); puts("Please enter pet kind:"); gets(temp.petkind[0]); temp.times = 1; if ( AddItem(&temp, &pets) == true ) printf("%s %s has been added\n", temp.petname, temp.petkind[0]); else puts("add error!"); break; case 'l' : if (TreeItemCount(&pets) >0 ) Traverse (&pets, display); else puts("there is no pets\n"); break; case 'f' : gets(temp.petname); DisplayItem(&temp, &pets); break; case 'n' : printf("%d pets in club\n", TreeItemCount(&pets)); break; case 'd' : gets(temp.petname); if( DeleteItem(&temp, &pets) == true) printf("%s has been deleted\n", temp.petname); else puts("the pet is not in the tree"); break; default : puts("Switching error"); } } DeleteAll(&pets); puts("Bye."); return 0; } char menu(void) { int ch; puts("Nerfville Pet Club Membership Program"); puts("Enter the letter corresponding to your choice:"); puts("a) add a pet l) show list of pets"); puts("n) number of pets f) find pets"); puts("d) delete a pet q) quit"); while ((ch = getchar()) != EOF) { while (getchar() != '\n') /* discard rest of line */ continue; ch = tolower(ch); if (strchr("alrfndq",ch) == NULL) puts("Please enter an a, l, f, n, d, or q:"); else break; } if (ch == EOF) /* make EOF cause program to quit */ ch = 'q'; return ch; } *************************************************************************************************************************************************************************** //tree.c #include <stdio.h> #include <string.h> #include <stdlib.h> #include "tree.h" void InorderTraversal( Node *pnode, void (* pfun)(void *) );//中序遍历:左中右 void PostorderTraversal( Node *pnode, void (* pfun)(void *) );//后序遍历:左右中 int PreorderTraversal( Node *pnode );//前序遍历:中左右 Node** BinarySearch(Item *pitem, Node **ppnode);//二分搜索,搜索到空位或匹配的结点,并返回指向该空位或结点指针的地址 Node* MakeNode(Item item);//产生一个叶子结点 int CompareItem(Item ,Item );//比较两个Item void display(Node *pnode); void InitializeTree(Tree * ptree) { ptree->root = NULL; } bool TreeIsEmpty(const Tree * ptree) { if (ptree->root == NULL) return true; else return false; } bool TreeIsFull(void) { Node *p; p = malloc( sizeof(Node) ) ; if (p == NULL) return true; free(p); return false; } int TreeItemCount(const Tree * ptree) { return PreorderTraversal( ptree->root );//前续遍历:中左右 } bool AddItem( Item *pitem, Tree * ptree) { Node *pnode; int i; if ( TreeIsFull() ) return false; pnode = *BinarySearch(pitem, &(ptree->root) ); if ( pnode != NULL) { for(i=0; i < pnode->item.times; i++) if ( strcmp( pnode->item.petkind[i] , (*pitem).petkind[0] ) == 0 ) return false; strcpy ( pnode->item.petkind[pnode->item.times] , (*pitem).petkind[0] ); (pnode->item.times)++; return true; } else { *BinarySearch(pitem, &(ptree->root) ) = MakeNode(*pitem); return true; } } bool InTree( Item * pitem, Tree * ptree) { if ( *BinarySearch(pitem, &(ptree->root) ) == NULL) return false; else return true; } bool DeleteItem( Item * pitem, Tree * ptree) { Node **ppnode; Node *middle,*left,*right; ppnode = BinarySearch( pitem, &(ptree->root) ); if (*ppnode == NULL) return false; middle = *ppnode; left = middle->left; right = middle->right; if (left == NULL && right ==NULL) //叶子结点 *ppnode = NULL; else if(left == NULL && right !=NULL) *ppnode = right; else if(left != NULL && right ==NULL) *ppnode = left; else { while(left->right != NULL) left = left->right ; left->right = right; *ppnode = middle->left; } free(middle); return true; } void Traverse (const Tree * ptree, void (* pfun)(Node *node)) { InorderTraversal(ptree->root, (* pfun) ); } void DeleteAll(Tree * ptree) { PostorderTraversal(ptree->root, free ); ptree->root = NULL; } bool DisplayItem( Item * pitem, Tree * ptree) { Node *pnode = *BinarySearch(pitem, &(ptree->root) ); if ( pnode == NULL) { puts("the word is not in the tree"); return false; } else { display(pnode); return true; } } //以下 是一些上面调用子函数 void InorderTraversal( Node *pnode, void (* pfun)(void *) )//中序遍历:左中右 { if (pnode != NULL) { InorderTraversal(pnode->left, (* pfun) ); (* pfun)(pnode); InorderTraversal(pnode->right, (* pfun) ); } } void PostorderTraversal( Node *pnode, void (* pfun)(void *) )//后续遍历:左右中 { if (pnode != NULL) { PostorderTraversal(pnode->left, (* pfun) ); PostorderTraversal(pnode->right, (* pfun) ); (* pfun)(pnode); } } int PreorderTraversal( Node *pnode )//前续遍历:中左右 { if (pnode != NULL) return pnode->item.times+PreorderTraversal(pnode->left )+PreorderTraversal(pnode->right ); else return 0; } Node** BinarySearch(Item *pitem, Node **ppnode)//二分搜索,搜索到空位或匹配的结点 { if( *ppnode == NULL || CompareItem(*pitem, (*ppnode)->item) == 0) return ppnode; if ( CompareItem(*pitem, (*ppnode)->item) < 0 ) return BinarySearch(pitem, &( (*ppnode)->left)) ; else return BinarySearch(pitem, &( (*ppnode)->right)) ; } Node* MakeNode(Item item) { Node *pnew; pnew = (Node *)malloc(sizeof(Node)); pnew->item = item; pnew->left = NULL; pnew->right = NULL; return pnew; } int CompareItem(Item item1, Item item2) { return strcmp(item1.petname, item2.petname); } void display(Node *pnode) { int i; printf("%-15s", pnode->item.petname); if ( pnode->item.times == 1) printf("%d kind pet: ", 1); else printf("%d kinds pet: ", pnode->item.times); for(i=0; i < pnode->item.times; i++) printf("%s,", pnode->item.petkind[i] ); printf("\b\n"); } ************************************************************************************************************************************************************************ //tree.h #ifndef _TREE_H_ #define _TREE_H_ #define MAX 30 #define TMAX 20 #define bool int #define true 1 #define false 0 typedef struct { char petname[MAX]; char petkind[TMAX][MAX]; int times; }Item; typedef struct node { Item item; struct node *left; struct node *right; }Node; typedef struct { struct node *root; }Tree; void InitializeTree(Tree * ptree); bool TreeIsEmpty(const Tree * ptree); bool TreeIsFull(void);//const Tree * ptree); int TreeItemCount(const Tree * ptree); bool AddItem( Item * pitem, Tree * ptree); bool InTree( Item * pi, Tree * ptree); bool DeleteItem( Item * pi, Tree * ptree); void Traverse (const Tree * ptree, void (* pfun)(Node *node)); void DeleteAll(Tree * ptree); bool DisplayItem( Item * pi, Tree * ptree); #endif
这道题你会答吗?花几分钟告诉大家答案吧!
扫描二维码,关注牛客网
下载牛客APP,随时随地刷题