数据结构 哈希表 拉链法创建通讯录

目录

0.功能

1预处理

2 函数声明区

3 电话号码哈希函数(哈希函数)

4 姓名哈希函数(哈希函数)

5 置空函数

6 头插法插入哈希表

7 建立哈希姓名表

8 覆盖建立哈希姓名表

9 搜索姓名函数

10 创建拉链式哈希表(电话号码)

11 打印哈希表拉链

12 覆盖电话号码哈希表

13 搜索电话号码函数

14 删除姓名函数

15 修改功能菜单函数

16 switch函数

17 全部代码


0.功能

        printf("-----------------------------------------------\n");
        printf("-------------------功能菜单--------------------\n");
        printf("--------------1.建立电话号码哈希表-------------\n");
        printf("--------------2.建立姓名序列哈希表-------------\n");
        printf("-------------3.打印通讯录全部成员--------------\n");
        printf("----4.查找通讯录(手机号)并可选择打印全部信息---\n");
        printf("-----5.查找通讯录(姓名)并可选择打印全部信息----\n");
        printf("------------------6.删除姓名-------------------\n");
        printf("-----------7.在同学录中添加新的人员------------\n");
        printf("----------8.修改除姓名以外的全部属性-----------\n");
        printf("-----------------------------------------------\n");

1预处理

    typedef struct
    {
        char name[100];
        char TelephoneNumber01[20];
        char TelephoneNumber02[20];
        char QQNumber[20];
        char Address[100];
        char YouXiang[100];
    }People;
    typedef struct Node
    {
        People Info;
        Node *next;
    }Node;

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>

2 函数声明区

    int hashnum(int num);//电话号码哈希函数
    int hashname(int num);//姓名哈希函数
    void InitHash(Node *Hash[]);//置空函数
    void TouChaFa(Node *Hash[],People value,int code);//头插法插入哈希表
    void CreatHashTableName(Node *Hash[],People value,char o);//建立哈希姓名表
    void RecoverHashTableName(Node *Hash[],People people[],char o,int k);//覆盖建立哈希姓名表
    int searchName(Node *Hash[],Node *&a);//搜索姓名函数
    void CreatHashTable(Node *Hash[],People value,char o);//创建拉链式哈希表(电话号码)
    void PrintHashTable(Node *Hash[]);//打印哈希表拉链
    void RecoverHashTable(Node *Hash[],People people[],char o,int k);//覆盖电话号码哈希表
    int searchNum(Node *Hash[],Node *&a);//搜索电话号码函数
    void DeleteName(Node *Hash[]);//删除姓名函数
    void pro();//总功能菜单函数
    void pro2();//修改功能菜单函数
    void swi(Node *Hash[],People people[],int k);//switch函数

3 电话号码哈希函数(哈希函数)

    int hashnum(int num)
    {
        return num%10;
    }

4 姓名哈希函数(哈希函数)

    int hashname(int num)
    {
        if(num<0)
            return -1*num%10;
        else
            return num%10;
    }

5 置空函数

    void InitHash(Node *Hash[])
    {
        for(int i=0;i<=9;i++)
        {
            Hash[i]=(Node *)malloc(sizeof(Node));
            Hash[i]->next=NULL;    
        }
    }

6 头插法插入哈希表

    void TouChaFa(Node *Hash[],People value,int code)
    {
        Node *p;
        p=(Node *)malloc(sizeof(Node));
        p->Info=value;
        p->next=Hash[code]->next;
        Hash[code]->next=p;
    }

7 建立哈希姓名表

    void CreatHashTableName(Node *Hash[],People value,char o)
    {
        int l = int(o);
        int j=hashname(l);
        TouChaFa(Hash,value,j);
    }

8 覆盖建立哈希姓名表

    void RecoverHashTableName(Node *Hash[],People people[],char o,int k)
    {
        int i;
            for(i=0;i<k;i++)
        {
            CreatHashTableName(Hash,people[i],people[i].name[0]);
        }
    }

9 搜索姓名函数

    int searchName(Node *Hash[],Node *&a)
    {
        int q,p;
        //Node *a;
        char o[100];
        printf("想要查找人的电话是:");
        scanf("%s",&o);
        printf("\n");
        p=int(o[0]);
        q=hashname(p);
        a=Hash[q];
        while(a)
        {
            if(!strcmp(o,a->Info.name))
            {
                return 1;
            }
            a=a->next;
        }
        return 0;
    }

10 创建拉链式哈希表(电话号码)

    void CreatHashTable(Node *Hash[],People value,char o)
    {
        int l = int(o);
        int j=hashnum(l);
        TouChaFa(Hash,value,j);
    }

11 打印哈希表拉链

    void PrintHashTable(Node *Hash[])
    {
        int i;
        for(i=0;i<10;i++)
        {
            printf("[%d]",i);
            Node *p = (Node *)malloc(sizeof(Node));
            p=Hash[i];
            while(p->next!=NULL)
            {    
                p=p->next;   
                printf(" -> %s",p->Info.name);

            }
            printf(" -> NULL");
            printf("\n");
        }
    }

12 覆盖电话号码哈希表

    void RecoverHashTable(Node *Hash[],People people[],char o,int k)
    {
        int i;
            for(i=0;i<k;i++)
        {
            CreatHashTable(Hash,people[i],people[i].TelephoneNumber01[0]);
        }
    }

13 搜索电话号码函数

    int searchNum(Node *Hash[],Node *&a)
    {
        int q,p;
        //Node *a;
        char o[100];
        printf("想要查找人的电话是:");
        scanf("%s",&o);
        printf("\n");
        p=int(o[0]);
        q=hashnum(p);
        a=Hash[q];
        while(a)
        {
            if(!strcmp(o,a->Info.TelephoneNumber01))
            {
                return 1;
            }
            a=a->next;
        }
        return 0;
    }

14 删除姓名函数

    void DeleteName(Node *Hash[])
    {
        Node *p,*pre,*q;
        int i,o=0,k=1,x;
        char l[100];
        printf("想要删除的元素是:");
        scanf("%s",&l);
        printf("\n");
        x=int(l[0]);
        i=hashname(x);
        p=Hash[i];
        q=Hash[i];
        while(p)
        {   
            o++;
            if(!strcmp(l,p->Info.name))
                break;
            p=p->next;
        }
        while(q&&k<o-1)
        {
            q=q->next;
            k++;
        }
        if(o>1)
        {
        printf("删除的元素是 %s\n",p->Info.name);
        q->next=q->next->next;
        free(p);
        }else{
        printf("删除的元素是 %s\n",p->Info.name);
        free(p);
        Hash[i]=NULL;        
        }
        printf("删除成功\n");
    }

15 修改功能菜单函数

    void pro2()
    {
        printf("--------------------\n");
        printf("----修改功能菜单----\n");
        printf("---0.退出修改程序---\n");
        printf("----1.电话号码01----\n");
        printf("----2.电话号码02----\n");
        printf("-------3.QQ号-------\n");
        printf("-------4.地址-------\n");
        printf("-------5.邮箱-------\n");
        printf("--------------------\n");
    }

16 switch函数

void swi(Node *Hash[],People people[],int k)
    {
        int n,i;
        int flag=0;
        char s;
        Node *a=NULL;    
        pro();
        printf("请输入功能数字: ");

        scanf("%d",&n);
        printf("\n");
        while(n)
        {
            switch(n)
            {
                case 0:
                    n=0;
                    break;
                case 1:
                    if(flag==0)
                    {
                    InitHash(Hash);
                    RecoverHashTable(Hash,people,people[i].TelephoneNumber01[0],k);
                    printf("电话号码01通讯录建立成功\n");
                    flag=1;
                    }else if(flag==2){
                        printf("已经建立了姓名通讯录\n");
                    }else{
                        printf("已经建立过了\n");
                    }
                    break;
                case 2:
                    if(flag==0)
                    {
                    InitHash(Hash);
                    RecoverHashTableName(Hash,people,people[i].name[0],k);
                    printf("姓名通讯录建立成功\n");
                    flag=2;
                    }else if(flag==1)
                    {
                        printf("已经建立了电话号码通讯录\n");
                    }else{
                        printf("已经建立过了\n");
                    }
                    break;
                case 3:
                    if(flag==0)
                    {
                        printf("在进行操作三之前需要完成操作一或二\n");
                    }else{
                    PrintHashTable(Hash);
                    }
                    break;
                case 4:
                    if(flag==1)
                    {
                        if(searchNum(Hash,a)){
                            printf("通讯录中存在这个人,这是%s的电话号码1\n",a->Info.name);
                            printf("是否打印这个人的全部信息(Y或N): ");
                            fflush(stdin);
                            scanf("%c",&s);
                            if(s=='Y')
                            {
                                printf("名字:%s\n",a->Info.name);
                                printf("电话号码01:%s\n",a->Info.TelephoneNumber01);
                                printf("电话号码02:%s\n",a->Info.TelephoneNumber02);
                                printf("QQ号:%s\n",a->Info.QQNumber);
                                printf("地址:%s\n",a->Info.Address);
                                printf("QQ邮箱:%s\n",a->Info.YouXiang);
                            }
                        }else{
                            printf("通讯录中不存在这个人\n");
                        }
                    }else if(flag==2)
                    {
                        printf("您建立是姓名通讯录,请重新输入\n");
                    }else{
                        printf("在进行操作四之前完成操作一\n");
                    }
                    break;
                case 5:
                    if(flag==2)
                    {
                        if(searchName(Hash,a)){
                            printf("通讯录中存在:%s\n",a->Info.name);
                            printf("是否打印这个人的全部信息(Y或N): ");
                            fflush(stdin);
                            scanf("%c",&s);
                            if(s=='Y')
                            {
                                printf("名字:%s\n",a->Info.name);
                                printf("电话号码01:%s\n",a->Info.TelephoneNumber01);
                                printf("电话号码02:%s\n",a->Info.TelephoneNumber02);
                                printf("QQ号:%s\n",a->Info.QQNumber);
                                printf("地址:%s\n",a->Info.Address);
                                printf("QQ邮箱:%s\n",a->Info.YouXiang);
                            }
                        }else{
                            printf("通讯录中不存在这个人\n");
                        }
                    }else if(flag==1)
                    {
                        printf("您建立是电话号码通讯录,请重新输入\n");
                    }else{
                        printf("在进行操作五之前完成操作二\n");
                    }
                    break;
                case 6:
                    if(flag==0)
                    {
                        printf("在进行操作六之前需要完成操作一或二\n");
                    }else if(flag==1){
                        printf("您建立是电话号码通讯录,请重新输入\n");
                    }else{
                        DeleteName(Hash);
                    }
                    break;
                case 7:
                    if(flag==2)
                    {
                        Node *p;
                        p=(Node *)malloc(sizeof(Node));
                        printf("请输入姓名:");
                        scanf("%s",p->Info.name);
                        printf("\n");
                        printf("请输入电话号码01:");
                        scanf("%s",p->Info.TelephoneNumber01);
                        printf("\n");
                        printf("请输入电话号码02:");
                        scanf("%s",p->Info.TelephoneNumber02);
                        printf("\n");
                        printf("请输入QQ号码:");
                        scanf("%s",p->Info.QQNumber);
                        printf("\n");
                        printf("请输入地址:");
                        scanf("%s",p->Info.Address);
                        printf("\n");
                        printf("请输入邮箱:");
                        scanf("%s",p->Info.YouXiang);
                        printf("\n");
                        CreatHashTableName(Hash,p->Info,p->Info.name[0]);
                        printf("插入成功\n");
                    }else if(flag==1)
                    {
                        printf("您建立是电话号码通讯录,请重新输入\n");
                    }else{
                        printf("在进行操作七之前需要完成操作二\n");
                    }
                    break;
                case 8:
                    if(flag==2)
                    {
                        Node *t;
                        int u;
                        searchName(Hash,t);
                        pro2();
                        printf("你想要修改的内容编号是:");
                        scanf("%d",&u);
                        printf("\n");
                        while(u)
                        {
                            switch(u)
                            {
                                case 0:
                                    u=0;
                                    break;
                                case 1:
                                    printf("请输入新的电话号码01: ");
                                    scanf("%s",t->Info.TelephoneNumber01);
                                    printf("\n");
                                    printf("修改成功\n");
                                    break;
                                case 2:
                                    printf("请输入新的电话号码02: ");
                                    scanf("%s",t->Info.TelephoneNumber02);
                                    printf("\n");
                                    printf("修改成功\n");
                                    break;
                                case 3:
                                    printf("请输入新的QQ号:");
                                    scanf("%s",t->Info.QQNumber);
                                    printf("\n");
                                    printf("修改成功\n");
                                    break;
                                case 4:
                                    printf("请输入新的地址:");
                                    scanf("%s",t->Info.Address);
                                    printf("\n");
                                    printf("修改成功\n");
                                    break;
                                case 5:
                                    printf("请输入新的邮箱: ");
                                    scanf("%s",t->Info.YouXiang);
                                    printf("\n");
                                    printf("修改成功\n");
                                    break;
                                default :
                                    printf("输入错误,请重新输入,输入范围(0~5)");
                        }  
                        printf("\n\n");              
                        pro2();
                        printf("你想要修改的内容编号是:");
                        scanf("%d",&u);
                        printf("\n");
                        }
                    }else if(flag==1)
                    {
                        printf("您建立是姓名通讯录,请重新输入\n");
                    }else
                    {
                        printf("在进行操作八之前需要进行操作二\n");
                    }
                    break;
                default:
                    printf("输入错误\n");
            }
            printf("\n\n\n");
            pro();
            printf("请输入功能数字: ");
            scanf("%d",&n);
            printf("\n");
        }
    }


17 全部代码

    typedef struct
    {
        char name[100];
        char TelephoneNumber01[20];
        char TelephoneNumber02[20];
        char QQNumber[20];
        char Address[100];
        char YouXiang[100];
    }People;
    typedef struct Node
    {
        People Info;
        Node *next;
    }Node;

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>

    int hashnum(int num);//电话号码哈希函数
    int hashname(int num);//姓名哈希函数
    void InitHash(Node *Hash[]);//置空函数
    void TouChaFa(Node *Hash[],People value,int code);//头插法插入哈希表
    void CreatHashTableName(Node *Hash[],People value,char o);//建立哈希姓名表
    void RecoverHashTableName(Node *Hash[],People people[],char o,int k);//覆盖建立哈希姓名表
    int searchName(Node *Hash[],Node *&a);//搜索姓名函数
    void CreatHashTable(Node *Hash[],People value,char o);//创建拉链式哈希表(电话号码)
    void PrintHashTable(Node *Hash[]);//打印哈希表拉链
    void RecoverHashTable(Node *Hash[],People people[],char o,int k);//覆盖电话号码哈希表
    int searchNum(Node *Hash[],Node *&a);//搜索电话号码函数
    void DeleteName(Node *Hash[]);//删除姓名函数
    void pro();//总功能菜单函数
    void pro2();//修改功能菜单函数
    void swi(Node *Hash[],People people[],int k);//switch函数

    //主函数
    int main()
    {
        int k,i;
        People people[100];
        Node *Hash[10];
        printf("就目前来说,需要录入通讯录的有几个人: ");
        scanf("%d",&k);
        printf("\n");
        for(i=0;i<k;i++)
        {
            printf("请输入姓名:");
            scanf("%s",people[i].name);
            printf("\n");
            printf("请输入电话号码01:");
            scanf("%s",people[i].TelephoneNumber01);
            printf("\n");
            printf("请输入电话号码02:");
            scanf("%s",people[i].TelephoneNumber02);
            printf("\n");
            printf("请输入QQ号:");
            scanf("%s",people[i].QQNumber);
            printf("\n");
            printf("请输入地址:");
            scanf("%s",people[i].Address);
            printf("\n");
            printf("请输入邮箱地址:");
            scanf("%s",people[i].YouXiang);
            printf("\n");
        }
        swi(Hash,people,k);   
    }

    //电话号码哈希函数
    int hashnum(int num)
    {
        return num%10;
    }

    //姓名哈希函数
    int hashname(int num)
    {
        if(num<0)
            return -1*num%10;
        else
            return num%10;
    }

    //置空函数
    void InitHash(Node *Hash[])
    {
        for(int i=0;i<=9;i++)
        {
            Hash[i]=(Node *)malloc(sizeof(Node));
            Hash[i]->next=NULL;    
        }
    }

    //头插法插入哈希表
    void TouChaFa(Node *Hash[],People value,int code)
    {
        Node *p;
        p=(Node *)malloc(sizeof(Node));
        p->Info=value;
        p->next=Hash[code]->next;
        Hash[code]->next=p;
    }

    //建立哈希姓名表
    void CreatHashTableName(Node *Hash[],People value,char o)
    {
        int l = int(o);
        int j=hashname(l);
        TouChaFa(Hash,value,j);
    }

    //覆盖建立哈希姓名表
    void RecoverHashTableName(Node *Hash[],People people[],char o,int k)
    {
        int i;
            for(i=0;i<k;i++)
        {
            CreatHashTableName(Hash,people[i],people[i].name[0]);
        }
    }

    //搜索姓名函数
    int searchName(Node *Hash[],Node *&a)
    {
        int q,p;
        //Node *a;
        char o[100];
        printf("想要查找人的电话是:");
        scanf("%s",&o);
        printf("\n");
        p=int(o[0]);
        q=hashname(p);
        a=Hash[q];
        while(a)
        {
            if(!strcmp(o,a->Info.name))
            {
                return 1;
            }
            a=a->next;
        }
        return 0;
    }

    //创建拉链式哈希表(电话号码)
    void CreatHashTable(Node *Hash[],People value,char o)
    {
        int l = int(o);
        int j=hashnum(l);
        TouChaFa(Hash,value,j);
    }

    //打印哈希表拉链
    void PrintHashTable(Node *Hash[])
    {
        int i;
        for(i=0;i<10;i++)
        {
            printf("[%d]",i);
            Node *p = (Node *)malloc(sizeof(Node));
            p=Hash[i];
            while(p->next!=NULL)
            {    
                p=p->next;   
                printf(" -> %s",p->Info.name);

            }
            printf(" -> NULL");
            printf("\n");
        }
    }

    //覆盖电话号码哈希表
    void RecoverHashTable(Node *Hash[],People people[],char o,int k)
    {
        int i;
            for(i=0;i<k;i++)
        {
            CreatHashTable(Hash,people[i],people[i].TelephoneNumber01[0]);
        }
    }

    //搜索电话号码函数
    int searchNum(Node *Hash[],Node *&a)
    {
        int q,p;
        //Node *a;
        char o[100];
        printf("想要查找人的电话是:");
        scanf("%s",&o);
        printf("\n");
        p=int(o[0]);
        q=hashnum(p);
        a=Hash[q];
        while(a)
        {
            if(!strcmp(o,a->Info.TelephoneNumber01))
            {
                return 1;
            }
            a=a->next;
        }
        return 0;
    }

    //删除姓名函数
    void DeleteName(Node *Hash[])
    {
        Node *p,*pre,*q;
        int i,o=0,k=1,x;
        char l[100];
        printf("想要删除的元素是:");
        scanf("%s",&l);
        printf("\n");
        x=int(l[0]);
        i=hashname(x);
        p=Hash[i];
        q=Hash[i];
        while(p)
        {   
            o++;
            if(!strcmp(l,p->Info.name))
                break;
            p=p->next;
        }
        while(q&&k<o-1)
        {
            q=q->next;
            k++;
        }
        if(o>1)
        {
        printf("删除的元素是 %s\n",p->Info.name);
        q->next=q->next->next;
        free(p);
        }else{
        printf("删除的元素是 %s\n",p->Info.name);
        free(p);
        Hash[i]=NULL;        
        }
        printf("删除成功\n");
    }

    //总功能菜单函数
    void pro()
    {
        printf("-----------------------------------------------\n");
        printf("-------------------功能菜单--------------------\n");
        printf("--------------1.建立电话号码哈希表-------------\n");
        printf("--------------2.建立姓名序列哈希表-------------\n");
        printf("-------------3.打印通讯录全部成员--------------\n");
        printf("----4.查找通讯录(手机号)并可选择打印全部信息---\n");
        printf("-----5.查找通讯录(姓名)并可选择打印全部信息----\n");
        printf("------------------6.删除姓名-------------------\n");
        printf("-----------7.在同学录中添加新的人员------------\n");
        printf("----------8.修改除姓名以外的全部属性-----------\n");
        printf("-----------------------------------------------\n");
    }

    //修改功能菜单函数
    void pro2()
    {
        printf("--------------------\n");
        printf("----修改功能菜单----\n");
        printf("---0.退出修改程序---\n");
        printf("----1.电话号码01----\n");
        printf("----2.电话号码02----\n");
        printf("-------3.QQ号-------\n");
        printf("-------4.地址-------\n");
        printf("-------5.邮箱-------\n");
        printf("--------------------\n");
    }

    //switch函数
    void swi(Node *Hash[],People people[],int k)
    {
        int n,i;
        int flag=0;
        char s;
        Node *a=NULL;    
        pro();
        printf("请输入功能数字: ");

        scanf("%d",&n);
        printf("\n");
        while(n)
        {
            switch(n)
            {
                case 0:
                    n=0;
                    break;
                case 1:
                    if(flag==0)
                    {
                    InitHash(Hash);
                    RecoverHashTable(Hash,people,people[i].TelephoneNumber01[0],k);
                    printf("电话号码01通讯录建立成功\n");
                    flag=1;
                    }else if(flag==2){
                        printf("已经建立了姓名通讯录\n");
                    }else{
                        printf("已经建立过了\n");
                    }
                    break;
                case 2:
                    if(flag==0)
                    {
                    InitHash(Hash);
                    RecoverHashTableName(Hash,people,people[i].name[0],k);
                    printf("姓名通讯录建立成功\n");
                    flag=2;
                    }else if(flag==1)
                    {
                        printf("已经建立了电话号码通讯录\n");
                    }else{
                        printf("已经建立过了\n");
                    }
                    break;
                case 3:
                    if(flag==0)
                    {
                        printf("在进行操作三之前需要完成操作一或二\n");
                    }else{
                    PrintHashTable(Hash);
                    }
                    break;
                case 4:
                    if(flag==1)
                    {
                        if(searchNum(Hash,a)){
                            printf("通讯录中存在这个人,这是%s的电话号码1\n",a->Info.name);
                            printf("是否打印这个人的全部信息(Y或N): ");
                            fflush(stdin);
                            scanf("%c",&s);
                            if(s=='Y')
                            {
                                printf("名字:%s\n",a->Info.name);
                                printf("电话号码01:%s\n",a->Info.TelephoneNumber01);
                                printf("电话号码02:%s\n",a->Info.TelephoneNumber02);
                                printf("QQ号:%s\n",a->Info.QQNumber);
                                printf("地址:%s\n",a->Info.Address);
                                printf("QQ邮箱:%s\n",a->Info.YouXiang);
                            }
                        }else{
                            printf("通讯录中不存在这个人\n");
                        }
                    }else if(flag==2)
                    {
                        printf("您建立是姓名通讯录,请重新输入\n");
                    }else{
                        printf("在进行操作四之前完成操作一\n");
                    }
                    break;
                case 5:
                    if(flag==2)
                    {
                        if(searchName(Hash,a)){
                            printf("通讯录中存在:%s\n",a->Info.name);
                            printf("是否打印这个人的全部信息(Y或N): ");
                            fflush(stdin);
                            scanf("%c",&s);
                            if(s=='Y')
                            {
                                printf("名字:%s\n",a->Info.name);
                                printf("电话号码01:%s\n",a->Info.TelephoneNumber01);
                                printf("电话号码02:%s\n",a->Info.TelephoneNumber02);
                                printf("QQ号:%s\n",a->Info.QQNumber);
                                printf("地址:%s\n",a->Info.Address);
                                printf("QQ邮箱:%s\n",a->Info.YouXiang);
                            }
                        }else{
                            printf("通讯录中不存在这个人\n");
                        }
                    }else if(flag==1)
                    {
                        printf("您建立是电话号码通讯录,请重新输入\n");
                    }else{
                        printf("在进行操作五之前完成操作二\n");
                    }
                    break;
                case 6:
                    if(flag==0)
                    {
                        printf("在进行操作六之前需要完成操作一或二\n");
                    }else if(flag==1){
                        printf("您建立是电话号码通讯录,请重新输入\n");
                    }else{
                        DeleteName(Hash);
                    }
                    break;
                case 7:
                    if(flag==2)
                    {
                        Node *p;
                        p=(Node *)malloc(sizeof(Node));
                        printf("请输入姓名:");
                        scanf("%s",p->Info.name);
                        printf("\n");
                        printf("请输入电话号码01:");
                        scanf("%s",p->Info.TelephoneNumber01);
                        printf("\n");
                        printf("请输入电话号码02:");
                        scanf("%s",p->Info.TelephoneNumber02);
                        printf("\n");
                        printf("请输入QQ号码:");
                        scanf("%s",p->Info.QQNumber);
                        printf("\n");
                        printf("请输入地址:");
                        scanf("%s",p->Info.Address);
                        printf("\n");
                        printf("请输入邮箱:");
                        scanf("%s",p->Info.YouXiang);
                        printf("\n");
                        CreatHashTableName(Hash,p->Info,p->Info.name[0]);
                        printf("插入成功\n");
                    }else if(flag==1)
                    {
                        printf("您建立是电话号码通讯录,请重新输入\n");
                    }else{
                        printf("在进行操作七之前需要完成操作二\n");
                    }
                    break;
                case 8:
                    if(flag==2)
                    {
                        Node *t;
                        int u;
                        searchName(Hash,t);
                        pro2();
                        printf("你想要修改的内容编号是:");
                        scanf("%d",&u);
                        printf("\n");
                        while(u)
                        {
                            switch(u)
                            {
                                case 0:
                                    u=0;
                                    break;
                                case 1:
                                    printf("请输入新的电话号码01: ");
                                    scanf("%s",t->Info.TelephoneNumber01);
                                    printf("\n");
                                    printf("修改成功\n");
                                    break;
                                case 2:
                                    printf("请输入新的电话号码02: ");
                                    scanf("%s",t->Info.TelephoneNumber02);
                                    printf("\n");
                                    printf("修改成功\n");
                                    break;
                                case 3:
                                    printf("请输入新的QQ号:");
                                    scanf("%s",t->Info.QQNumber);
                                    printf("\n");
                                    printf("修改成功\n");
                                    break;
                                case 4:
                                    printf("请输入新的地址:");
                                    scanf("%s",t->Info.Address);
                                    printf("\n");
                                    printf("修改成功\n");
                                    break;
                                case 5:
                                    printf("请输入新的邮箱: ");
                                    scanf("%s",t->Info.YouXiang);
                                    printf("\n");
                                    printf("修改成功\n");
                                    break;
                                default :
                                    printf("输入错误,请重新输入,输入范围(0~5)");
                        }  
                        printf("\n\n");              
                        pro2();
                        printf("你想要修改的内容编号是:");
                        scanf("%d",&u);
                        printf("\n");
                        }
                    }else if(flag==1)
                    {
                        printf("您建立是姓名通讯录,请重新输入\n");
                    }else
                    {
                        printf("在进行操作八之前需要进行操作二\n");
                    }
                    break;
                default:
                    printf("输入错误\n");
            }
            printf("\n\n\n");
            pro();
            printf("请输入功能数字: ");
            scanf("%d",&n);
            printf("\n");
        }
    }


  • 3
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
#include #include #include using namespace std; #define NULL 0 unsigned int key; //用来输入/输出文件流类 unsigned int key2; //key和key2分别是用做了电话号码和姓名的关键字 int *p; struct node //新建节点(用户姓名、地址、电话号码、指向下一个结点的指针 ) { char name[8],address[20]; char num[11]; node * next; }; typedef node* pnode; typedef node* mingzi; //声明了名字和电话两个指针 node **phone; node **nam; node *a; void hash(char num[11]) //以电话号码为关键字建立哈希函数 { int i = 3; key=(int)num[2]; while(num[i]!=NULL) { key+=(int)num[i]; i++; } key=key%20; } void hash2(char name[8]) //姓名为关键字建立哈希函数 { int i = 1; key2=(int)name[0]; while(name[i]!=NULL) { key2+=(int)name[i]; i++; } key2=key2%20; } //强制类型转换,将用户名的每一个字母的ASCLL码值相加并且除以20后的余数 node* input() //输入节点信息 ,建立结点,并将结点的next指针指空 { node *temp; temp = new node; temp->next=NULL; cout<<"输入姓名:"<>temp->name; cout<<"输入地址:"<>temp->address; cout<<"输入电话:"<>temp->num; return temp; } //对于指针类型返回的是地址 int apend() //添加节点 { node *newphone; node *newname; newphone=input(); newname=newphone; newphone->next=NULL; newname->next=NULL; hash(newphone->num); //利用哈希函数计算出对应关键字的存储地址 hash2(newname->name); newphone->next = phone[key]->next; //利用电话号码为关键字插入 phone[key]->next=newphone; //是采用链地址拉链处理冲突的散列表结构 newname->next = nam[key2]->next; //利用用户名为关键字插入 nam[key2]->next=newname; return 0; } void create() //新建节点 { int i; phone=new pnode[20]; //动态创建对象数组,C++课本P188页 for(i=0;inext=NULL; } } void create2() //新建节点 { int i; nam=new mingzi[20]; for(i=0;inext=NULL; } } void list() //显示列表 { int i; node *p; for(i=0;inext; while(p) { cout<name<<'_'<address<<'_'<num<next; } } } void list2() //显示列表 { int i; node *p; for(i=0;inext; while(p) { cout<name<<'_'<address<<'_'<num<next; } } } void find(char num[11]) //在以电话号码为关键字的哈希表中查找用户信息 { hash(num); node *q=phone[key]->next; while(q!= NULL) { if(strcmp(num,q->num)==0) break; q=q->next; } if(q) cout<name<<"_" <address<<"_"<num<<endl; else cout<<"无此记录"<next; while(q!= NULL) { if(strcmp(name,q->name)==0) break; q=q->next; } if(q) cout<name<<"_" <address<<"_"<num<<endl; else cout<<"无此记录"<<endl; } void save() //保存用户信息 { int i; node *p; for(i=0;inext; while(p) { fstream iiout("out.txt", ios::out); //创建一个文件流对象:iiout iiout<name<<"_"<address<<"_"<num<next; } } } void menu() //菜单 { cout<<" 哈希表通讯录"<<endl; cout<<" 0.添加记录"<<endl; cout<<" 2.姓名散列"<<endl; cout<<" 3.查找记录"<<endl; cout<<" 4.号码散列"<<endl; cout<<" 5.清空记录"<<endl; cout<<" 6.保存记录"<<endl; cout<<" 7.退出系统"<>sel; if(sel==3) { cout<<"8姓名查询" <<endl;cout<<"9号码查询"<>b; if(b==9) {cout<<"请输入电话号码:"<>num; cout<<"输出查找的信息:"<<endl; find(num); } else {cout<<"请输入姓名:"<>name; cout<<"输出查找的信息:"<<endl; find2(name);}} if(sel==2) {cout<<"姓名散列结果:"<<endl; list2();} if(sel==0) {cout<<"请输入要添加的内容:"<<endl; apend();} if(sel==4) {cout<<"号码散列结果:"<<endl; list(); } if(sel==5) {cout<<"列表已清空:"<<endl; create();create2();} if(sel==6) { cout<<"通信录已保存:"<<endl; save();} if(sel==7) return 0; } return 0; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值