读入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

相关文章

webm怎么转换成mp4?这几种方法超多人在用!

webm怎么转换成mp4?WebM作为一种新兴的视频编码格式,近年来逐渐进入大众视野,其背后承载着诸多优势,但同时也伴随着不容忽视的局限性,首要挑战在于其兼容性边界,尽管WebM已广泛适应于众多网站与软件平台,但在特定应用环境或老旧设备上,其兼容难题依旧凸显,为用户体验带来不便,再者,WebM格式的非普适性也体现在编辑流程上,由于它并非行业内的通用标准,编辑过程中可能会遭遇格式不兼容的障碍,导致操

多重背包转换成0-1背包

http://acm.hdu.edu.cn/showproblem.php?pid=2191 多重背包特点: 一种物品有C个(既不是固定的1个,也不是无数个) 优化的方法: 运用神奇的二进制,进行物品拆分,转化成01背包 物品拆分,把13个相同的物品分成4组(1,2,4,6) 用这4组可以组成任意一个1~13之间的数! 原理:一个数总可以用2^

Prompt - 将图片的表格转换成Markdown

Prompt - 将图片的表格转换成Markdown 0. 引言1. 提示词2. 原始版本 0. 引言 最近尝试将图片中的表格转换成Markdown格式,需要不断条件和优化提示词。记录一下调整好的提示词,以后在继续优化迭代。 1. 提示词 英文版本: You are an AI assistant tasked with extracting the content of

Python脚本:TXT文档行数统计

count = 0 #计数变量file_dirs = input('请输入您要统计的文件根路径:')filename = open(file_dirs,'r') #以只读方式打开文件file_contents = filename.read() #读取文档内容到file_contentsfor file_content in file_contents:

Level3 — PART 3 — 自然语言处理与文本分析

目录 自然语言处理概要 分词与词性标注 N-Gram 分词 分词及词性标注的难点 法则式分词法 全切分 FMM和BMM Bi-direction MM 优缺点 统计式分词法 N-Gram概率模型 HMM概率模型 词性标注(Part-of-Speech Tagging) HMM 文本挖掘概要 信息检索(Information Retrieval) 全文扫描 关键词

mysql中导入txt文件数据的操作指令

1 表tt的格式:    CREATE TABLE `tt` (   `ind` int NOT NULL auto_increment,   `name` char(100) default NULL,   PRIMARY KEY  (`ind`)  )   2 文件d.txt的内容示例:  1,a  2,b  3,c

超越IP-Adapter!阿里提出UniPortrait,可通过文本定制生成高保真的单人或多人图像。

阿里提出UniPortrait,能根据用户提供的文本描述,快速生成既忠实于原图又能灵活调整的个性化人像,用户甚至可以通过简单的句子来描述多个不同的人物,而不需要一一指定每个人的位置。这种设计大大简化了用户的操作,提升了个性化生成的效率和效果。 UniPortrait以统一的方式定制单 ID 和多 ID 图像,提供高保真身份保存、广泛的面部可编辑性、自由格式的文本描述,并且无需预先确定的布局。

将浮点型算式的中缀表达式转换成后缀表达式并算出式子结果

最近因为需要了解如何将在Win应用程序控制台输入的算式表达式转化成其后缀表达式的算法,所以在网上搜索了一下,看到许多人的程序都只是对应于运算数在0~9的范围内的整型运算式,所以自己就写了一个可以计算浮点型算式的程序,一下是运行时的截图: 式子中的a,b,c是可供用户自行输入的变量。 首先,我先对输入的运算符进行了简单的合法性判断,我的判断代 码如下: //函数的传入参

使用亚马逊Bedrock的Stable Diffusion XL模型实现文本到图像生成:探索AI的无限创意

引言 什么是Amazon Bedrock? Amazon Bedrock是亚马逊云服务(AWS)推出的一项旗舰服务,旨在推动生成式人工智能(AI)在各行业的广泛应用。它的核心功能是提供由顶尖AI公司(如AI21 Labs、Anthropic、Cohere、Meta、Mistral AI、Stability AI以及亚马逊自身)开发的多种基础模型(Foundation Models,简称FMs)。

css 处理文本不换行的方法

https://www.cnblogs.com/sensualgirl/p/3712332.html