Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
路过~~~,一个链地址哈希,正好昨天想复习数据结构,顺别写个自己的哈希以后能用,咱也来试试咋样,,凑合吧,本来也不是为acm写的,简单改了一下,有望指点,c++编译没问题#include <stdio.h> #include <string.h> #include <stdlib.h> struct Node { char key[11]; char value[11]; Node*next; }; struct Table { Node*table; int range; }; int Insert(Node*Head,Node*ele); //插入结点 int InitTable(int range,Table*table); //初始化哈希表 unsigned long CalcHash(char*key); int In(Table*table,char*key,char*value); char* Find(Node*Head,char*key); char*Out(Table*table,char*key); int Insert(Node*Head,Node*ele) { while(Head->next!=NULL) { Head=Head->next; //if(strcmp(ele->key,Head->key)==0) //{ // return 0; //} } Head->next=ele; return 1; }; unsigned long CalcHash(char*key) { int length=strlen(key); unsigned long Hash=0; for(int i=0;i<length;i++) { Hash=(key[i]<<3)+(key[i]>>3)+Hash+(key[i]<<(i%6-6)); } return Hash; } int InitTable(int range,Table*table) { table->table=(Node*)malloc(range*sizeof(Node)); //申请空间 table->range=range; memset(table->table,0,range*sizeof(Node)); /* for(int i=0;i<range;i++)//初始化结点 { table->table[i].next=NULL; }*/ return 0; } int In(Table*table,char*key,char*value) { unsigned long Hash=CalcHash(key)%table->range; //计算散列表的位置 //Node*ele=new Node; Node*ele=(Node*)malloc(sizeof(Node)); memcpy(ele->key,key,11); //创造结点 memcpy(ele->value,value,11); ele->next=NULL; Insert(&(table->table[Hash]),ele); /*if(Insert(&(table->table[hash]),ele)==0) //插入结点成功 { //cout<<"SUCCESS"<<endl; return 1; } else { //cout<<"FAILD"<<endl; return 0; }*/ return 0; } char* Find(Node*Head,char*key) { while(Head->next!=NULL) { Head=Head->next; if(strcmp(key,Head->key)==0) { return Head->value; } } return NULL; } char*Out(Table*table,char*key) { unsigned long Hash=CalcHash(key)%table->range; //计算散列表的位置 return Find(&(table->table[Hash]),key); } char buffer[22]; int main() { char key[11],value[11]; char*outs; Table t; InitTable(10001,&t); while(gets(buffer)) { if(buffer[0] == '\0') break; sscanf(buffer, "%s %s", value, key); In(&t,key,value); } while(scanf("%s",key)!=EOF) { outs=Out(&t,key); if(!outs) printf("eh\n"); else printf("%s\n",outs); } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator