1. Generic switching
// 1. Write an int type of swap void Swap (int *vp1, int *VP2) { int a = *VP1; *VP1 = *VP2; *VP2 = *VP1;} // 2. Extended to generic swap void swap (void *vp1, void *vp2, size) { char Buffer[size]; memcpy (buffer, VP1, size); memcpy (VP1, VP2, size); memcpy (VP2, buffer, size);}
Using the generic swap Exchange c-string:
Char " Fred " ; Char " Wilma " ; swap (&husband,&wife,sizeof(char));
2. Generic Linear search
//1. Writing lsearch of type intint* Lsearch (intKey,int* Array,intsize) { for(inti =0; i < size; i++) { if(Array[i] = =key)returni; } returnNULL;}//2. Writing generic Lsearchint*lsearch (void*key,void*Base,intSizeintelementsize) { for(inti =0; i < size; i++) { void* Elemaddr = (Char*)Base+ I *elemsize; if(MEMCMP (Key, elemaddr, elemsize) = =0) returnelemaddr; } returnNULL;}
If you use a generic lsearch to search for c-string, because the length of the c-string is not fixed, you cannot compare it with memcmp. Can be implemented with function pointers:
int*lsearch (void*key,void*Base,intSizeintElementSize,int(*cmpfunc) (void*,void*)){ for(inti =0; i < size; i++) { void* Elemaddr = (Char*)Base+ I *elemsize; if(Cmpfunc (key, elemaddr) = =0) returnelemaddr; } returnNULL;}
Implement Cmpfunc:
//Compare intintINTCMP (void*ELEM1,void*elem2) { int*IP1 =elem1; int*IP2 =elelm2; return*ip1-*ip2;}//Compare C-stringintSTRCMP (void*ELEM1,void*elem2) { Char*S1 = * (Char**) elem1; Char*S2 = * (Char**) elem2; returnstrcmp (S1,S2);}
Writing generic functions with void*