当前位置:嗨网首页>书籍在线阅读

22-使用二叉树

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

17.7.4 使用二叉树

现在,有了接口和函数的实现,就可以使用它们了。程序清单17.12中的程序以菜单的方式提供选择:向俱乐部成员花名册添加宠物、显示成员列表、报告成员数量、核实成员及退出。 main() 函数很简单,主要提供程序的大纲。具体工作主要由支持函数来完成。

程序清单17.12  petclub.c 程序

/* petclub.c -- 使用二叉查找树 */
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include "tree.h"
char menu(void);
void addpet(Tree * pt);
void droppet(Tree * pt);
void showpets(const Tree * pt);
void findpet(const Tree * pt);
void printitem(Item item);
void uppercase(char * str);
char * s_gets(char * st, int n);
int main(void)
{
     Tree pets;
     char choice;
     InitializeTree(&pets);
     while ((choice = menu()) != 'q')
     {
          switch (choice)
          {
          case 'a':  addpet(&pets);
               break;
          case 'l':  showpets(&pets);
               break;
          case 'f':  findpet(&pets);
               break;
          case 'n':  printf("%d pets in club\n",
               TreeItemCount(&pets));
               break;
          case 'd':  droppet(&pets);
               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')  /* 处理输入行的剩余内容 */
               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)       /* 使程序退出 */
          ch = 'q';
     return ch;
}
void addpet(Tree * pt)
{
     Item temp;
     if (TreeIsFull(pt))
          puts("No room in the club!");
     else
     {
          puts("Please enter name of pet:");
          s_gets(temp.petname, SLEN);
          puts("Please enter pet kind:");
          s_gets(temp.petkind, SLEN);
          uppercase(temp.petname);
          uppercase(temp.petkind);
          AddItem(&temp, pt);
     }
}
void showpets(const Tree * pt)
{
     if (TreeIsEmpty(pt))
          puts("No entries!");
     else
          Traverse(pt, printitem);
}
void printitem(Item item)
{
     printf("Pet: %-19s  Kind: %-19s\n", item.petname,item.petkind);
}
void findpet(const Tree * pt)
{
     Item temp;
     if (TreeIsEmpty(pt))
     {
          puts("No entries!");
          return;     /* 如果树为空,则退出该函数 */
     }
     puts("Please enter name of pet you wish to find:");
     s_gets(temp.petname, SLEN);
     puts("Please enter pet kind:");
     s_gets(temp.petkind, SLEN);
     uppercase(temp.petname);
     uppercase(temp.petkind);
     printf("%s the %s ", temp.petname, temp.petkind);
     if (InTree(&temp, pt))
          printf("is a member.\n");
     else
          printf("is not a member.\n");
}
void droppet(Tree * pt)
{
     Item temp;
     if (TreeIsEmpty(pt))
     {
          puts("No entries!");
          return;     /* 如果树为空,则退出该函数 */
     }
     puts("Please enter name of pet you wish to delete:");
     s_gets(temp.petname, SLEN);
     puts("Please enter pet kind:");
     s_gets(temp.petkind, SLEN);
     uppercase(temp.petname);
     uppercase(temp.petkind);
     printf("%s the %s ", temp.petname, temp.petkind);
     if (DeleteItem(&temp, pt))
          printf("is dropped from the club.\n");
     else
          printf("is not a member.\n");
}
void uppercase(char * str)
{
     while (*str)
     {
          *str = toupper(*str);
          str++;
     }
}
char * s_gets(char * st, int n)
{
     char * ret_val;
     char * find;
     ret_val = fgets(st, n, stdin);
     if (ret_val)
     {
          find = strchr(st, '\n'); // 查找换行符
          if (find)                // 如果地址不是 NULL,
               *find = '\0';       // 在此处放置一个空字符
          else
               while (getchar() != '\n')
                    continue;      // 处理输入行的剩余内容
     }
     return ret_val;
}

该程序把所有字母都转换为大写字母,所以 SNUFFYSnuffysnuffy 都被视为相同。下面是该程序的一个运行示例:

Nerfville Pet Club Membership Program
Enter the letter corresponding to your choice:
a) add a pet           l) show list of pets
n) number of pets      f) find pets
d)delete a pet         q) quit
a
Please enter name of pet:
Quincy
Please enter pet kind:
pig
Nerfville Pet Club Membership Program
Enter the letter corresponding to your choice:
a) add a pet            l) show list of pets
n) number of pets       f) find pets
q) quit
a
Please enter name of pet:
Bennie Haha
Please enter pet kind:
parrot
Nerfville Pet Club Membership Program
Enter the letter corresponding to your choice:
a) add a pet           l) show list of pets
n) number of pets      f) find pets
d) delete a pet        q) quit
a
Please enter name of pet:
Hiram Jinx
Please enter pet kind:
domestic cat
Nerfville Pet Club Membership Program
Enter the letter corresponding to your choice:
a) add a pet            l) show list of pets
n) number of pets       f) find pets
q) quit
n
3 pets in club
Nerfville Pet Club Membership Program
Enter the letter corresponding to your choice:
a) add a pet            l) show list of pets
n) number of pets       f) find pets
q) quit
l
Pet: BENNIE HAHA            Kind: PARROT
Pet: HIRAM JINX             Kind: DOMESTIC CAT
Pet: QUINCY                 Kind: PIG
Nerfville Pet Club Membership Program
Enter the letter corresponding to your choice:
a) add a pet             l) show list of pets
n) number of pets        f) find pets
q) quit
q
Bye.