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

相关文章

C#TextBox设置提示文本方式(SetHintText)

《C#TextBox设置提示文本方式(SetHintText)》:本文主要介绍C#TextBox设置提示文本方式(SetHintText),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录C#TextBox设置提示文本效果展示核心代码总结C#TextBox设置提示文本效果展示核心代

Python如何将大TXT文件分割成4KB小文件

《Python如何将大TXT文件分割成4KB小文件》处理大文本文件是程序员经常遇到的挑战,特别是当我们需要把一个几百MB甚至几个GB的TXT文件分割成小块时,下面我们来聊聊如何用Python自动完成这... 目录为什么需要分割TXT文件基础版:按行分割进阶版:精确控制文件大小完美解决方案:支持UTF-8编码

python dict转换成json格式的实现

《pythondict转换成json格式的实现》本文主要介绍了pythondict转换成json格式的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下... 一开始你变成字典格式data = [ { 'a' : 1, 'b' : 2, 'c编程' : 3,

使用Python实现文本转语音(TTS)并播放音频

《使用Python实现文本转语音(TTS)并播放音频》在开发涉及语音交互或需要语音提示的应用时,文本转语音(TTS)技术是一个非常实用的工具,下面我们来看看如何使用gTTS和playsound库将文本... 目录什么是 gTTS 和 playsound安装依赖库实现步骤 1. 导入库2. 定义文本和语言 3

Python实现常用文本内容提取

《Python实现常用文本内容提取》在日常工作和学习中,我们经常需要从PDF、Word文档中提取文本,本文将介绍如何使用Python编写一个文本内容提取工具,有需要的小伙伴可以参考下... 目录一、引言二、文本内容提取的原理三、文本内容提取的设计四、文本内容提取的实现五、完整代码示例一、引言在日常工作和学

Java实现将Markdown转换为纯文本

《Java实现将Markdown转换为纯文本》这篇文章主要为大家详细介绍了两种在Java中实现Markdown转纯文本的主流方法,文中的示例代码讲解详细,大家可以根据需求选择适合的方案... 目录方法一:使用正则表达式(轻量级方案)方法二:使用 Flexmark-Java 库(专业方案)1. 添加依赖(Ma

Python3脚本实现Excel与TXT的智能转换

《Python3脚本实现Excel与TXT的智能转换》在数据处理的日常工作中,我们经常需要将Excel中的结构化数据转换为其他格式,本文将使用Python3实现Excel与TXT的智能转换,需要的可以... 目录场景应用:为什么需要这种转换技术解析:代码实现详解核心代码展示改进点说明实战演练:从Excel到

Linux使用cut进行文本提取的操作方法

《Linux使用cut进行文本提取的操作方法》Linux中的cut命令是一个命令行实用程序,用于从文件或标准输入中提取文本行的部分,本文给大家介绍了Linux使用cut进行文本提取的操作方法,文中有详... 目录简介基础语法常用选项范围选择示例用法-f:字段选择-d:分隔符-c:字符选择-b:字节选择--c

C#使用DeepSeek API实现自然语言处理,文本分类和情感分析

《C#使用DeepSeekAPI实现自然语言处理,文本分类和情感分析》在C#中使用DeepSeekAPI可以实现多种功能,例如自然语言处理、文本分类、情感分析等,本文主要为大家介绍了具体实现步骤,... 目录准备工作文本生成文本分类问答系统代码生成翻译功能文本摘要文本校对图像描述生成总结在C#中使用Deep

通过C#获取PDF中指定文本或所有文本的字体信息

《通过C#获取PDF中指定文本或所有文本的字体信息》在设计和出版行业中,字体的选择和使用对最终作品的质量有着重要影响,然而,有时我们可能会遇到包含未知字体的PDF文件,这使得我们无法准确地复制或修改文... 目录引言C# 获取PDF中指定文本的字体信息C# 获取PDF文档中用到的所有字体信息引言在设计和出