通用類型的SWAP函數的實現 通用數組類型的線性搜索函數的實現 c void lSerch(void key,void base,int n,int elemSize){ void elemAddr; for(int i;i ...
通用類型的SWAP函數的實現
void swap(void *vp1,void *vp2,int size){
char buffer[size]; //也可用malloc獲取一塊size大的記憶體
memcpy(buffer,vp1,size);
memcpy(vp1,vp2,size);
memcpy(vp2,buffer,size);
}
//調用舉例
int n1=5,n2=6;
swap(&n1,&n2,sizeof(int));
char *s1="ming",*s2="li";
swap(&s1,&s2,sizeof(char **)); //字元串不等長,不能交換字元串,交換指針
通用數組類型的線性搜索函數的實現
void *lSerch(void *key,void *base,int n,int elemSize){
void *elemAddr;
for(int i;i<n;i++){
elemAddr=(char *)base+i*elemSize;
if(memcmp(elemAddr,key,elemSize)==0)
return elemAddr;
}
return NULL;
}
上述函數在數組是存儲shor,int,long,float,double,char
等類型的元素都可用,因為這些類型記憶體存儲長度固定,但對於char *arr[]
存儲字元串數組不適用,為瞭解決這個問題,增加函數的通用性,可以在上述函數中增加一個函數指針的參數,用這個函數調用一個自定義的比較函數,實例如下
void *lSearch(void *key,void *base,int total_n,int elemSize,int (*cmpfn)(void *,void *)){
void *elemAddr;
for(int i=0;i<total_n;i++){
elemAddr=(char *)base+i*elemSize;
if(!cmpfn){
if(memcmp(elemAddr,key,elemSize)==0)
return elemAddr;
}else{
if(cmpfn(elemAddr,key)==0)
return elemAddr;
}
}
return NULL;
}
//字元串數組搜索範例
int strCmp(void *vp1,void *vp2){
char *s1=*(char**)vp1; //不要寫成s1=(char *)cp1;s1獲取的值不一樣
char *s2=*(char**)vp2;
return strcmp(s1,s2);
}
int main(){
char *key="abc";
char *arrc[]={"cc","bc","abc","dd"};
char *find=lSearch(&key,arrc,4,sizeof(char *),strCmp);
}