分離連接法,將散列到同一個值都進行保留到表中。其散列函數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);
}
}
希望各位前輩指出錯誤!