头文件
#ifndef TOU_H_INCLUDED
#define TOU_H_INCLUDED
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
typedef struct
{
char Name[20];
char PhoneNumber[20];
char Adress[50];
}InfoType;
typedef struct node
{
InfoType data;
struct node *lchild,*rchild;
}BSTNode;
int InsertBST(BSTNode *&p,InfoType k);//增加插入
void PreOrder(BSTNode *b);//遍历输出
BSTNode *SearchBST(BSTNode *bt,char name[]);//查询
void MenuShow();
void Prepare(InfoType &k);
int DeleteBST(BSTNode *&p,char name[]);
void Delete(BSTNode *&p1);
void Delete1(BSTNode *p2,BSTNode *&r);
void Save(BSTNode *&b);
void Open(BSTNode *&p,InfoType k);
int system(const char *string);
#endif // TOU_H_INCLUDED
函数实现
#include<stdio.h>
#include<iostream>
#include<fstream>
#include<stdlib.h>
#include<string.h>
#include"Tou.h"
/******************添加联系人*********************/
int InsertBST(BSTNode *&p,InfoType k)
{
if(p==NULL)
{
p=(BSTNode*)malloc(sizeof(BSTNode));
p->data=k;
p->lchild=p->rchild=NULL;
return 1;
}
else if((strcmp(p->data.Name,k.Name))==0)
{
return 0;
}
else if((strcmp(p->data.Name,k.Name))<0)
{
return InsertBST(p->lchild,k);
}
else
return InsertBST(p->rchild,k);
}
/***********************显示联系人***************************/
void PreOrder(BSTNode *b)
{
if(b!=NULL)
{
printf("%s %s %s\n",b->data.Name,b->data.PhoneNumber,b->data.Adress);
PreOrder(b->lchild);
PreOrder(b->rchild);
}
}
/*************************打开*************************************/
void Open(BSTNode *&p,InfoType k)
{
FILE *r=fopen("data.txt","r");
char buf[1000];
if(r==NULL)
{
printf("Open faile!");
}
else
{
while(!feof(r))
{
fgets(buf,sizeof(InfoType),r);
printf("%s",buf);
}
}
}
/*********************保存**************************************/
void Save(BSTNode *&b)
{
fstream outfile;
outfile.open("data.txt",ios::out|ios::app);//
if(!outfile)
{
cout<<"打开文件失败"<<endl;
abort();
}
if(b!=NULL)
{
outfile<<b->data.Name<<b->data.PhoneNumber<<b->data.Adress<<endl;
Save(b->lchild);
Save(b->rchild);
}
outfile.close();
}
/**************************查询联系人*****************************/
BSTNode *SearchBST(BSTNode *bt, char name[])
{
if(bt==NULL||(strcmp(bt->data.Name,name))==0)
{
return bt;
}
if((strcmp(bt->data.Name,name))<0)
{
return SearchBST(bt->lchild,name);
}
else
{
return SearchBST(bt->rchild,name);
}
}
/************************删除联系人*******************************/
int DeleteBST(BSTNode *&p,char name[])
{
if(p==NULL)
{
return 0;
}
else
{
if(strcmp(p->data.Name,name)<0)
return DeleteBST(p->lchild,name);
else if(strcmp(p->data.Name,name)>0)
return DeleteBST(p->rchild,name);
else
{
Delete(p);
return 1;
}
}
}
void Delete(BSTNode *&p1)
{
BSTNode *q=NULL;
if(p1->rchild==NULL)
{
q=p1;
p1=p1->lchild;
free(q);
}
else if(p1->lchild==NULL)
{
q=p1;
p1=p1->rchild;
free(q);
}
else
Delete1(p1,p1->lchild);
}
void Delete1(BSTNode *p2,BSTNode *&r)
{
BSTNode *q=NULL;
if(r->rchild!=NULL)
{
Delete1(p2,r->rchild);//递归找最右节点,找到了最右下节点,将节点值赋给p2
}
else
{
strcpy(p2->data.Name,r->data.Name);
strcpy(p2->data.PhoneNumber,r->data.PhoneNumber);
strcpy(p2->data.Adress,r->data.Adress);//将最右节点的值赋给删除节点
q=r;//将最右节点的左子树赋给最右节点
r=r->lchild;
free(q);
}
}
/**************************菜单***************************/
void MenuShow()
{
printf("***********欢迎使用通讯录*************\n");
printf("* 1.添加联系人 *\n");
printf("* 2.编辑联系人 *\n");
printf("* 3.删除联系人 *\n");
printf("* 4.查询联系人 *\n");
printf("* 5.显示联系人 *\n");
printf("* 6.保存文件 *\n");
printf("* 7.读取文件 *\n");
printf("* 0.退出 *\n");
printf("***************************************\n");
printf("请根据提示操作!\n");
}
/*********************准备工作********************************/
void Prepare(InfoType &k)
{
printf("请输入手机号,姓名,家庭住址\n");
scanf("%s%s%s",k.PhoneNumber,k.Name,k.Adress);
}
主函数
#include<stdio.h>
#include<stdlib.h>
#include"Tou.h"
#include <iostream>
using namespace std;
int main()
{
int n;
BSTNode *p=NULL;
InfoType k;
MenuShow();
while(scanf("%d",&n)!=EOF)
{
switch(n)
{
case 1:
int m;
Prepare(k);
m=InsertBST(p,k);
system("cls");
if(m==1)
{
printf("联系人%s添加成功。\n",k.Name);
printf("\n");
}
else
{
printf("联系人%s已存在。\n",k.Name);
}
MenuShow();
break;
case 2:
char xiugainame[20];
BSTNode *q1;
printf("请输入联系人的姓名:\n");
scanf("%s",xiugainame);
q1=SearchBST(p,xiugainame);
if(q1!=NULL)
{
system("cls");
printf("请输入要修改的信息(手机号,姓名,家庭住址):\n");
scanf("%s%s%s",q1->data.PhoneNumber,q1->data.Name,q1->data.Adress);
printf("信息修改成功。\n\n");
}
else
{
system("cls");
printf("不存在联系人%s,请先添加。\n",xiugainame);
}
MenuShow();
break;
case 3:
char shanchuname[20];
BSTNode *q2;
int backValue;
printf("请输入联系人的姓名:\n");
scanf("%s",shanchuname);
q2=SearchBST(p,shanchuname);
system("cls");
if(q2!=NULL)
{
backValue=DeleteBST(p,shanchuname);
if(backValue==1)
{
printf("删除%s成功\n",shanchuname);
}
else
printf("删除失败\n");
}
else
printf("不存在联系人%s,请先添加。\n",shanchuname);
MenuShow();
break;
case 4:
char name[20];
BSTNode *q;
printf("请输入联系人的姓名:\n");
scanf("%s",name);
q=SearchBST(p,name);
system("cls");
if(q!=NULL)
printf("%s %s %s\n",q->data.Name,q->data.PhoneNumber,q->data.Adress);
else
printf("不存在联系人%s,请先添加。\n",name);
MenuShow();
break;
case 5:
system("cls");
PreOrder(p);
MenuShow();
break;
case 6:
Save(p);
printf("保存成功\n");
break;
case 7:
Open(p,k);
break;
case 0:
exit(0);
break;
}
}
return 0;
}
数据结构课设
2017年5月11日