• C语言 指针 模拟排序函数 指针数组笔试题上


    目标:使用【冒泡排序】的算法,模拟一个排序函数,可以排序任意类型的数据

    1. void print_arr(int arr[], int sz)//打印函数 只能接受整型数组
    2. {
    3. int i = 0;
    4. for (i = 0; i < sz; i++)
    5. {
    6. printf("%d ", arr[i]);
    7. }
    8. printf("\n");
    9. }
    10. void swap(char* buf1, char* buf2, size_t size)
    11. {
    12. int i = 0;
    13. for (i = 0; i < size; i++)
    14. {
    15. char tmp = *buf1;
    16. *buf1 = *buf2;
    17. *buf2 = tmp;
    18. buf1++;
    19. buf2++;
    20. }
    21. }
    22. //void*指针接收任意类型指针,size_t无符号整形,num是元素个数,size是一个元素的大小,*cmp函数排序
    23. //int (*cmp)(const void* e1,const void* e2)
    24. //e1是一个指针,存放了要比较元素的地址
    25. //e2是一个指针,存放了要比较元素的地址
    26. //e1指向的元素大于e2指向的元素,返回一个1/>0的数字
    27. //e1指向的元素小于e2指向的元素,返回一个-1/<0的数字
    28. //泛型编程
    29. void bubble_sort(void* base, size_t num, size_t size,int (*cmp)(const void* e1,const void*e2) )//这个函数只能排序整形数据,通过指针进行比较
    30. { //int类型占4个字节 转化为char型 (char*)base+j*size
    31. int i = 0;
    32. //冒泡排序比较的趟数 n个元素要进行n-1次冒泡排序 n个元素有n-1对元素要进行排序
    33. for (i = 0; i < num - 1; i++)
    34. {
    35. //一趟冒泡排序的过程,共有(10-1)!次冒泡排序
    36. int j = 0;
    37. for (j = 0; j < num - 1 - i; j++)
    38. {
    39. //(char*)base+j*size,(char*)base+(j+1)*size
    40. //结构体数据不能直接使用数学符号进行比较
    41. if(cmp((char*)base + j * size, (char*)base + (j + 1) * size) > 0)//升序 cmp函数比较两个结构体关系 调用cmp函数
    42. { //数据类型*数据所占字节 跳过一个元素
    43. //char* +1---1*sizeof(char),int* +1---1*sizeof(int)
    44. //交换
    45. swap((char*)base + j * size, (char*)base + (j + 1) * size, size);
    46. }
    47. }
    48. }
    49. }
    50. //两个整形比较函数
    51. int cmp_int(const void* e1, const void* e2)
    52. {
    53. return *(int*)e1 - *(int*)e2;//强转成整形指针后解引用,得到整形
    54. }
    55. void test1()//实现整形排序
    56. {
    57. int arr[] = { 9,8,7,6,5,4,3,2,1,0 };//降序
    58. //排序为升序
    59. int sz = sizeof(arr) / sizeof(arr[0]);
    60. print_arr(arr, sz);
    61. bubble_sort(arr, sz,sizeof(arr[0]),cmp_int);//调用了冒泡排序函数,冒泡排序函数调用了swap比较函数
    62. print_arr(arr, sz);
    63. }
    64. struct Stu//定义结构体
    65. {
    66. char name[20];//姓名
    67. int age;//年龄
    68. };
    69. //结构体根据年龄比较
    70. int cmp_stu_by_age(const void* e1, const void* e2)
    71. {
    72. return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
    73. }
    74. //结构体根据名字比较
    75. int cmp_stu_by_name(const void* e1, const void* e2)
    76. {
    77. //返回值与期望返回值一样
    78. //#include
    79. return strcmp(((struct Stu*)e1)->name , ((struct Stu*)e2)->name);
    80. }
    81. void test2()//实现结构体排序
    82. {
    83. struct Stu arr[] = { {"zhangsan",20},{"lisi",30},{"wangwu",15} };//一个汉字两个字符空间
    84. int sz = sizeof(arr) / sizeof(arr[0]);
    85. bubble_sort(arr, sz, sizeof(arr[0]), cmp_stu_by_name);
    86. int i = 0;
    87. }
    88. void test3()
    89. {
    90. struct Stu arr[] = { {"zhangsan",20},{"lisi",30},{"wangwu",15} };
    91. int sz = sizeof(arr) / sizeof(arr[0]);
    92. }
    93. int main()
    94. {
    95. //整形数据、字符数据、结构体数据
    96. //可以使用qsort函数对数据进行排序
    97. //测试bubble_sort,排序整形数据
    98. //test1();
    99. //测试bubble_sort,排序结构体数据
    100. test2();
    101. return 0;
    102. }

    指针和数组笔试题解析

    4a4a9007a26b46bc90a2834750c381ab.png

    36cedf9d01f841e78e11d62d4a476008.png

    7aef12c5245c4fac805a15239c3cc3d2.png b9895eea9ae54256841a453dab93e165.png9844cececf5c4d96b066009ba098f781.jpg

     总结: 数组名的意义:
    1.sizeof(数组名), 这里的数组名表示整个数组, 计算的是整个数组的大小。
    2.&数组名, 这里的数组名表示整个数组,取出的是整个数组的地址。
    3.除此之外所有的数组名都表示首元素的地址。

  • 相关阅读:
    Pwsh 配置 Oh My Posh
    相比typescript,python的动态类型有什么优缺点?
    Structured API基本使用
    信号生成和可视化
    FFMPEG命令
    织梦CMS_V5.7任意用户密码重置漏洞复现
    前三季度L2级辅助驾驶增速放缓?市场下沉压力凸显背后
    前端三件套 HTML+CSS+JS基础知识内容笔记
    带你从入门到精通学习WireShark
    进程优先级
  • 原文地址:https://blog.csdn.net/m0_73983707/article/details/132911741