读入dir.txt,把dir.txt中的文本转换成一棵树

2024-05-09 21:32

本文主要是介绍读入dir.txt,把dir.txt中的文本转换成一棵树,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近几天突然拿到这样的一道题:

读入dir.txt,把dir.txt中的文本转换成一棵树
dir.txt中文本格式类型如下(节点重名不用理会)

a.c.d.z
a.c.c
b.a
a.b.c.d
转换成如下格式的文本:
root
|---a
    |---b
        |---c
            |---d
    |---c
        |---d
            |---z 
        |---c
|---b

    |---a   


dir.txt部分内容如下:

122.226.240.233
219.134.240.203
222.184.9.242
122.226.240.235
121.14.133.169
218.94.149.114
60.250.109.87
60.190.77.98
85.105.19.200
61.157.77.11
61.157.217.31
118.112.185.71
121.12.250.201
222.83.210.45
182.99.127.29
59.37.163.156
115.236.98.109
china598.com.cn
bengalcat.com.cn
95991.com.cn
jk91.com.cn
idpt.com.cn
qtuan.com.cn
8888net.com.cn
pogie.com.cn
kqqc.com.cn
htcscribe.com.cn
77197.com.cn
masong.com.cn
lqjy.com.cn
yultuz.com.cn
sweetduck.com.cn
gard.com.cn
maxsuit.com.cn
bailele.com.cn
http.ting.baidu.com.song.1048129
http.ting.baidu.com.song.1050893
http.ting.baidu.com.song.928162
http.ting.baidu.com.song.1656779
http.ting.baidu.com.song.1159603
http.ting.baidu.com.song.1382480

是不是顿时觉得有那么一点点郁闷? 我就不绕弯子了把我摸索出来的东西分享出来,本人还是菜鸟,大师级别的看看就好,望勿取笑;大笑

对于这个问题我是这么想的,使用2个辅助空间,不好叙述,直接上表算了:

124.193.109.117 
77197.com.cn 
wanshangtongpass.com.cn 
lqjy.com.cn 
http.ting.baidu.com.song.1048129   

124193109117   0
wanshangtongpasscomcn    1
lqjycomcn    2
httptingbaiducomsong1048129 3

一个存放每行的字符串,一个存放每节字符串(没有的默认为0)且最后存放该行的位置编号;

把每节字符串转成整型数进行比较就能区分前后关系了,具体数据就是用ascii就可以了;

排完后,后边的编号就是标明该位置是在原来文本中的谁的位置了;

排序过程就需要用到稳定的排序算法,我就选择较为简单的插入排序了;

具体算法如下:先从倒数第2开始排序(非编号那列),然后倒数第3,直到到达最前位置;

演示如下:

222.127.106.  89   222.127.106.  89    222.184.    9.242    222.127.106. 89   122.226.240.233
122.226.240.235   219.134.240.203   222.127.106.  89    219.134.240.203  122.226.240.235
219.134.240.203  122.226.240.233    219.134.240.203    222.184.    9.242    219.134.240.203
222.184.     9.242  122.226.240.235   122.226.240.233    122.226.240.233   222.127.106.  89
122.226.240.233   222.184.    9.242   122.226.240.235    122.226.240.235   222.184.     9.242

这就是排序的整个过程;


算法解析

开始位置是这样

122.226.240.235

122.226.240.233

排序后的位置就是这样

122.226.240.233

122.226.240.235

因为当第一轮排序完后 233肯定在255前边了,由于是使用稳定的排序算法,所以在前序列相同的情况下233肯定不会再跑到235后边,除非是前序列不同才有可能;

这就是为什么要使用稳定排序算法的原因了;

前观后仰,整个程序的实现就必须分两阶段进行,第一阶段就是先把字符串排好序,第二阶段就是对排好序的字符串进行目录化处理;程序如下,对于不了解的函数自行找资料学习,而插入排序就是简单的变形而已;以上分析过程属于第一阶段部分,第二阶段就不分析了;


#include <stdio.h>
#include <stdlib.h>
#include <string.h> //先检测编译器处理 long long 型时是否是 8字节   当个目录长度最长为13 不区分大小写#define ROW         50       //定义辅助空间列大小 
#define ROW_1       7        //目录记录空间列大小 //输出空格      cnt:输出次数 
void InputBlank(FILE *fd, int cnt)
{while (cnt > 0) {fwrite("    ", 4, 1, fd);  //单位为4 cnt--;}
}//检测字符串是否相同  相同返回1     n:检测长度 
int CheckStr(char *c, char *record, int n)
{int i=0;while (i < n) {if (record[i] != c[i]) {return 0;    }i++;}return 1; 
}//插入排序    low:开始位置    high:终点位置  index:排序数组的某列 
void InsertSort(unsigned long long array[][ROW_1], int low, int high, int index)
{int i = 0;int j = 0;long long temp[1][ROW_1] = {0};int k = low + 1;for(i=low+1; i<high; i++) {  k = i;memcpy(&temp[0][0], &array[k][0], sizeof(array[0][0])*ROW_1);for(j = i-1;(j>=0) && (array[j][index] > temp[0][index]); j-- ) { memcpy(&array[j+1][0], &array[j][0], sizeof(array[0][0])*ROW_1);k = j;  //记录挪动的位置 }      memcpy(&array[k][0], &temp[0][0], sizeof(array[0][0])*ROW_1);}         
}#define    NUM_ADJUST    39       //数字调整 
#define    LET_ADJUST    32       //大写字母调整 
#define    BASE          87     //长且非纯数字的字符串转化为整型数
unsigned long long LongStrToIntSize(char *c)
{unsigned long long ret = 0;int i = strlen(c)-1;	unsigned long long j = 1;while (i >= 0) {if (c[i]>=48 && c[i]<=57) {  //判断是否为数字  数字加39使其ascii码能与小写字母相连 ret += ((unsigned int)c[i] + NUM_ADJUST - BASE) * j;  //调整后'0' = 87;} else if (c[i]>=65 && c[i]<=90) {    //判断是否为大写字母  ret += ((unsigned int)c[i] + LET_ADJUST - BASE) * j;   } else if (c[i]>=97 && c[i]<=122) {   //判断是否为小写字母 ret += ((unsigned int)c[i] - BASE) * j;} else {ret += ((unsigned int)c[i] + BASE) * j;   // '-'调整为45+39}i--;j *= 35;   //数据之间的倍数(级别)}                  //如果是0-9   X10就能分辨大小了  如果是0-0xf  就得X16  同理可得35("<span style="font-family: Arial, Helvetica, sans-serif;">数字加39使其ascii码能与小写字母相连"</span>)  return ret+1;   //确保不为0 
}/*主函数*/  
int main(void)
{FILE *fd_dir;FILE *fd_test;char line[ROW]={0};char *p_line=NULL;char record[1024][ROW]={0};unsigned long long re_ass[1024][ROW_1]={0};  //[0-5]记录前缀字符串转为整型大小  [6]记录行号char flags[] = "|---";  //目录符int record_len;int i, j, k;int len;unsigned long long record_last;//第一阶段 fd_dir  = fopen("dir.txt", "r");fd_test = fopen("temp.txt", "w");if( fd_dir < 0 ) {printf("Can't open dir.txt!\n");exit(1);		}if( fd_test < 0 ) {printf("Can't open temp.txt!\n");exit(1);		}i = 0;memset(record, 0, sizeof(record));memset(re_ass, 0, sizeof(re_ass));while (fgets(line, ROW, fd_dir) != NULL) {  //获取txt里一行的字符串memcpy(&record[i][0], line, strlen(line));     j = 0;line[strlen(line)-1] = '\0';   //把最后的换行符替换为结束符  	p_line=strtok(line, ".");while (p_line != NULL) {  //判断是否是一行结束re_ass[i][j++] = LongStrToIntSize(p_line);  p_line = strtok(NULL, ".");}re_ass[i][ROW_1-1] = i;i++;memset(line, 0, ROW);	}  record_len = i;	i = ROW - 2;while (i >= 0) {        //目录从右往左开始排序 InsertSort(re_ass, 0, record_len, i);   i--;}for (i=0; i<record_len; i++) {		j = re_ass[i][ROW_1-1];   //获取排序后相对位置的编号 fwrite(&record[j][0], strlen(&record[j][0]), 1, fd_test);  }fclose(fd_dir);fclose(fd_test);  //第二阶段fd_dir  = fopen("temp.txt", "r");fd_test = fopen("result.txt", "w");if( fd_dir < 0 ) {printf("Can't open temp.txt!\n");exit(1);		}if( fd_test < 0 ) {printf("Can't open result.txt!\n");exit(1);		}fwrite("root\n", 5, 1, fd_test);memset(record, 0, sizeof(record));while (fgets(line, ROW, fd_dir) != NULL) {  //获取txt里一行的字符串i = 0;j = 0;	line[strlen(line)-1] = '\0';   //把最后的换行符替换为结束符p_line=strtok(line, ".");while (p_line != NULL) {  //判断是否是一行结束len = strlen(p_line);		if (strlen(&record[j][0])==len && CheckStr(p_line, &record[j][0], len)==1) {  //判断字符串长度是否相同且与上次行的字符串比较i = i+len+1;  //InputBlank(fd_test, j);  //fwrite("\n", 1, 1, fd_test);p_line = strtok(NULL, ".");j++;continue;}  memset(&record[j][0], 0, sizeof(record)-j*ROW);   //清除记录InputBlank(fd_test, j);  fwrite(flags, sizeof(flags), 1, fd_test);		//写入目录符fwrite(p_line, len, 1, fd_test);fwrite("\n", 1, 1, fd_test);memcpy(&record[j][0], p_line, len);record[j][len] = '\0';i++;j++;p_line = strtok(NULL, ".");}memset(line, 0, ROW);	}fclose(fd_dir);fclose(fd_test);//remove("temp.txt");    printf("结果存放在result.txt文件中\n");system("PAUSE");return 0;
}

源代码和题目下载:http://download.csdn.net/detail/u010245383/8540633




这篇关于读入dir.txt,把dir.txt中的文本转换成一棵树的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/974552

相关文章

Java实现在Word文档中添加文本水印和图片水印的操作指南

《Java实现在Word文档中添加文本水印和图片水印的操作指南》在当今数字时代,文档的自动化处理与安全防护变得尤为重要,无论是为了保护版权、推广品牌,还是为了在文档中加入特定的标识,为Word文档添加... 目录引言Spire.Doc for Java:高效Word文档处理的利器代码实战:使用Java为Wo

Python文本相似度计算的方法大全

《Python文本相似度计算的方法大全》文本相似度是指两个文本在内容、结构或语义上的相近程度,通常用0到1之间的数值表示,0表示完全不同,1表示完全相同,本文将深入解析多种文本相似度计算方法,帮助您选... 目录前言什么是文本相似度?1. Levenshtein 距离(编辑距离)核心公式实现示例2. Jac

Python中高级文本模式匹配与查找技术指南

《Python中高级文本模式匹配与查找技术指南》文本处理是编程世界的永恒主题,而模式匹配则是文本处理的基石,本文将深度剖析PythonCookbook中的核心匹配技术,并结合实际工程案例展示其应用,希... 目录引言一、基础工具:字符串方法与序列匹配二、正则表达式:模式匹配的瑞士军刀2.1 re模块核心AP

Java实现TXT文件导入功能的详细步骤

《Java实现TXT文件导入功能的详细步骤》在实际开发中,很多应用场景需要将用户上传的TXT文件进行解析,并将文件中的数据导入到数据库或其他存储系统中,本文将演示如何用Java实现一个基本的TXT文件... 目录前言1. 项目需求分析2. 示例文件格式3. 实现步骤3.1. 准备数据库(假设使用 mysql

批量导入txt数据到的redis过程

《批量导入txt数据到的redis过程》用户通过将Redis命令逐行写入txt文件,利用管道模式运行客户端,成功执行批量删除以Product*匹配的Key操作,提高了数据清理效率... 目录批量导入txt数据到Redisjs把redis命令按一条 一行写到txt中管道命令运行redis客户端成功了批量删除k

C#监听txt文档获取新数据方式

《C#监听txt文档获取新数据方式》文章介绍通过监听txt文件获取最新数据,并实现开机自启动、禁用窗口关闭按钮、阻止Ctrl+C中断及防止程序退出等功能,代码整合于主函数中,供参考学习... 目录前言一、监听txt文档增加数据二、其他功能1. 设置开机自启动2. 禁止控制台窗口关闭按钮3. 阻止Ctrl +

Python中图片与PDF识别文本(OCR)的全面指南

《Python中图片与PDF识别文本(OCR)的全面指南》在数据爆炸时代,80%的企业数据以非结构化形式存在,其中PDF和图像是最主要的载体,本文将深入探索Python中OCR技术如何将这些数字纸张转... 目录一、OCR技术核心原理二、python图像识别四大工具库1. Pytesseract - 经典O

苹果macOS 26 Tahoe主题功能大升级:可定制图标/高亮文本/文件夹颜色

《苹果macOS26Tahoe主题功能大升级:可定制图标/高亮文本/文件夹颜色》在整体系统设计方面,macOS26采用了全新的玻璃质感视觉风格,应用于Dock栏、应用图标以及桌面小部件等多个界面... 科技媒体 MACRumors 昨日(6 月 13 日)发布博文,报道称在 macOS 26 Tahoe 中

Python中help()和dir()函数的使用

《Python中help()和dir()函数的使用》我们经常需要查看某个对象(如模块、类、函数等)的属性和方法,Python提供了两个内置函数help()和dir(),它们可以帮助我们快速了解代... 目录1. 引言2. help() 函数2.1 作用2.2 使用方法2.3 示例(1) 查看内置函数的帮助(

Python实现精准提取 PDF中的文本,表格与图片

《Python实现精准提取PDF中的文本,表格与图片》在实际的系统开发中,处理PDF文件不仅限于读取整页文本,还有提取文档中的表格数据,图片或特定区域的内容,下面我们来看看如何使用Python实... 目录安装 python 库提取 PDF 文本内容:获取整页文本与指定区域内容获取页面上的所有文本内容获取