散列---分離連接法

分離連接法,將散列到同一個值都進行保留到表中。其散列函數hash(x)=x mod tableSize;其實之前自己寫過這個散列,現在是在原來基礎之上拓展的。

數據構成:  

typedef struct node{

    Data da[MAX];

    unsigned int key;//索引

    unsigned int value;//該值出現的次數

    unsigned int len;//表的長度,在node中時候爲1

    unsigned int size;//表中每行的數據長度

    struct node * next;

}node;

int Hash(const int length,const int ser)

{

    return (int)length%ser;

}

初始化構造函數

void initialLink(node* l,const int len)

{

    l=malloc(len*sizeof(node));

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

    {

        l[i].value=0;

        memset(l[i].da, 0, MAX);

        l[i].key=0;

        l[i].len=len;

        l[i].next=NULL;

        l[i].size=0;

    }

}

插入函數,檢測其有沒有,有了只是進行加1的操作value++

void insert(node *l,node *p)

{

    int flag=1;

    node *index=&l[p->key%l->len];

    while(index->next!=NULL)

    {

        if(strcmp(index->da,p->da)==0)

        {

            flag=0;

            break;

        }

        index=index->next;

    }

    if(flag==0)

    {

        index->value++;

    }

    else {

    index->next=p;

    }

    l[p->key%l->len].size++;

}

查找返回,成功返回的是-1

int Find(node *l,node p)

{

    int flag=0;

    int index=Hash(l->len, p.key);

    node *s=&l[index];

    while(s->next!=NULL)

    {

       if(strcmp(s->da, p.da)==0)

       {

           flag=1;

           break;

       }

        s=s->next;

    }

    return flag;

}

輸入node

void setnode(node *p)

{

    char da[MAX];

    int key;

    printf("input the data is :");

    fgets(da,MAX,stdin);

    printf("the key:");

    scanf("%d",&key);

    memcmp(p->da, da, MAX);

    p->key=key;

    p->value=1;

    p->next=NULL;

}

統計所有的數據有多少

int total_of_list(node *l)

{

    int sum=0;

    int su=l->len;

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

        sum+=l[i].size;

    return sum;

}

刪除節點

void delete_node(node *l,node *p)

{

    int index=Hash(l->len, p->key);

    node *s=&l[index];

    while(s->next!=NULL)

    {

        if(Find(s->next, *p)==1)

        {

            break;

        }

        s=s->next;

    }

    node * next=s->next;

    if(next->next==NULL)

    {

        s->next=NULL;

        free(next);

    }

    else

    {

        node *in=next->next;

        s->next=in;

        free(next);

    }

}

希望各位前輩指出錯誤!




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章