分离连接法,将散列到同一个值都进行保留到表中。其散列函数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);
}
}
希望各位前辈指出错误!