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);
}
后续下节课进行实现