链表查找算法-节约内存

来源:互联网 发布:淘宝模特韩国短发 编辑:程序博客网 时间: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;}

原创粉丝点击