• 65.十一级指针实现百万qq号的增删查改以及排序写入


    运行结果:

    内存使用情况:

    写入文件排序好的数据:

    • 创建文件地址以及创建十一级指针
      1 char *path = "QQ.txt";
      2 char *sortpath = "QQchiguowei2018.txt";
      3 //创建十一级指针
      4 char  *********** allP = NULL;
    • 初始化十一级指针
       1 //初始化
       2 void init()
       3 {
       4     
       5     FILE *pf = fopen(path, "r");
       6     if (pf==NULL)
       7     {
       8 
       9         printf("文件打开失败");
      10         return;
      11     }
      12     else
      13     {
      14         //读取每一行加载到allP中
      15         for (int i = 0; i < allN; i++)
      16         {
      17             char str[50] = { 0 };
      18             fgets(str, 50, pf);//读取
      19             char *tmpstr = convertQQ(str);//获取QQ号
      20 
      21             if (isallnum(tmpstr))
      22             {
      23                 assignmem(&allP, 11, tmpstr);//分配内存
      24 
      25                 strcpy(allP[getnum(tmpstr[0])][getnum(tmpstr[1])][getnum(tmpstr[2])][getnum(tmpstr[3])][getnum(tmpstr[4])][getnum(tmpstr[5])][getnum(tmpstr[6])][getnum(tmpstr[7])][getnum(tmpstr[8])][getnum(tmpstr[9])], str);
      26 
      27             }
      28         }
      29     }
      30     fclose(pf);
      31 }
    • 字符串转提取qq号的函数
       1 //字符串提取qq号
       2 char *convertQQ(char *str)
       3 {
       4     int length = strlen(str);//获取长度
       5     char *tmp = malloc(length + 1);
       6     strcpy(tmp, str);//拷贝,避免数据自动回收
       7     //获取第一个'-'的位置
       8     char *p = strchr(tmp, '-');
       9     if (p!=NULL)
      10     {
      11         *p = '';
      12 
      13     }
      14     int count = strlen(tmp);//获取QQ长度 
      15     //如果长度小于10,则在前面置零,转换成十位,最后一位/0也写入,所以要从下标10开始,一共11位
      16     if (count< 10)
      17     {
      18         for (int i = 10; i >= 0; i--, count--)
      19         {
      20             if (count>=0)//移动
      21             {
      22                 tmp[i] = tmp[count];
      23             }
      24             else
      25             {
      26                 //填充0
      27                 tmp[i] = '0';
      28             }
      29         }
      30     }
      31     return tmp;
      32 }
    • 判断是不是全是数字
       1 //判断是不是全是数字
       2 int isallnum(char *str)//判断是否有非法字符
       3 {
       4     while (*str)
       5     {
       6         if (*str<'0' || *str>'9')
       7         {
       8             return 0;
       9         }
      10 
      11         str++;
      12     }
      13     return 1;
      14 
      15 }
    • 获取对应数字
      1 //获取对应的数字
      2 int getnum(char ch)
      3 {
      4     return ch - '0';//0 1
      5 }
    • 分配内存  深度表示前面还有几颗星 如果还有一颗星则进行内存分配,刚开始前面有十一颗星
       1 //分配内存  深度表示前面还有几颗星 如果还有一颗星则进行内存分配,刚开始前面有十一颗星
       2 void assignmem(char **pp,int deep,char *str)
       3 {
       4     //如果前面有一颗星
       5     if (deep==1)
       6     {
       7         //分配内存 获取qq号最后一位的数字
       8         pp[ getnum(*(str + 10 - deep))] = malloc(sizeof(char) * 50);
       9         //内存清零
      10         memset(pp[getnum(*(str + 10 - deep))], 0, sizeof(char) * 50);
      11         return;
      12     }
      13     
      14     //如果前边有十一颗星
      15     if (deep==11)
      16     {
      17         if (allP)
      18         {
      19             assignmem(*pp, deep - 1, str);//递归调用
      20             return;
      21         }
      22         else
      23         {
      24             //allP指向十个十级指针
      25             allP = malloc(sizeof(char**********) * 10);//分配指针数组
      26             memset(allP, '', sizeof(char*) * 10);//清零
      27             assignmem(*pp, deep - 1, str);//递归调用
      28             return;
      29         }
      30     }
      31 
      32     //如果已经分配内存
      33     if (pp[getnum(*(str + 10 - deep))])  
      34     {
      35         //递归调用
      36         assignmem(pp[getnum(*(str + 10 - deep))], deep - 1, str);
      37     }
      38     //否则分配内存
      39     else
      40     {
      41         pp[getnum(*(str + 10 - deep))] = malloc(sizeof(char*) * 10);
      42         memset(pp[getnum(*(str + 10 - deep))], 0, sizeof(char*) * 10);
      43         assignmem(pp[getnum(*(str + 10 - deep))], deep - 1, str);//递归调用
      44     }
      45 }
    • 查询
       1 //查询
       2 void search(char *str)
       3 {
       4     //判断是不是数字
       5     if (isallnum(str)==0)
       6     {
       7         return;
       8     }
       9     //如果查询的长度大于10
      10     if (strlen(str)>10)
      11     {
      12         return;
      13     }
      14 
      15     //格式化成10位
      16     char *tmp = malloc(11);
      17     int count = strlen(str);
      18     if (count<=10)
      19     {
      20         for (int i = 10; i>=0; i--,count--)
      21         {
      22             if (count>=0)
      23             {
      24                 tmp[i] = str[count];
      25             }
      26             else
      27             {
      28                 tmp[i] = '0';
      29             }
      30         }
      31     }
      32     else
      33     {
      34         printf("NO NO");
      35         return;
      36     }
      37     
      38     //依次判断内存是否存在
      39     if (allP[getnum(tmp[0])])
      40     {
      41 
      42         if (allP[getnum(tmp[0])][getnum(tmp[1])])
      43         {
      44 
      45             if (allP[getnum(tmp[0])][getnum(tmp[1])][getnum(tmp[2])])
      46             {
      47 
      48                 if (allP[getnum(tmp[0])][getnum(tmp[1])][getnum(tmp[2])][getnum(tmp[3])])
      49                 {
      50 
      51                     if (allP[getnum(tmp[0])][getnum(tmp[1])][getnum(tmp[2])][getnum(tmp[3])][getnum(tmp[4])])
      52                     {
      53 
      54 
      55                         if (allP[getnum(tmp[0])][getnum(tmp[1])][getnum(tmp[2])][getnum(tmp[3])][getnum(tmp[4])][getnum(tmp[5])])
      56                         {
      57                             if (allP[getnum(tmp[0])][getnum(tmp[1])][getnum(tmp[2])][getnum(tmp[3])][getnum(tmp[4])][getnum(tmp[5])][getnum(tmp[6])])
      58                             {
      59                                 if (allP[getnum(tmp[0])][getnum(tmp[1])][getnum(tmp[2])][getnum(tmp[3])][getnum(tmp[4])][getnum(tmp[5])][getnum(tmp[6])][getnum(tmp[7])])
      60                                 {
      61 
      62                                     if (allP[getnum(tmp[0])][getnum(tmp[1])][getnum(tmp[2])][getnum(tmp[3])][getnum(tmp[4])][getnum(tmp[5])][getnum(tmp[6])][getnum(tmp[7])][getnum(tmp[8])])
      63                                     {
      64                                         if (allP[getnum(tmp[0])][getnum(tmp[1])][getnum(tmp[2])][getnum(tmp[3])][getnum(tmp[4])][getnum(tmp[5])][getnum(tmp[6])][getnum(tmp[7])][getnum(tmp[8])][getnum(tmp[9])])
      65                                         {
      66 
      67                                             printf("%s
      ", allP[getnum(tmp[0])][getnum(tmp[1])][getnum(tmp[2])][getnum(tmp[3])][getnum(tmp[4])][getnum(tmp[5])][getnum(tmp[6])][getnum(tmp[7])][getnum(tmp[8])][getnum(tmp[9])]);
      68                                             return;
      69 
      70                                         }
      71 
      72 
      73                                     }
      74 
      75                                 }
      76 
      77 
      78 
      79                             }
      80 
      81 
      82                         }
      83 
      84                     }
      85 
      86                 }
      87 
      88             }
      89 
      90         }
      91 
      92     }
      93 
      94     printf("没有找到");
      95 
      96 }
    • 删除
        1 //删除某个数据
        2 void deleteit(char *str)
        3 {
        4     if (isallnum(str) == 0)
        5     {
        6         return;
        7     }
        8     if (strlen(str)>10)
        9     {
       10         return;
       11 
       12     }
       13     char *tmp = malloc(11);
       14     int count = strlen(str);
       15     if (count <= 10)//0077025077
       16     {
       17         for (int i = 10; i >= 0; i--, count--)
       18         {
       19             if (count >= 0)
       20             {
       21                 tmp[i] = str[count];
       22             }
       23             else
       24             {
       25                 tmp[i] = '0';
       26             }
       27 
       28         }
       29 
       30     }
       31     else
       32     {
       33         printf("NO NO");
       34         return;
       35     }
       36     //0
       37     if (allP[getnum(tmp[0])])
       38     {
       39 
       40         if (allP[getnum(tmp[0])][getnum(tmp[1])])
       41         {
       42 
       43             if (allP[getnum(tmp[0])][getnum(tmp[1])][getnum(tmp[2])])
       44             {
       45 
       46                 if (allP[getnum(tmp[0])][getnum(tmp[1])][getnum(tmp[2])][getnum(tmp[3])])
       47                 {
       48 
       49                     if (allP[getnum(tmp[0])][getnum(tmp[1])][getnum(tmp[2])][getnum(tmp[3])][getnum(tmp[4])])
       50                     {
       51 
       52 
       53                         if (allP[getnum(tmp[0])][getnum(tmp[1])][getnum(tmp[2])][getnum(tmp[3])][getnum(tmp[4])][getnum(tmp[5])])
       54                         {
       55                             if (allP[getnum(tmp[0])][getnum(tmp[1])][getnum(tmp[2])][getnum(tmp[3])][getnum(tmp[4])][getnum(tmp[5])][getnum(tmp[6])])
       56                             {
       57                                 if (allP[getnum(tmp[0])][getnum(tmp[1])][getnum(tmp[2])][getnum(tmp[3])][getnum(tmp[4])][getnum(tmp[5])][getnum(tmp[6])][getnum(tmp[7])])
       58                                 {
       59 
       60                                     if (allP[getnum(tmp[0])][getnum(tmp[1])][getnum(tmp[2])][getnum(tmp[3])][getnum(tmp[4])][getnum(tmp[5])][getnum(tmp[6])][getnum(tmp[7])][getnum(tmp[8])])
       61                                     {
       62                                         if (allP[getnum(tmp[0])][getnum(tmp[1])][getnum(tmp[2])][getnum(tmp[3])][getnum(tmp[4])][getnum(tmp[5])][getnum(tmp[6])][getnum(tmp[7])][getnum(tmp[8])][getnum(tmp[9])])
       63                                         {
       64                                             free(allP[getnum(tmp[0])][getnum(tmp[1])][getnum(tmp[2])][getnum(tmp[3])][getnum(tmp[4])][getnum(tmp[5])][getnum(tmp[6])][getnum(tmp[7])][getnum(tmp[8])][getnum(tmp[9])]);
       65 
       66                                             allP[getnum(tmp[0])][getnum(tmp[1])][getnum(tmp[2])][getnum(tmp[3])][getnum(tmp[4])][getnum(tmp[5])][getnum(tmp[6])][getnum(tmp[7])][getnum(tmp[8])][getnum(tmp[9])] = NULL;
       67                                             return;
       68 
       69                                         }
       70 
       71 
       72                                     }
       73 
       74                                 }
       75 
       76 
       77 
       78                             }
       79 
       80 
       81                         }
       82 
       83                     }
       84 
       85                 }
       86 
       87             }
       88 
       89         }
       90 
       91     }
       92 
       93 
       94 
       95 
       96 
       97     printf("没有找到");
       98 
       99 
      100 }
    • 增加
        1 //插入某个数据
        2 void insert(char *str, char *pass)
        3 {
        4 
        5 
        6     if (isallnum(str) == 0)
        7     {
        8         return;
        9     }
       10     if (strlen(str)>10)
       11     {
       12         return;
       13 
       14     }
       15     char *tmp = malloc(11);
       16     int count = strlen(str);
       17     if (count <= 10)//0077025077
       18     {
       19         for (int i = 10; i >= 0; i--, count--)
       20         {
       21             if (count >= 0)
       22             {
       23                 tmp[i] = str[count];
       24             }
       25             else
       26             {
       27                 tmp[i] = '0';
       28             }
       29 
       30         }
       31 
       32     }
       33     else
       34     {
       35         printf("NO NO");
       36         return;
       37     }
       38     //0
       39     if (allP[getnum(tmp[0])])
       40     {
       41 
       42         if (allP[getnum(tmp[0])][getnum(tmp[1])])
       43         {
       44 
       45             if (allP[getnum(tmp[0])][getnum(tmp[1])][getnum(tmp[2])])
       46             {
       47 
       48                 if (allP[getnum(tmp[0])][getnum(tmp[1])][getnum(tmp[2])][getnum(tmp[3])])
       49                 {
       50 
       51                     if (allP[getnum(tmp[0])][getnum(tmp[1])][getnum(tmp[2])][getnum(tmp[3])][getnum(tmp[4])])
       52                     {
       53 
       54 
       55                         if (allP[getnum(tmp[0])][getnum(tmp[1])][getnum(tmp[2])][getnum(tmp[3])][getnum(tmp[4])][getnum(tmp[5])])
       56                         {
       57                             if (allP[getnum(tmp[0])][getnum(tmp[1])][getnum(tmp[2])][getnum(tmp[3])][getnum(tmp[4])][getnum(tmp[5])][getnum(tmp[6])])
       58                             {
       59                                 if (allP[getnum(tmp[0])][getnum(tmp[1])][getnum(tmp[2])][getnum(tmp[3])][getnum(tmp[4])][getnum(tmp[5])][getnum(tmp[6])][getnum(tmp[7])])
       60                                 {
       61 
       62                                     if (allP[getnum(tmp[0])][getnum(tmp[1])][getnum(tmp[2])][getnum(tmp[3])][getnum(tmp[4])][getnum(tmp[5])][getnum(tmp[6])][getnum(tmp[7])][getnum(tmp[8])])
       63                                     {
       64                                         if (allP[getnum(tmp[0])][getnum(tmp[1])][getnum(tmp[2])][getnum(tmp[3])][getnum(tmp[4])][getnum(tmp[5])][getnum(tmp[6])][getnum(tmp[7])][getnum(tmp[8])][getnum(tmp[9])])
       65                                         {
       66                                             printf("%s
      ", allP[getnum(tmp[0])][getnum(tmp[1])][getnum(tmp[2])][getnum(tmp[3])][getnum(tmp[4])][getnum(tmp[5])][getnum(tmp[6])][getnum(tmp[7])][getnum(tmp[8])][getnum(tmp[9])]);
       67                                             printf("已经存在");
       68                                             return;
       69                                         }
       70                                         else
       71                                         {
       72                                             int length = strlen(pass);
       73                                             allP[getnum(tmp[0])][getnum(tmp[1])][getnum(tmp[2])][getnum(tmp[3])][getnum(tmp[4])][getnum(tmp[5])][getnum(tmp[6])][getnum(tmp[7])][getnum(tmp[8])][getnum(tmp[9])] = calloc(length + 1, 1);
       74                                             strcpy(allP[getnum(tmp[0])][getnum(tmp[1])][getnum(tmp[2])][getnum(tmp[3])][getnum(tmp[4])][getnum(tmp[5])][getnum(tmp[6])][getnum(tmp[7])][getnum(tmp[8])][getnum(tmp[9])], pass);
       75 
       76                                             return;
       77                                         }
       78 
       79 
       80                                     }
       81 
       82                                 }
       83 
       84 
       85 
       86                             }
       87 
       88 
       89                         }
       90 
       91                     }
       92 
       93                 }
       94 
       95             }
       96 
       97         }
       98 
       99     }
      100 
      101     printf("没有找到");
      102 
      103 
      104 }
    • 修改
        1 //改变某个数据
        2 void changeit(char *str, char *newpass)
        3 {
        4 
        5 
        6 
        7     if (isallnum(str) == 0)
        8     {
        9         return;
       10     }
       11     if (strlen(str)>10)
       12     {
       13         return;
       14 
       15     }
       16     char *tmp = malloc(11);
       17     int count = strlen(str);
       18     if (count <= 10)//0077025077
       19     {
       20         for (int i = 10; i >= 0; i--, count--)
       21         {
       22             if (count >= 0)
       23             {
       24                 tmp[i] = str[count];
       25             }
       26             else
       27             {
       28                 tmp[i] = '0';
       29             }
       30 
       31         }
       32 
       33     }
       34     else
       35     {
       36         printf("NO NO");
       37         return;
       38     }
       39     //0
       40     if (allP[getnum(tmp[0])])
       41     {
       42 
       43         if (allP[getnum(tmp[0])][getnum(tmp[1])])
       44         {
       45 
       46             if (allP[getnum(tmp[0])][getnum(tmp[1])][getnum(tmp[2])])
       47             {
       48 
       49                 if (allP[getnum(tmp[0])][getnum(tmp[1])][getnum(tmp[2])][getnum(tmp[3])])
       50                 {
       51 
       52                     if (allP[getnum(tmp[0])][getnum(tmp[1])][getnum(tmp[2])][getnum(tmp[3])][getnum(tmp[4])])
       53                     {
       54 
       55 
       56                         if (allP[getnum(tmp[0])][getnum(tmp[1])][getnum(tmp[2])][getnum(tmp[3])][getnum(tmp[4])][getnum(tmp[5])])
       57                         {
       58                             if (allP[getnum(tmp[0])][getnum(tmp[1])][getnum(tmp[2])][getnum(tmp[3])][getnum(tmp[4])][getnum(tmp[5])][getnum(tmp[6])])
       59                             {
       60                                 if (allP[getnum(tmp[0])][getnum(tmp[1])][getnum(tmp[2])][getnum(tmp[3])][getnum(tmp[4])][getnum(tmp[5])][getnum(tmp[6])][getnum(tmp[7])])
       61                                 {
       62 
       63                                     if (allP[getnum(tmp[0])][getnum(tmp[1])][getnum(tmp[2])][getnum(tmp[3])][getnum(tmp[4])][getnum(tmp[5])][getnum(tmp[6])][getnum(tmp[7])][getnum(tmp[8])])
       64                                     {
       65                                         if (allP[getnum(tmp[0])][getnum(tmp[1])][getnum(tmp[2])][getnum(tmp[3])][getnum(tmp[4])][getnum(tmp[5])][getnum(tmp[6])][getnum(tmp[7])][getnum(tmp[8])][getnum(tmp[9])])
       66                                         {
       67                                         
       68                                             printf("已经存在");
       69                                             free(allP[getnum(tmp[0])][getnum(tmp[1])][getnum(tmp[2])][getnum(tmp[3])][getnum(tmp[4])][getnum(tmp[5])][getnum(tmp[6])][getnum(tmp[7])][getnum(tmp[8])][getnum(tmp[9])]);
       70                                             int length = strlen(newpass);
       71                                             allP[getnum(tmp[0])][getnum(tmp[1])][getnum(tmp[2])][getnum(tmp[3])][getnum(tmp[4])][getnum(tmp[5])][getnum(tmp[6])][getnum(tmp[7])][getnum(tmp[8])][getnum(tmp[9])] = calloc(length + 1, 1);
       72                                             strcpy(allP[getnum(tmp[0])][getnum(tmp[1])][getnum(tmp[2])][getnum(tmp[3])][getnum(tmp[4])][getnum(tmp[5])][getnum(tmp[6])][getnum(tmp[7])][getnum(tmp[8])][getnum(tmp[9])], newpass);
       73 
       74 
       75                                             return;
       76                                         }
       77                                         
       78 
       79 
       80                                     }
       81 
       82                                 }
       83 
       84 
       85 
       86                             }
       87 
       88 
       89                         }
       90 
       91                     }
       92 
       93                 }
       94 
       95             }
       96 
       97         }
       98 
       99     }
      100     printf("没有找到");
      101 }
    • 顺序写入文件
       1 //递归写入到文件
       2 void memtofile(char **p, int deep, FILE *pf)
       3 {
       4     if (p == NULL)
       5     {
       6         return;
       7     }
       8     //如果深度为1(前面还有一颗星)写入
       9     if (deep==1)
      10     {
      11         for (int  i = 0; i <10; i++)
      12         {
      13             if (p[i] != NULL)
      14             {
      15                 fputs(p[i], pf);//写入
      16             }
      17         }
      18 
      19         return;
      20     }
      21 
      22     for (int  i = 0; i <10; i++)
      23     {
      24         memtofile(p[i], deep - 1, pf);//递归写入
      25     }
      26 }
      27 
      28 
      29 //按qq号顺序写入
      30 void sorttofile()
      31 {
      32     FILE *pf = fopen(sortpath, "w");
      33     memtofile(allP, 10, pf);//写入
      34     fclose(pf);
      35 }
    • 测试
       1 init();
       2     printf("init over  sorttofile start");
       3     sorttofile();
       4     printf("
       sorttofile end");
       5     while (1)
       6     {
       7         int num;
       8         scanf("%d", &num);
       9         switch (num)
      10         {
      11         case 1:
      12         {
      13             char str[100] = { 0 };
      14             printf("请输入要查找的QQ", str);
      15             scanf("%s", str);
      16             search(str);
      17             puts("search  over");
      18             break;
      19         }
      20         case 2:
      21         {
      22             char str[100] = { 0 };
      23             printf("请输入要删除的QQ", str);
      24             scanf("%s", str);
      25             deleteit(str);
      26             puts("delete over");
      27             break;
      28         }
      29         case 3:
      30         {
      31             char str[100] = { 0 };
      32             printf("请输入要插入的QQ", str);
      33             scanf("%s", str);
      34 
      35             char str1[100] = { 0 };
      36             printf("请输入要插入的QQpass", str1);
      37             scanf("%s", str1);
      38 
      39             insert(str, str1);
      40             puts("insert  over");
      41             break;
      42         }
      43         case 4:
      44         {
      45             char str[100] = { 0 };
      46             printf("请输入要change的QQ", str);
      47             scanf("%s", str);
      48 
      49             char str1[100] = { 0 };
      50             printf("请输入要change的QQpass", str1);
      51             scanf("%s", str1);
      52 
      53             changeit(str, str1);
      54             puts("change  over");
      55             break;
      56         }
      57 
      58         default:
      59             break;
      60         }
      61         
      62     }
  • 相关阅读:
    Jmeter 02 JMeter体系结构
    从一个实例详解敏捷测试的最佳实践
    BI测试
    A/B测试与灰度发布
    性能测试之稳定性测试(可靠性测试)
    Jmeter 01
    浅谈<持续集成、持续交付、持续部署>(二)
    浅谈<持续集成、持续交付、持续部署>(一)
    Python总结
    Latex技巧:LaTex插图命令includegraphics参数详解
  • 原文地址:https://www.cnblogs.com/xiaochi/p/8440058.html
Copyright © 2020-2023  润新知