#include <stdio.h> #include <stdlib.h> #include <string.h> #define HASHSIZE 1001 struct nlist { struct nlist *next; char *name; char *defn; }; static struct nlist *HashMap[HASHSIZE]; unsigned hash(char *s) { unsigned hashval; for (hashval = 0; *s; s++) hashval = *s + 31 * hashval; return hashval % HASHSIZE; } struct nlist *lookup(char *s) { struct nlist *np; for (np = HashMap[hash(s)]; np != NULL; np = np->next) if (strcmp(s,np->name) == 0) return np; return NULL; } char *strdup(char *s) { char *p; p = (char *)malloc(strlen(s)+1); if (p != NULL) strcpy(p,s); return p; } 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 = HashMap[hashval]; HashMap[hashval] = np; } if ((np->defn = strdup(defn)) == NULL) return NULL; return np; } int main() { char buf[50]; char name[11],defn[11]; while (gets(buf)) { char *p = strstr(buf," "); if (p == NULL) break; memset(name,0,sizeof(name)); memset(defn,0,sizeof(defn)); strcpy(name, p+1); memcpy(defn, buf,p-buf); install(name,defn); } while (gets(name)) { struct nlist *np = lookup(name); if (np != NULL) printf("%s/n",np->defn); else puts("eh"); } return 0; }