二叉排序树实现简单的通讯录

头文件

#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日

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值