首页 > 试题广场 >

修改宠物俱乐部程序,使所有同名的宠物存储在相同节点中的一个列

[问答题]

修改宠物俱乐部程序,使所有同名的宠物存储在相同节点中的一个列表中。当用户选择查找一个宠物时,程序要求用户给出宠物名,而后列出所有具有此名字的宠物(连同它们的种类)。

推荐
//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

发表于 2018-03-18 22:01:37 回复(0)