链表查找算法-节约内存
来源:互联网 发布:淘宝模特韩国短发 编辑:程序博客网 时间:2024/06/05 08:14
#include <stddef.h>#include <stdio.h>#include <string.h>#include <stdlib.h>#include <sys/mman.h>#include <assert.h>#include <errno.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <unistd.h>#define KEYNUM 1000000#define KEYHASH 0xFFFFtypedef struct cr_rec_s cr_rec_t;struct cr_rec_s { char key[10]; int value; int next;};cr_rec_t *g_rec;int g_num;int g_link[KEYHASH];unsigned int key_hash(void *key){ unsigned int k; assert(key != NULL); memcpy(&k, &key[4], 4); return k%KEYHASH;}int key_compare(const void *src, const void *dst, int len){ assert(src != NULL && dst != NULL); return memcmp(src, dst, len);}int mmap_create(void **pmmap, size_t size){ int fd; fd = open("/dev/zero",O_RDWR); if(fd < 0) return errno; (*pmmap) = mmap(NULL,(off_t)size,PROT_READ|PROT_WRITE, MAP_SHARED,fd,0); close(fd); if((*pmmap) == MAP_FAILED) return errno; return 0;}int makekeylist(char *filename){ int stat; void *pmmap; FILE *fp; cr_rec_t rec; int slot; int i; for(i=0; i<KEYHASH; i++) g_link[i] = -1; //1.create mem stat = mmap_create(&pmmap, KEYNUM * sizeof(cr_rec_t)); if(stat != 0){ printf("mmap_create failed, [%d]\n", stat); return stat; } g_rec = pmmap; //2.read list fp = fopen(filename, "r"); if(fp == NULL){ printf("fopen failed\n"); return EINVAL; } while(fread(&rec, offsetof(struct cr_rec_s, next), 1, fp)){ slot = key_hash(rec.key); rec.next = g_link[slot]; g_link[slot] = g_num; memcpy(&g_rec[g_num++], &rec, sizeof(cr_rec_t)); } printf("make key list [%d]\n", g_num); return 0;}int lookupkey(void *key, int *value){ int stat; int slot = key_hash(key); int cur; cr_rec_t rec; memcpy(rec.key, key, 10); cur = g_link[slot]; while(cur >= 0){ stat = key_compare(g_rec[cur].key, rec.key, 8); if(stat == 0){ memcpy(key, g_rec[cur].key, 10); *value = g_rec[cur].value; return 0; } cur = g_rec[cur].next; } return 2010;}