写一个lstree

1,缘起

有的我们拿到一个文件,通常是我们不太清楚的文件,比如你拿到了一个朋友传给你的源代码,如果你可以一眼看出这个源代码的目录结构那该有多好啊。

我以前的做法是:

$ls –R

但是这样看不出目录结构的层级,我们是否可以自己写一个类似pstree的工具来完成这个任务?

当然可以,比如我们想看GNU coreutils源代码目录结构:

~/repo/coreutils$ lstree  | grep '/$'
m4/
gl/
    m4/
    lib/
    modules/
    tests/
po/
doc/
man/
lib/
src/
old/
    textutils/
    sh-utils/
    fileutils/
gnulib/
tests/
    mv/
    rm/
    chown/
    dd/
    split/
    id/
    tail-2/
    pr/
    chmod/
    df/
    ln/
    readlink/
    rmdir/
    cp/
    ls/
    misc/
    fmt/
    chgrp/
    mkdir/
    install/
    du/
    touch/
build-aux/
scripts/
    git-hooks/
gnulib-tests/

这样就可以清楚地知道GNU coreutils是怎么组织目录的。

2,源代码

jatsz/coreutils-ex

git clone git://github.com/jatsz/coreutils-ex.git

Have fun!

转载于:https://www.cnblogs.com/Jerry-Chou/archive/2012/06/04/2534619.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可持久化线段树是一种能够支持版本控制的数据结构,它能够在每一个修改操作之后生成一个新的版本,而不破坏原来的版本。下面是一个用C语言实现的可持久化线段树的简单示例代码。 ```c #include <stdio.h> #include <stdlib.h> #define MAX_N 100005 #define MAX_M 100005 typedef struct node { int l, r; int sum; int ls, rs; } node; int n, m; int a[MAX_N]; int root[MAX_N]; int cnt = 0; node tree[MAX_N * 40]; int build(int l, int r) { int p = ++cnt; tree[p].sum = 0; if (l == r) { return p; } int mid = (l + r) >> 1; tree[p].ls = build(l, mid); tree[p].rs = build(mid + 1, r); return p; } int update(int pre, int l, int r, int x) { int p = ++cnt; tree[p] = tree[pre]; tree[p].sum++; if (l == r) { return p; } int mid = (l + r) >> 1; if (x <= mid) { tree[p].ls = update(tree[pre].ls, l, mid, x); } else { tree[p].rs = update(tree[pre].rs, mid + 1, r, x); } return p; } int query(int u, int v, int l, int r, int k) { if (l == r) { return l; } int x = tree[tree[v].ls].sum - tree[tree[u].ls].sum; int mid = (l + r) >> 1; if (x >= k) { return query(tree[u].ls, tree[v].ls, l, mid, k); } else { return query(tree[u].rs, tree[v].rs, mid + 1, r, k - x); } } int main() { scanf("%d %d", &n, &m); for (int i = 1; i <= n; i++) { scanf("%d", &a[i]); } root[0] = build(1, n); for (int i = 1; i <= n; i++) { root[i] = update(root[i - 1], 1, n, a[i]); } for (int i = 1; i <= m; i++) { int l, r, k; scanf("%d %d %d", &l, &r, &k); printf("%d\n", query(root[l - 1], root[r], 1, n, k)); } return 0; } ``` 在这个例子中,我们实现了一个可持久化线段树,用来解决静态区间第K小问题。我们通过不断生成新版本来支持版本控制,每个节点维护了区间和以及左右儿子的指针。在插入新元素时,我们在新版本中复制原版本的信息,然后在相应的左子树或右子树中递归插入新元素。在查询第K小的时候,我们通过查询两个版本中左儿子的区间和之差来确定第K小的元素在左子树还是右子树中,然后递归查询即可。 需要注意的是,这个代码中使用了一个全局变量cnt来记录当前版本的数量,这里只是为了方便演示而使用,实际应用中应该采用更加合理的方式来管理版本数量。此外,这个代码中的区间和可以根据具体需求进行修改,例如最大值、最小值等等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值