cs107 编程范式(四)

224 阅读1分钟

int型线性搜索

void* lsearch(void *key, void *base, int n, int elemSize, int (*cmpfn)(void*, void*))
{
    for(int i = 0; i < n; i++)
    {
        void *elemAddr = (char*)base + i * elemSize;
        if(cmpfn(key, elemAddr) == 0) {
            return elemAddr;
        }
    }
    
    return NULL;
}
int array[] = {4, 2, 3, 7, 11, 6};
int size = 6;
int number = 7;

int intCmp(void *elem1, void *elem2)
{
    int *vp1 = (int*)elem1;
    int *vp2 = (int*)elem2;
    
    return *vp1 - *vp2;
}

int *found = lsearch(&number, array, 6, sizeof(int), intCmp);

char*线性搜索

void* lsearch(void *key, void *base, int n, int elemSize, int (*cmpfn)(void*, void*))
{
    for(int i = 0; i < n; i++)
    {
        void *elemAddr = (char*)base + i * elemSize;
        if(cmpfn(key, elemAddr) == 0) {
            return elemAddr;
        }
    }
    
    return NULL;
}
char *notes[] = {"Ab", "F#", "B", "6b", "D"};
char *favoriteNote = "Eb";

int StrCmp(void *elem1, void *elem2)
{
    char *vp1 = *(char**)elem1;
    char *vp2 = *(char**)elem2;
    
    return strcmp(vp1, vp2);
}

char** found = lsearch(&favoriteNote, notes, 5, sizeof(char*), StrCmp);

其中,strcmp是string.h头文件中的函数。因为notes代表的是char*类型数组首元素的地址,所以其类型本质上为char**。为了使比较函数的类型转换同一,这里同样对favoriteNote进行取地址操作。

二分搜索

void *bsearch(void *key, void *base, int n, int elemSize, int (*cmp)(void*, void*)) 
{
    int low = 0, high = n - 1, mid;
    
    while(low < high)
    {
        mid = low + ((high - low) >> 1);
        void *elemAddr = (char*)base + mid * elemSize;
        if(cmp(key, elemAddr) == 0)
            return elemAddr;
        else if(cmp(key, elemAddr) > 0) 
        {
            high = mid - 1;
        } else 
        {
            low = mid + 1;
        }
    }
    
    return NULL;
}

int类型的栈实现

typedef struct {
    int *elems;
    int logicalLength;
    int allocLength;
} stack;

void StackNew(stack *s);
void StackDispose(stack *s);
void StackPush(stack *s, int value);
void StackPop(stack *s);
void StackNew(stack *s)
{
    s->logicalLength = 0;
    s->allocLength = 4;
    s->elems = (int*)malloc(4 * sizeof(int));
    assert(s->elems != NULL);
}

后续下节课进行实现