# Thread: Chained hash tables using an array of lists

1. ## Chained hash tables using an array of lists

I know how to use linked lists (is that similar to an array of lists?) and I kind of understand the concept of hash tables. But how would I implement a hash table using an array of lists. Also, how do I XOR characters?

To XOR two values, use the ^ and ^= operators.

Code:
```char a, b;
a = 'a';
b = 'b';

a ^= b;
b ^= a;
a ^= b; // Now a = 'b' and b = 'a'```

3. >But how would I implement a hash table using an array of lists.
Play around with this simple hash table with linked list chaining. It's really very simple, you just have to see how things work.
Code:
```#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define TABSIZ 200

struct TabRec {
struct TabRec *next;
char name[BUFSIZ];
};

static struct TabRec *htable[TABSIZ];

unsigned hash(char *s)
{
unsigned h;

for (h = 0; *s; s++)
h = *s + 31 * h;

return h % TABSIZ;
}

struct TabRec *find(char *name)
{
struct TabRec *item;

for (item = htable[hash(name)]; item; item = item->next)
{
if (strcmp(name, item->name) == 0)
return item;
}

return NULL;
}

struct TabRec *insert(char *name)
{
struct TabRec *item;
unsigned h;

if ((item = find(name)) == NULL)
{
if ((item = malloc(sizeof (*item))) == NULL)
return NULL;

strcpy(item->name, name);

h = hash(name);
item->next = htable[h];
htable[h] = item;
}

return item;
}

int main(void)
{
char buf[BUFSIZ];
struct TabRec *item;

while (fgets(buf, sizeof (buf), stdin))
{
if (insert(buf) == NULL)
break;
}

printf("Enter a name to find: ");
fflush(stdout);

if (fgets(buf, sizeof (buf), stdin))
{
if ((item = find(buf)) != NULL)
printf("%s", item->name);
}

return 0;
}```