7-12 树种统计(25 point(s))(BST)

7-12 树种统计(25 point(s))

随着卫星成像技术的应用,自然资源研究机构可以识别每一棵树的种类。请编写程序帮助研究人员统计每种树的数量,计算每种树占总数的百分比。

输入格式:

输入首先给出正整数N(105),随后N行,每行给出卫星观测到的一棵树的种类名称。种类名称由不超过30个英文字母和空格组成(大小写不区分)。

输出格式:

按字典序递增输出各种树的种类名称及其所占总数的百分比,其间以空格分隔,保留小数点后4位。

输入样例:

29
Red Alder
Ash
Aspen
Basswood
Ash
Beech
Yellow Birch
Ash
Cherry
Cottonwood
Ash
Cypress
Red Elm
Gum
Hackberry
White Oak
Hickory
Pecan
Hard Maple
White Oak
Soft Maple
Red Oak
Red Oak
White Oak
Poplan
Sassafras
Sycamore
Black Walnut
Willow

输出样例:

Ash 13.7931%
Aspen 3.4483%
Basswood 3.4483%
Beech 3.4483%
Black Walnut 3.4483%
Cherry 3.4483%
Cottonwood 3.4483%
Cypress 3.4483%
Gum 3.4483%
Hackberry 3.4483%
Hard Maple 3.4483%
Hickory 3.4483%
Pecan 3.4483%
Poplan 3.4483%
Red Alder 3.4483%
Red Elm 3.4483%
Red Oak 6.8966%
Sassafras 3.4483%
Soft Maple 3.4483%
Sycamore 3.4483%
White Oak 10.3448%
Willow 3.4483%
Yellow Birch 3.4483%

写一个二叉搜索树就可以了,然后中序遍历输出
code:
 
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
int n;
char name[100010][35];
struct TNode{//写一个二叉搜索树储存字符串
    int time;//记录相同字符串出现的次数
    char *name;//记录字符串
    struct TNode* Left;
    struct TNode* Right;//左右指针
};
typedef struct TNode* Tree;
Tree Insert(Tree BST, char s[]){//插入
    Tree q;
    if(BST==NULL){//如果为空,新建节点
        q = (Tree)malloc(sizeof(struct TNode));
        q->time = 1;//初始化
        q->name = s;
        q->Left = NULL;
        q->Right = NULL;
        return q;//返回
    }
    if(strcmp(BST->name,s)<0){//如果要插入的字符串大于当前字符串。插入到右子树
        BST->Right = Insert(BST->Right,s);
    }
    else if(strcmp(BST->name,s)>0){//如果小,插入左子树
        BST->Left = Insert(BST->Left,s);
    }
    else{
        BST->time++;//如果相等,当前节点次数++
    }
    return BST;//返回树的指针
}
void inorder(Tree BST){//中序遍历输出字符串同时计算出所占的百分比即可
    if(BST!=NULL){
        inorder(BST->Left);
        printf("%s %.4f%%\n",BST->name,(double)BST->time*1.0/(double)n*100);
        inorder(BST->Right);
    }
}
int main(){
    int i;
    scanf("%d",&n);
    Tree BST = NULL;
    getchar();
    for(i = 0; i < n; i++){
        gets(name[i]);
        BST = Insert(BST,name[i]);
    }
    inorder(BST);
    return 0;
}


可以使用 `tail` 命令结合输出重定向来提取文件 `BST.signed` 的最后 64 字节并保存到新文件 `bst_sig.bin` 中。具体命令如下: ```bash tail -c 64 BST.signed > bst_sig.bin ``` ### 解释: - `tail` 是用于查看文件末尾内容的命令。 - `-c 64` 表示从文件末尾开始提取 64 字节的数据[^1]。 - `BST.signed` 是源文件,从中提取数据。 - `>` 是输出重定向操作符,表示将命令的输出写入到指定的文件中。如果目标文件不存在,则会创建该文件;如果已存在,则会覆盖其内容。 执行上述命令后,系统会从 `BST.signed` 文件的末尾开始读取 64 字节的数据,并将其写入到新文件 `bst_sig.bin` 中。 如果你希望保留原始文件的内容并在目标文件中追加内容,而不是覆盖它,可以使用 `>>` 操作符: ```bash tail -c 64 BST.signed >> bst_sig.bin ``` 但在这个场景下,通常只需要提取一次数据并生成一个包含这 64 字节的新文件,因此使用 `>` 更为合适。 ### 使用 `dd` 命令替代方案 除了 `tail` 命令之外,还可以使用 `dd` 命令来实现更精确的字节级操作。以下是一个等效的命令示例: ```bash dd if=BST.signed of=bst_sig.bin bs=1 skip=$(($(stat -c "%s" BST.signed) - 64)) count=64 ``` #### 参数解释: - `if=BST.signed`:指定输入文件为 `BST.signed`。 - `of=bst_sig.bin`:指定输出文件为 `bst_sig.bin`。 - `bs=1`:设置每次读取的块大小为 1 字节。 - `skip=$(($(stat -c "%s" BST.signed) - 64))`:跳过文件中除最后 64 字节外的所有字节。`stat -c "%s" BST.signed` 获取文件总大小,然后减去 64 得到需要跳过的字节数。 - `count=64`:指定要复制的块数量为 64 字节[^1]。 这个方法适用于对字节偏移有更高精度要求的情况,尤其是在处理二进制文件时更为可靠。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值