泛型编程

本文介绍了C语言中的泛型编程技巧,包括使用void指针进行泛型交换、自定义泛型交换函数以及实现泛型搜索算法。此外,还讨论了内存管理的重要性,并展示了如何避免内存泄漏。

void *cp //通用指针、泛型指针,用于临时储存地址。

缺点:1、不能解引用,及*cp(错误)。2、不能进行算术运算。cp++(错误)。

malloc  动态创建内存,返回一个泛型指针。

动态内存最大的问题:内存泄漏。

 

 

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

/*void Swap(void *vp1,void *vp2,int size)//泛型交换,size表示交换内容的字节长度
{
 char *tmp = (char*)malloc(size);//创建动态内存,用作临时存储。
 memcpy(tmp,vp1,size);//内存拷贝
 memcpy(vp1,vp2,size);
 memcpy(vp2,tmp,size);
 free(tmp);//释放内存
}

int main()
{
 int a = 10;
 int b = 20;
 Swap(&a,&b,sizeof(int));
 printf("%d %d\n",a,b);
 float m = 12.89f;
 float n = 20.09f;
 Swap(&m,&n,sizeof(float));
 printf("%f %f\n",m,n);
}*/


/*void My_memcpy(void *vp1,void *vp2,int size)//实现内存拷贝
{
 char *cp1 = (char*)vp1;
 char *cp2 = (char*)vp2;
 if(cp1<cp2)
 {
  for(int i = 0;i<size;i++)
  {
   cp1[i] = cp2[i];
  }
 }
 else
 {
  for(int i = size-1;i>=0;i--)
  {
   cp1[i] = cp2[i];
  }
 }
}

void Swap(void *vp1,void *vp2,int size)
{
 char *tmp = (char*)malloc(size);
 My_memcpy(tmp,vp1,size);
 My_memcpy(vp1,vp2,size);
 My_memcpy(vp2,tmp,size);
 free(tmp);
}

int main()
{
 int a = 10;
 int b = 20;
 Swap(&a,&b,sizeof(int));
 printf("%d %d\n",a,b);
 float m = 12.89f;
 float n = 20.09f;
 Swap(&m,&n,sizeof(float));
 printf("%f %f\n",m,n);
}*/

/*void Swap1(void *str,void *des,int size)//不使用memcpy函数实现的泛型交换
{
 char *tmp = (char*)malloc(size);
 char *cp1 = (char*)str;
 char *cp2 = (char*)des;
 for(int i = 0;i<size;i++)
 {
  tmp[i] = cp1[i];
 }
 for(int i = 0;i<size;i++)
 {
  cp1[i] = cp2[i];
 }
 for(int i = 0;i<size;i++)
 {
  cp2[i] = tmp[i];
 }

}

int main()
{
 int a = 10;
 int b = 20;
 Swap1(&a,&b,sizeof(int));
 printf("%d %d\n",a,b);
 float m = 12.89f;
 float n = 20.09f;
 Swap1(&m,&n,sizeof(float));
 printf("%f %f\n",m,n);
}*/

typedef int (*Pcmp) (void *vp1,void *vp2);//回调函数

int Search(void *arr,int len,void *p_key,int elemsize,Pcmp cmp)// elemsize 一个单元格的大小,cpm 判断是否相等的依据。
{
 char *cp1;
 for(int i = 0;i<len;i++)
 {
  cp1 = (char*)arr+i*elemsize;
  if(cmp(cp1,p_key)==0)
  {
   return i;
  }
 }
 return -1;
}

int int_cmp(void *cp1,void *cp2)
{
 return *(int*)cp1 - *(int*)cp2;
}


#define EPS 0.000001
int double_cmp(void *cp1,void *cp2)
{
 double tmp = *(double*)cp1-*(double*)cp2;
 if(-EPS<tmp&&tmp<EPS)//浮点数如何与0相等。定义一个误差,若在误差之内则判断与0相等
 {
  return 0;
 }
 else
  return -1;
}

typedef struct Student//结构体,自定义数据类型
{
 char name[20];
 int score;
}Student;

int  Stu_na_cmp(void *cp1,void *cp2)
{
 return strcmp(((Student *)cp1)->name,(char *)cp2);//通过结构体指针访问它的成员使用—>
}
int Stu_sco_cmp(void *vp1,void *vp2)
{
 return ((Student *)vp1)->score - *(int *)vp2;
}

 


int main()
{
 int str[] = {12,23,34,0,9,23,54};
 int m = 34;
 int n = 13;
 int p = Search(str,sizeof(str)/sizeof(str[0]),&m,sizeof(int),int_cmp);
 if(p >=0 )
 {
  printf("%d\n",str[p]);
 }
 else
 {
  printf("无此数\n");
 }

 int key = Search(str,sizeof(str)/sizeof(str[0]),&n,sizeof(int),int_cmp);
 if(key >=0 )
 {
  printf("%d\n",str[key]);
 }
 else
 {
  printf("无此数\n");
 }

 double brr[5] = {11.89,13.54,14.76,34.56,56.79};
 double dkey = 34.56;
 int index = Search(brr,5,&dkey,sizeof(double),double_cmp);
 if(index >=0 )
 {
  printf("%f\n",brr[index]);
 }
 else
 {
  printf("无此数\n");
 }

 Student des[2]={"xiaoming",23,"xaiohong",45};
 int score = 23;
 int mkey = Search(des,2,&score,sizeof(Student),Stu_sco_cmp);
 if(mkey >=0 )
 {
  printf("%s,%d\n",des[mkey].name,des[mkey].score);
 }
 else
 {
  printf("无此人\n");
 }
 }

转载于:https://www.cnblogs.com/97-5-1/p/7361181.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值