首页 > 技术文章 > 电话号码查询系统实验报告

srs7665 2020-06-27 09:48 原文

一、 问题描述及分析

写清楚你要实现的是个什么系统,完成的都是什么功能?

实现一个电话号码查询系统,能够完成通讯链表的建立、通讯者的插入、通讯者的查询、显示所有通讯者的信息以及保存通讯录、退出程序等功能。

二、 功能模块及数据结构描述

系统划分成几个模块,几个模块之间是什么调用关系?画出系统结构图

共六个模块:1.增加信息2.显示信息3.查找号码4.清除信息5.保存信息6.退出系统

模块均被主程序调用,除主函数外其他是并列关系。

 

一、 主要算法流程描述及部分核心算法

 

主要模块的算法介绍,画出其流程图

 

void getin(Record* a)

 

{

 

    //键盘输入各人的信息

 

    printf("输入要添加的个数:\n");

 

    scanf("%d",&NUM_BER);

 

    int i;

 

    for(i=0; i<NUM_BER; i++)

 

    {

 

 

 

        printf("请输入第%d个记录的用户名:\n",i+1);

 

        scanf("%s",a[i].name);

 

        printf("请输入%d个记录的电话号码:\n",i+1);

 

        scanf("%s",a[i].tel);

 

        printf("请输入第%d个记录的地址:\n",i+1);

 

        scanf("%s",a[i].add);

 

    }

 

}

 

void CreateHash1(HashTable* H,Record* a)

 

{//建表,以人的姓名为关键字,建立相应的散列表,并解决相应的冲突

 

    int i,p=-1,c,pp;

 

    for(i=0; i<NUM_BER; i++)

 

    {

 

        c=0;

 

        p=Hash1(a[i].name);

 

        pp=p;

 

        while(H->elem[pp]!=NULL)

 

        {

 

            pp=collision(p,c);

 

            if(pp<0)

 

            {

 

                printf("%d记录无法解决冲突",i+1); //需要显示冲突次数时输出

 

                continue;

 

            }                                   //无法解决冲突,跳入下一循环(+1)

 

        }

 

        H->elem[pp]=&(a[i]);                      //求得散列地址,将信息存入

 

        H->count++;

 

        printf("%d个记录冲突次数为%d\n",i+1,c); //需要显示冲突次数时输出

 

    }

 

    printf("\n建表完成!\n此散列表容量为%d,当前表内存储的记录个数为%d.\n",HASHSIZE,H->count);

 

}

 

 

 

void SearchHash1(HashTable* H,int &c)

 

{//在通讯录里查找姓名关键字,若查找成功,显示信息//c用来显示冲突次数

 

    NA str;

 

    printf("\n请输入要查找记录的姓名:\n");

 

    scanf("%s",str);

 

    int p,pp;

 

    p=Hash1(str);

 

    pp=p;

 

    while((H->elem[pp]!=NULL)&&(eq(str,H->elem[pp]->name)==-1))

 

        pp=collision(p,c);

 

    if(H->elem[pp]!=NULL&&eq(str,H->elem[pp]->name)==1)

 

    {

 

        printf("\n查找成功!\n查找过程冲突次数为%d.以下是您需要要查找的信息:\n\n",c);

 

        printf("姓  名:%s\n电话号码:%s\n联系地址:%s\n",H->elem[pp]->name,H->elem[pp]->tel,H->elem[pp]->add);

 

    }

 

    else printf("\n此人不存在,查找不成功!\n");

 

}

 

 

 

void CreateHash2(HashTable* H,Record* a)

 

{//建表,以电话号码为关键字,建立相应的散列表,并解决相应的冲突

 

    int i,p=-1,c,pp;

 

    for(i=0; i<NUM_BER; i++)

 

    {

 

        c=0;

 

        p=Hash2(a[i].tel);

 

        pp=p;

 

        while(H->elem[pp]!=NULL)

 

        {

 

            pp=collision(p,c);

 

            if(pp<0)

 

            {

 

                printf("%d记录无法解决冲突",i+1);   //需要显示冲突次数时输出

 

                continue;

 

            }                                      //无法解决冲突,跳入下一循环(+1)

 

        }

 

        H->elem[pp]=&(a[i]);                      //求得散列地址,将信息存入

 

        H->count++;

 

        printf("%d个记录冲突次数为%d\n",i+1,c);//需要显示冲突次数时输出

 

    }

 

    printf("\n建表完成!\n此散列表容量为%d,当前表内存储的记录个数为%d.\n",HASHSIZE,H->count);

 

}

 

 

 

void SearchHash2(HashTable* H,int &c)

 

{//在通讯录里查找电话号码关键字,若查找成功,显示信息//c用来记录冲突次数,查找成功时显示冲突次数

 

    NA tele;

 

    printf("\n请输入要查找记录的电话号码:\n");

 

    scanf("%s",tele);

 

    int p,pp;

 

    p=Hash2(tele);

 

    pp=p;

 

    while((H->elem[pp]!=NULL)&&(eq(tele,H->elem[pp]->tel)==-1))

 

        pp=collision(p,c);

 

    if(H->elem[pp]!=NULL&&eq(tele,H->elem[pp]->tel)==1)

 

    {

 

        printf("\n查找成功!\n查找过程冲突次数为%d.以下是您需要要查找的信息:\n",c);

 

        printf("姓  名:%s\n电话号码:%s\n联系地址:%s\n",H->elem[pp]->name,H->elem[pp]->tel,H->elem[pp]->add);

 

    }

 

    else printf("\n此人不存在,查找不成功!\n");

 

}

 

 

 

void Save()

 

{//保存数据函数

 

    FILE *fp;

 

    if((fp=fopen("c:\test.txt", "w"))==NULL)

 

    {

 

        printf("\nERROR opening customet file");

 

    }

 

    fclose(fp);

 

}

 

int main(int argc, char* argv[])

 

{

 

    int c,flag=1;

 

    HashTable *H;

 

    H=(HashTable*)malloc(LEN);

 

    for(int i=0; i<HASHSIZE; i++)

 

        H->elem[i]=NULL;

 

    H->size=HASHSIZE;

 

    H->count=0;

 

    Record a[MAXSIZE];

 

    printf("                欢迎使用电话号码查找系统             ");

 

    printf("\n             1.  添加用户信息                         ");

 

    printf("\n             2.  读取所有用户信息                     ");

 

    printf("\n             3.  以姓名建表                           ");

 

    printf("\n             4.  以电话号码建表                       ");

 

    printf("\n             5.  查找并显示给定用户名的记录           ");

 

    printf("\n             6.  查找并显示给定电话号码的记录         ");

 

    printf("\n             7.  清空                                 ");

 

    printf("\n             8.  保存                                 ");

 

    printf("\n             9.  退出程序                             ");

 

    printf("\n       注意:                                         ");

 

    printf("\n             .进行5操作前 请先输出3               ");

 

    printf("\n             .进行6操作前 请先输出4               ");

 

    printf("\n");

 

    printf("请输入你想要的操作:");

 

    printf("\n");

 

    while(1)

 

    {

 

 

 

        int num;

 

        scanf("%d",&num);

 

        switch(num)

 

        {

 

        case 1:

 

            getin(a);

 

            break;

 

        case 2:

 

            ShowInformation(a);

 

            break;

 

        case 3:

 

            CreateHash1(H,a);   // 以姓名建立散列表

 

            break;

 

        case 4:

 

            CreateHash2(H,a);   // 以电话号码建立散列表

 

            break;

 

        case 5:

 

            c=0;

 

            SearchHash1(H,c);   //以姓名查找数据

 

            break;

 

        case 6:

 

            c=0;

 

            SearchHash2(H,c);   //以电话号码查找数据

 

            break;

 

        case 7:

 

            Cls(a);

 

            break;

 

        case 8:

 

            Save();

 

            break;

 

        case 9:

 

            return 0;

 

            break;

 

        default:

 

            printf("输入错误,请重新输入!");

 

            printf("\n");

 

        }

 

    }

 

    system("pause");

 

    return 0;

 

}

 

 

 

推荐阅读