运行结果:
内存使用情况:
写入文件排序好的数据:
- 创建文件地址以及创建十一级指针
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 = '\0'; 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, '\0', 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\n", 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\n", 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("\n 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 }