表查找

好程序員訓練營

<A href="http://www.goodprogrammer.org/" target="blank">ios培訓</A>

------我的c語言筆記,期待與您交流! 


#include<stdio.h>

#include<string.h>

#include<stdlib.h>

#define HASHSIZE 101


struct nlist

{

    struct nlist *next;

    char *name;

    char *defn;

};


/*hash函數:爲字符串s生成散列值 p126*/

unsigned hash(char *s)

{

    unsigned hashval;


    for(hashval=0;*s!='\0';s++)

    hashval=*s+31*hashval;

    return hashval %HASHSIZE;

}


/*lookup函數:在hashtab中查找s  p126*/

struct nlist *lookup(char *s)

{

    struct nlist *np;


    for(np=hashtab[hash(s)];np!=NULL;np=np->next)

    if(strcmp(s,np->name)==0)

    return np;

    return NULL;

}


/*strdup函數:複製s到某個位置,並且把該地址返回 P126*/

char *strdup(char *s)

{

    char *p;


    p=(char *) malloc(strlen(s)+1);

    if(p!=NULL)

    strcpy(p,s);

    return p;

}


/*install函數:將(name,defn)加入到hashtab中 p127*/

struct nlist *install(char *name,char *defn)

{

    struct nlist *np;

    unsigned hashval;


    if((np=lookup(name))==NULL)

    {

        np=(struct nlist *) malloc(sizeof(*np));

        if(np==NULL||(np->name=strdup(name))==NULL)

        return NULL;

        hashval=hash(name);

        np->next=hashtab[hashval];//出現衝突的話,把新的np放在表頭

        hashtab[hashval]=np;

    }

   else

        free((void *)np->defn);

   if((np->defn=strdup(defn))==NULL)

       return NULL;

   return np;

}


int main()

{

   char *s0="abcdefghijk";

   char *s1="1234";

   struct nlist *p,*p2;

   p=install(s0,s1);

   p2=install(s0,s1);

   printf("%s %s\n",p->name,p->defn);

   printf("%s %s\n",p2->name,p2->defn);

}

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