码迷,mamicode.com
首页 > 其他好文 > 详细

基础实验4-2.6 目录树 (30分)- 建树+先序遍历

时间:2020-03-29 21:15:37      阅读:54      评论:0      收藏:0      [点我收藏+]

标签:inf   字典   转化   比较   遍历   else   返回   main   先序   

技术图片

 技术图片

 解题思路:采用将多叉树转化为二叉树的方法(即利用孩子兄弟的结点结构)建立二叉树,最后再先序遍历输出即可

#include <stdio.h>
#include <malloc.h>
#include <string.h>
struct TNode {
    int space;//记录打印空格数
    int prior;//标记是文件还是目录,文件优先级0,目录优先级1(优先级大的优先)
    char name[261];//文件名
    struct TNode *son,*sib;//孩子、兄弟结点指针
};
int IsChar(char c) {//判断是否是英文字母
    if((c>=a&&c<=z)||(c>=A&&c<=Z))
        return 1;
    return 0;
}
int cmp(struct TNode *p,struct TNode *q) {//先按优先级比较优先级,优先级相等再按字典序比较
    if(p->prior>q->prior)
        return 1;
    if(p->prior==q->prior) {
        if(strcmp(p->name,q->name)<0)
            return 1;
        if(strcmp(p->name,q->name)==0)
            return -1;
    }
    return 0;
}
void Out(struct TNode *root) {//输出打印
    int i;
    if(root) {
        for(i=0; i<root->space; i++) {
            printf(" ");
        }
        printf("%s\n",root->name);
        Out(root->son);
        Out(root->sib);
    }

}
struct TNode *NewNode(struct TNode *root,char *name,int prior) {//新结点
    struct TNode *node;
    node=(struct TNode *)malloc(sizeof(struct TNode));
    strcpy(node->name,name);
    node->sib=node->son=NULL;
    node->prior=prior;
    node->space=root->space+2;
    return node;

}
struct TNode *Add(struct TNode *root,char *name,int prior) {//插入结点 
    struct TNode *p=root;
    struct TNode *node=NewNode(root,name,prior);
    if(p->son==NULL) {
        p->son=node;
        return p->son;
    } else {
        if(cmp(node,p->son)==1) {//前插 
            node->sib=p->son;
            p->son=node;
            return p->son;
        } else if(cmp(node,p->son)==-1) {//结点相同,返回结点位置即可 
            return p->son;
        } else {//同一层则往兄弟结点找 
            p=p->son;
            while(p->sib) {
                if(cmp(node,p->sib)==1) {//前插 
                    node->sib=p->sib;
                    p->sib=node;
                    return p->sib;
                } else if(cmp(node,p->sib)==-1) {//结点相同,返回结点位置即可 
                    return p->sib;
                }
                p=p->sib;
            }
            if(!p->sib) {//找到末尾插入即可 
                p->sib=node;
                return p->sib;
            }
        }
    }

}
int main() {
    struct TNode *root=(struct TNode *)malloc(sizeof(struct TNode));
    root->sib=root->son=NULL;
    root->space=0;
    root->prior=1;
    strcpy(root->name,"root");
    char input[261];
    int n;
    scanf("%d",&n);
    int i;
    for(i=0; i<n; i++) {
        scanf("%s",input);
        int j,k=0,prior=0;
        char name[261];
        struct TNode *p=root;
        for(j=0; input[j]!=\0; j++) {
            if(IsChar(input[j]))
                name[k++]=input[j];
            else if(input[j]==\\) {
                name[k]=\0;
                prior=1;
                p=Add(p,name,prior);
                k=0;
            }
        }
        if(input[j]==\0&&IsChar(input[j-1])) {
            name[k]=\0;
            prior=0;
            p=Add(p,name,prior);
        }

    }
    Out(root);
    return 0;
}

 

基础实验4-2.6 目录树 (30分)- 建树+先序遍历

标签:inf   字典   转化   比较   遍历   else   返回   main   先序   

原文地址:https://www.cnblogs.com/snzhong/p/12594646.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有 京ICP备13008772号-2
迷上了代码!