一、目标描述:
1、建立一个通讯录,按姓名字母排序存储联系人信息。
2、可显示菜单提供显示、新增、删除、修改等功能。
3、显示:(1)显示联系人数量及全部联系人信息;(2)提供特定条件查询指定联系人信息。
4、新增:逐步提示对应信息输入。
5、删除:删除指定联系人信息。
6、修改:提供特定条件修改指定单个联系人信息:先显示原先信息,再提供选项修改对应条目。
7、通讯录信息保存在文件中。
二、目标分析:
1、项目需要排序、新增,则考虑使用二叉搜索树来建立数据堆模型。
2、该模型须提供以下具体功能模块:(1)初始化(2)新增项目(3)删除(4)查询有无(5)修改
3、信息要保存到文件中,每一次更新信息都要对应到文件中;则上述功能模块都要增加读写文件功能才能更新文件,这是一个复杂而且现阶段我很难实现的工作,只考虑下面一种很笨拙但相对简单的实现方式:在上述功能模块中:(2)新增(3)删除(5)修改功能后提供文件更新,同时文件更新不针对某条具体的(新增的或删除的或修改的)信息,而是对应功能完成后文件按整个通讯录重新写入。因此增加功能模块(6)将整个二叉树信息依序写入文件。
4、程序第一次运行,文件信息为空,通过程序新增录入信息,并且文件得以更新,这没有问题。可第二次,第三次运行呢?文件已经存在,而且已经有信息了,可程序运行之初二叉树数据堆是空的,怎样读取文件中的信息,并写入二叉树模型呢?
如果在文件中联系人信息如下设置:
"Name:""-Bir_Year:""-..."可通过文本字符串判断然后写入二叉树的节点;另外一点,选择按姓名比较建立二叉树。同时,每个联系人信息结尾用换行符进行标记。
三、功能模块的具体思路
1、初始化
先读取文本,建立二叉树联系人模型;若文本为空,则初始化空树。
2、新增
提示输入姓名,写入相关信息,建立节点,依据姓名找到合适位置插入二叉树。依据更新的二叉树,重新写入文本。
3、删除
提示输入被删姓名,删除该节点。依据更新的二叉树,重新写入文本。
4、查询有无
提示输入查询条件,找到相关信息并显示。该模块为功能2、3、5提供支持。
5、修改
提示输入被修改姓名,修改操作。依据更新的二叉树,重新写入文本。
#include<stdio.h> #include<string.h> #include<stdlib.h> void IniTree(); void AddNode(); void ChoiceAdd(); void ShowTree(); int SeekName(); void ChoiceDel(); void DeleteNode(); void Choicefind(); void Choicemod(); void ShowMainInterface(); void NodeWrite(); typedef struct member { char name[20]; char sex; char bir_year[5]; char bir_month[3]; char bir_day[3]; char qq[15]; }Member; typedef struct node { Member *person; struct node *left; struct node *right; }Node; typedef struct tree { Node *root; int numbers; }Tree; void ShowMainInterface() { printf("Input your choice: "); printf("a)show all friends. "); printf("b)add a friend's information. "); printf("c)modify a friend's information. "); printf("d)delete a friend. "); printf("e)look for a friend's information. "); printf("q)Quit. "); } void IniTree(Tree *ptree) { FILE *fp; Node *newnode; int i=0; char name[20]; char sex; char bir_year[5]; char bir_month[3]; char bir_day[3]; char qq[15]; char ch; fp=fopen("c.txt","r"); //如果文件不存在,则初始化二叉树 if(fp==NULL) { ptree->root=NULL; ptree->numbers=0; printf("FILE Error! "); } //文件存在,则读入文件,创建二叉树节点信息 else { ch=getc(fp); //每个换行符前为一个联系人信息,每行建一个节点 //读文件前,先初始化树 ptree->root=NULL; ptree->numbers=0; while(ch!=EOF) { while((ch!=' ')&&(ch!=EOF)) { newnode=(Node*)malloc(sizeof(Node)); while(ch!='-') { newnode->person->name[i]=ch; i++; ch=getc(fp); } newnode->person->name[i]='