Chinaunix首页 | 论坛 | 博客
  • 博客访问: 209631
  • 博文数量: 136
  • 博客积分: 2919
  • 博客等级: 少校
  • 技术积分: 1299
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-11 09:08
文章分类

全部博文(136)

文章存档

2013年(1)

2011年(135)

我的朋友

分类: C/C++

2011-03-11 09:21:25

/*
 * tpop(2): algorithms and data structures
 * created on Mar 2, 2011
 */
#include

/* NELEMS macro: computes the number of elements in the array */
#define NELEMS(array) (sizeof(array) / sizeof(array[0]))

typedef struct Nameval Nameval;
struct Nameval 
{
        char *name;
        int value;
};

int lookup(char *, Nameval [], int); //binary search
int lookupV1(char *, Nameval [], int); //bsearch system function
int nvcmp(const void *, const void *);

/* lookup main: binary search a word in an array */
int main(int argc, char *argv[])
{
        /* HTML characters, e.g. AElig is ligature of A and E. */
        /* Values are Unicode/ISO10646 encoding. */
        Nameval htmlchars[] = {
                "AElig", 0x00c6,
                "Aacute", 0x00c1,
                "Acirc", 0x00c2,
                /* ...*/
                "zeta", 0x03b6,
        };
        
        if (argc == 1) /* why not argc == 1? */
                printf("usage: binsearch name\n");
        else
                printf("Name %s was found at %d\n", argv[1], lookupV1(argv[1], htmlchars, NELEMS(htmlchars)));
}

/* lookup: binary search for name in tab; return index */
int lookup(char *name, Nameval tab[], int ntab)
{
        int low, high, mid, cmp;

        low = 0;
        high = ntab-1;
        while (low <= high) {
                mid = (low + high) / 2;
                cmp = strcmp(name, tab[mid].name);
                if (cmp < 0)
                        high = mid - 1;
                else if (cmp > 0)
                        low = mid + 1;
                else        /* found match */
                        return mid;
        }
        return -1;     /* no match */
}


/* lookupV1: use bsearch to find name in tab, return index */
int lookupV1(char *name, Nameval tab[], int ntab)
{
        Nameval key, *np;

        key.name = name;
        key.value = 0; /* unused; anthing will do */
        np = (Nameval *)bsearch(&key, tab, ntab, sizeof(tab[0]), nvcmp);

        if (np == NULL)
                return -1;
        else
                return np-tab;
}

/* nvcmp: compare two Nameval names */
int nvcmp(const void *va, const void *vb)
{
        const Nameval *a, *b;
        a = (Nameval *)va;
        b = (Nameval *)vb;
        return strcmp(a->name, b->name);
}
    
阅读(440) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:tpop(1): Style

给主人留下些什么吧!~~