zoukankan      html  css  js  c++  java
  • 设计一个树型目录结构的文件系统,其根目录为 root,各分支可以是目录,也可以是文件,最后的叶子都是文件。

    设计一个树型目录结构的文件系统,其根目录为 root,各分支可以是目录,也可以是文件,最后的叶子都是文件。

    我实现的功能是提供父目录(兄弟目录),输入文件名,创建树型目录结构,文本文件不可以再有子目录。最终打印出每个创建的文件夹或文本文件的路径。

    代码:

    #include <cstdio>
    #include <cstdlib>
    #include <iostream>
    
    
    using namespace std;
    
    typedef struct node                //节点
    {
        char *data;                     //文件名
        int dir_file;                   //文件夹或者文本文件
        struct node *first_child,*next_sibling;
    } tree;                             //多叉树
    
    typedef struct                       //存放树节点的队列
    {
        tree * data;
        int pre;
    } Box;
    
    typedef struct
    {
        Box data[100];
        int front,rear;
    } Queue;
    
    Queue que;
    
    void height(tree *t)                     // 层序遍历
    {
        tree *p = t,*q;
        que.data[0].data = p;
        que.data[0].pre = -1;
        que.front = -1;
        que.rear = 0;
        if(p->first_child == NULL)
            return ;
        while(que.front != que.rear)
        {
            que.front++;
            q = que.data[que.front].data->first_child;
            while(q != NULL)
            {
                que.rear++;
                que.data[que.rear].data = q;
                que.data[que.rear].pre = que.front;
                q = q->next_sibling;
            }
        }
    }
    
    tree *insertTree(char *ch, tree *parent, tree *pre_sibling,int judge)     //插入节点
    {
        tree *child = (tree *)malloc(sizeof(tree));
        child->data = ch;
        child->dir_file = judge;
    
        if (parent != NULL)
        {
            parent->first_child = child;
        }
        if (pre_sibling != NULL)
        {
            pre_sibling->next_sibling = child;
        }
    
        child->first_child = NULL;
        child->next_sibling = NULL;
    
        return child;
    }
    
    tree *create()                 //创建头节点
    {
        tree *root = (tree *)malloc(sizeof(tree));
        root->data = "root";
        root->dir_file = 1;
        root->first_child = NULL;
        root->next_sibling = NULL;
        return root;
    }
    
    void insert(Queue q,int index,int tj)           //插入函数
    {
        char *name;
        name = new char [10];
        bool judge;
        if(q.data[index].data->dir_file == 0)   //文本文件
        {
            cout<<"the current file is "<<q.data[index].data->data<<endl;
            cout<<"input the name :";
            cin>>name;
            cout<<"input "0":";
            cin>>judge;
            tree *node = insertTree(name,NULL,q.data[index].data,judge);
        }
        else if(q.data[index].data->dir_file == 1 && tj == 1)    //要在同一目录下创建另一文件
        {
            cout<<"the current file is "<<q.data[index].data->data<<endl;
            cout<<"input the name :";
            cin>>name;
            cout<<"if it is folder, input "1",else input "0":";
            cin>>judge;
            tree *node = insertTree(name,NULL,q.data[index].data,judge);
        }
        else                                                   //在某一目录下创建文件
        {
            cout<<"the current folder is "<<q.data[index].data->data<<endl;
            cout<<"input the name :";
            cin>>name;
            cout<<"if it is folder, input "1",else input "0":";
            cin>>judge;
            tree *node = insertTree(name,q.data[index].data,NULL,judge);
        }
    
    }
    
    int main()
    {
        int mark = 0;
        int num = 1;
        int tj = 0;
        int temp[100];
        tree *root = create();
        height(root);
        while(mark != -1)
        {
            cout<<"now is No."<<num<<",input the number of file(must be existed):";
            cin>>num;
            cout<<"the same level(the first can't choose Yes) ? 1.Yes 2.No"<<endl;
            cin>>tj;
            if(tj == 1)
                tj = 1;
            else
                tj = 0;
            insert(que,num-1,tj);
            height(root);
            cout<<"Quit input -1 ,continue input 1 :";
            cin>>mark;
        }
        for(int i = 1; i<=que.rear; i++)      //打印路径
        {
            int k = que.data[i].pre;
            int j = 0;
            while(k != -1)
            {
                temp[j] = k;
                j++;
                k = que.data[k].pre;
            }
            while(j > 0)
            {
                j--;
                cout<<"/"<<que.data[temp[j]].data->data;
            }
            cout<<"/"<<que.data[i].data->data<<endl;
        }
    }

    运行实例:

     
  • 相关阅读:
    OpenJDK源码研究笔记(十二):JDBC中的元数据,数据库元数据(DatabaseMetaData),参数元数据(ParameterMetaData),结果集元数据(ResultSetMetaDa
    Java实现 LeetCode 257 二叉树的所有路径
    Java实现 LeetCode 257 二叉树的所有路径
    Java实现 LeetCode 257 二叉树的所有路径
    Java实现 LeetCode 242 有效的字母异位词
    Java实现 LeetCode 242 有效的字母异位词
    Java实现 LeetCode 242 有效的字母异位词
    Java实现 LeetCode 241 为运算表达式设计优先级
    Java实现 LeetCode 241 为运算表达式设计优先级
    Java实现 LeetCode 241 为运算表达式设计优先级
  • 原文地址:https://www.cnblogs.com/NikkiNikita/p/9450747.html
Copyright © 2011-2022 走看看