• 通讯录和内存动态管理


    目录

    (通讯录)动态增长版                

    实现效果

    找单身狗

    题目

    源码

    思路

    三个内存函数的模拟实现

    模拟实现strncpy

    模拟实现strncat

    模拟实现atoi


    (通讯录)动态增长版                

    该版本通讯录在原版的基础上增加了检查容量函数,实现了通讯录的动态增长

    1. //检查是否需要增容
    2. int CheckSz(Contact* pc)
    3. {
    4. if (pc->count == pc->sz)
    5. {
    6. PeoInfo* str = (PeoInfo*)realloc(pc->date, (pc->sz + ADD_SZ) * sizeof(PeoInfo));
    7. if (str == NULL)
    8. {
    9. perror("CheckSz:");
    10. return 0;
    11. }
    12. else
    13. {
    14. pc->date = str;
    15. pc->sz += ADD_SZ;
    16. printf("增容成功\n");
    17. return 1;
    18. }
    19. }
    20. return 1;
    21. }

    在使用添加函数时调用检查容量函数即可实现动态增长

    实现效果

    找单身狗

    题目

    一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。

    编写一个函数找出这两个只出现一次的数字。

    例如:

    有数组的元素是:1,2,3,4,5,1,2,3,4,6

    只有5和6只出现1次,要找出5和6.

    源码

    1. void FindSingle(int* arr, int size,int* dog1,int* dog2)
    2. {
    3. //计算所有数组异或结果ret
    4. int i = 0;
    5. int ret = 0;
    6. for (i = 0; i < size; i++) {
    7. ret ^= arr[i];
    8. }
    9. //计算ret第几位是1
    10. int pos = 0;
    11. for ( i = 0; i < 32 ; i++)
    12. {
    13. if ((ret >> i )& 1 == 1)
    14. {
    15. pos = i;
    16. break;
    17. }
    18. }
    19. //计算第pos为1异或
    20. for (int i = 0; i < size; i++)
    21. {
    22. if (((arr[i] >> pos) & 1) == 1)
    23. {
    24. *dog1 ^= arr[i];
    25. }
    26. //计算第pos为0异或
    27. else
    28. {
    29. *dog2 ^= arr[i];
    30. }
    31. }
    32. }
    33. int main()
    34. {
    35. int arr[] = { 1, 2, 3, 4, 5, 1, 2, 3, 4, 6 };
    36. int size = sizeof(arr) / sizeof(arr[0]);
    37. int dog1 = 0;
    38. int dog2 = 0;
    39. FindSingle(arr, size,&dog1,&dog2);
    40. printf("单身狗是%d %d",dog1,dog2);
    41. return 0;
    42. }

    思路

    使用了异或的思想   相同为0  不同为1

    (注意!异或比较的是二进制位 任何数与0的异或都为本身 而不是1)

    1.计算所有数组异或结果ret   

    2.计算ret第几位是1    
    3.计算第pos为1异或

    4.计算第pos为0异或

    三个内存函数的模拟实现

    模拟实现strncpy

    从字符串中复制字符

    1. #define _CRT_SECURE_NO_WARNINGS 1
    2. #include
    3. #include
    4. //char* strncpy(char* destination, const char* source, size_t num);
    5. char* my_strncpy(char* des, const char* src, int num)
    6. {
    7. char* temp = des;
    8. assert(des != NULL);
    9. assert(src != NULL);
    10. while (*src && num--)
    11. {
    12. *des = *src;
    13. des++;
    14. src++;
    15. }
    16. *des = '\0'; //将\0拷贝
    17. return temp;
    18. }
    19. int main()
    20. {
    21. char str1[] = "To be or not to be";
    22. char str2[40];
    23. char str3[40];
    24. my_strncpy(str2, str1, 8);
    25. my_strncpy(str3, str2, 5);
    26. puts(str1);
    27. puts(str2);
    28. puts(str3);
    29. return 0;
    30. }

    模拟实现strncat

    从字符串追加字符

    1. #define _CRT_SECURE_NO_WARNINGS 1
    2. #include
    3. #include
    4. //char* strncat(char* destination, const char* source, size_t num);
    5. char* my_strncat(char* des, const char* src,int num)
    6. {
    7. assert(des);
    8. assert(src);
    9. char* temp = des;
    10. while (*des)
    11. {
    12. des++;
    13. }
    14. while (*src && num--)
    15. {
    16. *des++ = *src++;
    17. }
    18. *des = '\0';
    19. return temp;
    20. }
    21. int main()
    22. {
    23. char str1[20];
    24. char str2[20];
    25. strcpy(str1, "To be ");
    26. strcpy(str2, "or not to be");
    27. my_strncat(str1,str2,6);
    28. puts(str1);
    29. return 0;
    30. }

    模拟实现atoi

    将字符串转换为整数

    1. #define _CRT_SECURE_NO_WARNING 1
    2. #include
    3. #include
    4. #include
    5. #include
    6. //1.空指针
    7. //2.空字符串
    8. //3.空白字符
    9. //4.数字超过范围
    10. //
    11. enum State
    12. {
    13. TID,
    14. FID
    15. }state = FID;//全局的转态,它的值标志返回的值是合法还是异常
    16. int my_atoi(const char* str)
    17. {
    18. int flag = 1;
    19. assert(str);//空指针
    20. if (*str == '\0')//空字符串
    21. {
    22. return 0;
    23. }
    24. //跳过空白字符
    25. while (isspace(*str))
    26. {
    27. str++;
    28. }
    29. if (*str == '-')
    30. {
    31. flag = -1;
    32. str++;
    33. }
    34. else if (*str == '+')
    35. {
    36. str++;
    37. }
    38. long long ret = 0;
    39. while (*str != '\0')
    40. {
    41. if (isdigit(*str))
    42. {
    43. ret = ret * 10 + flag * (*str - '0');
    44. if (ret > INT_MAX || ret < INT_MIN)
    45. {
    46. return 0;
    47. }
    48. }
    49. else
    50. {
    51. return (int)ret;
    52. }
    53. str++;
    54. }
    55. state = TID;
    56. return (int)ret;
    57. }
    58. int main()
    59. {
    60. int ret = my_atoi("123");
    61. if (state == TID)
    62. {
    63. printf("%d\n", ret);
    64. }
    65. else
    66. {
    67. printf("非法返回:%d\n", ret);
    68. }
    69. return 0;
    70. }

  • 相关阅读:
    程序员挖“洞”致富:发现一个漏洞,获赏 1272 万元
    JS正则表达式
    计算机视觉 激光雷达结合无监督学习进行物体检测的工作原理
    wy的leetcode刷题记录_Day25
    python基础:廖雪峰的官方网站Python(部分)笔记
    【K8S】用minikube start 建立K8S集群--20220901
    Go 使用 freecache 缓存
    Jmeter 性能-死锁问题定位+分析
    知识图谱(Knowledge Graph)- Neo4j 5.10.0 使用 - CQL - 太极拳传承谱系表
    SkyWalking快速上手(二)——架构剖析1
  • 原文地址:https://blog.csdn.net/Jay_0824/article/details/133974010