本题为我们公司前一段时间技术评级的考题,先让实现一个双向循环链表的一些操作,然后实现一个hash表,其hash结点为双向循环链表结点。hash函数为最简单的除数留余法
处理冲突的方式为链地址法。
/**
采用双向循环链表实现HASH表
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#define RS_OK 0
#define RS_WRONG 1
#define MAX_LEN 128
#define FUNCTION_SHOW printf("this is %s, %d\n", __FUNCTION__, __LINE__);
/*双向循环链表结点*/
typedef struct list {
struct list *next;
struct list *prev;
int key;
int data;
}list;
/*hash表数据结构*/
typedef struct hash {
/*hash桶的大小*/
int bucket_size;
/*初始化时共申请bucket_size块list结构
每一个list都是一个冲突链的头结点。
*/
struct list *buckets;
}hash;
void list_print(struct list *head)
{
list *node;
FUNCTION_SHOW
if (!list_empty(head))
return;
node = head->next;
while (node != head) {
printf ("%d\n", node->key);
node = node->next;
}
return;
}
/*初始化双