資料結構,雜湊表hash設計實驗

wu_yan發表於2020-12-12
  • 資料結構實驗,hash表
  • 採用鏈地址法處理hash衝突
  • 程式碼全部自己寫,轉載請留本文連線,
  • 附上程式碼
    #include<stdlib.h>
    #include<stdio.h>
    #include<string.h>
    #include<conio.h>
    
    #define NAMESIZE 20//姓名長度
    #define NULLKEY -32768//hash表空值
    #define HASHSIZE 30//定義hash表長度
    
    typedef struct student
    {
        char name[NAMESIZE];
        int Snum;
        int Tnum;
        student *next=NULL;
    }stu;
    
    typedef struct
    {
        stu ** list;
        int count;
    }HashTable;
    
    int InitHashtable(HashTable *hash)
    {
        hash->count=0;
        hash->list=(stu **)malloc(HASHSIZE *sizeof(stu *));
        if(!hash->list)
            return -1;
        for(int i=0;i<HASHSIZE;i++)
        {
            hash->list[i]=NULL;
        }
        return 1;
    }
    int hash(stu stu)
    {
        int hashseed=0;
        for(int a=0;stu.name[a]!='\0';a++)
        {
            hashseed=hashseed*7+(int)stu.name[a];
        }
        int hashvalue=NULLKEY;
        srand(hashseed);
        hashvalue=rand()%HASHSIZE;
        return hashvalue;
    }
    int intohashtable(HashTable *htable,student *stu)
    {
        int H1=hash(*stu);
        if(htable->list[H1]!=NULL)//hash衝突
        {
            student *p;
            p=(student *)malloc(sizeof(student));
            p=stu;
            p->next=htable->list[H1];
            htable->list[H1]=p;
    
        }
        else
            htable->list[H1]=stu;
        htable->count++;
        return 1;
    }
    int addstudent(HashTable *htable)
    {
        char name[NAMESIZE];
        int snum,tnum;
        stu *stu1;
        stu1=(student *)malloc(sizeof(student));
        printf("請輸入姓名:\t");fflush(stdin);
        scanf("%s",name);
        printf("請輸入學號:\t");
        scanf("%d",&snum);
        printf("請輸入電話號:\t");
        scanf("%d",&tnum);
        if(!name)
        {
            printf("addstudent__error");
            return 0;
        }
        strcpy(stu1->name,name);
        stu1->Snum=snum;
        stu1->Tnum=tnum;
        stu1->next=NULL;
        if(intohashtable(htable,stu1))
            return 1;
        else
        {
            printf("into_error");
            return 0;
        }
    }
    int findhashtable(HashTable *htable)
    {
        printf("\t2-查詢\n");
        char name[NAMESIZE];
        printf("請輸入要查詢的姓名:");
        scanf("%s",name);
        stu stu0;
        strcpy(stu0.name,name);
        stu0.next=NULL;
        stu0.Snum=0;
        stu0.Tnum=0;
        int hashkey;
        hashkey=hash(stu0);
        if(htable->list[hashkey]==NULL)
            printf("查詢的值不存在\n");
        if(htable->list[hashkey!=NULL])
        {
            stu *p;
            p=htable->list[hashkey];
            while(p)
            {
                if(name==p->name)
        printf("你找的資訊為:\n姓名:%s\t學號:%d\t電話號碼%d\n",htable->list[hashkey]->name,htable->list[hashkey]->Snum,htable->list[hashkey]->Tnum);
                if(p->next==NULL)
                    break;
                p=p->next;
            }
        }
        printf("你找的資訊為:\n姓名:%s\t學號:%d\t電話號碼%d\n",htable->list[hashkey]->name,htable->list[hashkey]->Snum,htable->list[hashkey]->Tnum);
        getch();
    }
    int main()
    {
        HashTable *htable;
        htable =(HashTable *)malloc(sizeof(HashTable));
        InitHashtable(htable);
        int T=1;
        for(int a=1;T;a++)
        {
            system("cls");
            printf("\t雜湊表設計實驗\n");
            printf("1-新增\n2-查詢\n3-輸出hash表\n0-退出\n");
            scanf("%d",&T);
            if(T==1)
            for(char c;1;1)
            {
                if(!addstudent(htable))
                    printf("addstudent返回error\n");
                printf("是否繼續輸入如 y/n:\t");
                fflush(stdin);
                c=getchar();
                if(c=='n'||c=='N')
                    break;
            }
            if(T==2)
                findhashtable(htable);
            if(T==3)
            {
                student *p;
                printf("儲存的資料個數為%d個\n",htable->count);
                for(int a=0;a<HASHSIZE;a++)
                {
                    printf("%d\t",a);
                    p=htable->list[a];
                    int t=0;
                    while(p)
                    {
                        t=1;
                        printf("%s\t",p->name);
                       // if(p->next==NULL)
                         //   break;
                        p=p->next;
                    }
                    if(t==0)
                        printf("0");
                    printf("\n");
                }
                getch();
            }
        }
    }

     

相關文章