散列---分离连接法

分离连接法,将散列到同一个值都进行保留到表中。其散列函数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);

    }

}

希望各位前辈指出错误!




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值