c语言实现用于任意大小的数据类型的泛型交换函数以及通用线性搜索函数

一个简单的泛型交换函数

void swap(void* vp1,void* vp2,int size){//void* 表示任意类型
    char buffer[size];//为交换留出存储空间
    memcpy(buffer,vp1,size);//memcpy(目标地址,源地址,字节大小)
    memcpy(vp1,vp2,size);
    memcpy(vp2,buffer,size);
}

调用:

	int s = 5;
	int p = 6;
	swap(&s,&p,sizeof(int));
	float a = 3.54453;
	float v = 634.663;
	swap(&a,&b,sizeof(float));

此时交换的是s和p中的二进制位
在这里插入图片描述

可以发现我们交换的两个变量必须要有同样的类型
那么如果是长度不同的 字符串 呢?
看下面的代码

	char* husband = strdup("Fred");
	char* wife = strdup("Wilma");
	swap(&husband,&wife,sizeof(char*));

声明了两个字符串的指针变量,并用strdup在堆中创建了两个字符串
此时调用swap函数,交换两个字符串指针中的地址的值

在这里插入图片描述
如果我们不对两个字符指针取地址,也可以运行,此时直接交换的是堆中的两个字符串的字符,由于64位系统的指针变量占8个字节,而我们的字符串太短,为了看清区别,这里size写成4

	char* husband = strdup("Fred");
	char* wife = strdup("Wilma");
	swap(husband,wife,4);

输出如下:

Wilm
Freda

可以看到只交换了前4个字节

一个通用类型的线性搜索函数

void* lsearch(void* key,void* base,int size,int elemsize){
/*
key指向要搜索的值,base是数组基地址,
size是元素数目,elemsize是每个元素的大小
*/
    for(int i=0;i<size;i++){
        void* elemAddr = (char*)base + i*elemsize;//char*??
        if(memcmp(key,elemAddr,elemsize)==0){
            return elemAddr;
        }
    }
    return NULL;
}

调用如下

	int a[5] = {1,2,3,4,5};
    int s= 3;
    int* p = &s;
    printf("%d\n",lsearch(p,a,5,4));
    printf("%d",&a[2]);

输出如下

6422024
6422024

最后我们可以把这个函数改成

void* lsearch(void* key,void* base,
				int n,int elemsize,
				int(*cmpfn)(void*,void*,int))

传入一个比较函数进去,实现两个元素的比较
c语言中的qsort函数原型如下,emm有点像

static void __cdecl shortsort(char *lo, char *hi, size_t width,
                int (__cdecl *comp)(const void *, const void *));
static void __cdecl swap(char *p, char *q, size_t width);

参考:
https://see.stanford.edu/Course/CS107.Programming Paradigms lecture 4

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值