/**************************************************************************************
资源管理器
作者:李鑫磊
**************************************************************************************/
#include <stdio.h>
#include "CsTree.h"
#include "Queue.h"
#include "Stackchar.h"
#include <conio.h>
#include <stdlib.h>
/**************************************************************************************
函数声明*/
void CreatFile_(BiTree &x);
void CreatFile(BiTree &x);
void DispFile(BiTree x,int flag);
void DestroyFile(BiTree &x);
void InsertFile(BiTree &x,char F_name[],char I_name[]);
void FindFile_(BiTree x,char F_name[],BiTree &fNode,BiTree &Node);
void DeleteFile(BiTree &x,char D_name[]);
BiTree CreatLeaf(char name[]);
/**************************************************************************************/
/**************************************************************************************
功能:叶子节点
形式:BiTree CreatLeaf(char name[])
输入:无。
输出:无。
附注:返回指向节点指针。
****************************************************************************************/
BiTree CreatLeaf(char name[])
{
BiTree p;
p=new BiTNode;
strcpy(p->data,name);
p->child=NULL;
p->sibling=NULL;
return p;
}
/**************************************************************************************
功能:创建目录树。
形式:void CreatFile_(BiTree &x)
输入:以二元组(A,B)的形式输入。
输出:无。
附注:#为跟节点标志
输入形式:
#
root
root
file1
root
file2
root
file3
file2
dir1
file2
dir2
dir2
dir3
`
****************************************************************************************/
void CreatFile_(BiTree &x)
{
char fa[30],name[30];
BiTree p,head,r,fNode;
LinkQueue Q;InitQueueLink(Q);
while(1)
{
scanf("%s",fa);
if(strcmp(name,"`")==0)
break;
scanf("%s",name);
p=CreatLeaf(name);
if(strcmp(fa,"#")==0)
x=p;
else
{
FindFile_(x,fa,fNode,head);
if(!(head->child))
{
head->child=p;
r=p;
}
else
{
r->sibling=p;
r=p;
}
}
}
}
/**************************************************************************************
功能:创建目录树。
形式:void CreatFile(BiTree &x)
输入:树指针引用变量。
输出:无。
附注:输入时用“`”表示空节点。
输入形式:
root
file1
file1_1
`
`
file2
`
file3
file3_1
`
`
file4
`
`
`
***************************************************************************************/
void CreatFile(BiTree &x)
{
char str[40];
scanf("%s",str);
BiTree t;
if(strcmp(str,"`")==0)
x=NULL;
else
{
t=new BiTNode;
x=t;
strcpy(t->data,str);
CreatFile(t->child);
CreatFile(t->sibling);
}
}
/**************************************************************************************
功能:显示目录。
形式:void DispFile(BiTree x,int flag)
输入:无。
输出:层次目录。
附注:
***************************************************************************************/
void DispFile(BiTree x,int flag)
{
int i;
if(x)
{
for(i=1;i<=flag;i++)
{
if(i<flag)
printf("┃ ");
else
{
printf("┗━━━━");
}
}
printf("%s\n",x->data);
DispFile(x->child,flag+1);
DispFile(x->sibling,flag);
}
}
/**************************************************************************************
功能:销毁目录。
形式:void DestroyFile(BiTree &x)
输入:无。
输出:无。
附注:
***************************************************************************************/
void DestroyFile(BiTree &x)
{
if(x->child) DestroyFile(x->child);
if(x->sibling) DestroyFile(x->sibling);
if(x)
delete x;
x=NULL;
}
/**************************************************************************************
功能:显示文件在目录中的路径。
形式:int LineFile(BiTree x,char L_name[])
输入:文件名。
输出:文件路径。
附注:L_name为寻找的文件。
***************************************************************************************/
int LineFile(BiTree x,char L_name[])
{
stackLINK L;Initchar(L);
BiTree fNode,node;
FindFile_(x,L_name,fNode,node);
Pushchar(L,L_name);
while(strcmp(fNode->data,x->data)!=0)
{
strcpy(L_name,fNode->data);
FindFile_(x,L_name,fNode,node);
Pushchar(L,L_name);
}
Pushchar(L,x->data);
Visit(L);
return 1;
}
/**************************************************************************************
功能:插入文件。
形式:void InsertFile(BiTree &x,char F_name[],char I_name[])
输入:无。
输出:无。
附注:F_name为插入父节点,
I_name为需要插入的文件名
***************************************************************************************/
void InsertFile(BiTree &x,char F_name[],char I_name[])
{
BiTree Fnode,p,node;
FindFile_(x,F_name,node,Fnode);
if(Fnode)
{
p=new BiTNode;
strcpy(p->data,I_name);
p->sibling=Fnode->child;
Fnode->child=p;
p->child=NULL;
}
else
printf("父节点不存在!\n");
}
/**************************************************************************************
功能:删除文件。
形式:void DeleteFile(BiTree &x,char D_name[])
输入:无。
输出:无。
附注:D_name为删除的文件名。
***************************************************************************************/
void DeleteFile(BiTree &x,char D_name[])
{
BiTree f1=NULL,f2=NULL,fNode;
LinkQueue Q;InitQueueLink(Q);
FindFile_(x,D_name,f1,f2);
if(f2)
{
if(f1==NULL)
DestroyFile(x);
if(f1->child==f2)
{
f1->child=f2->sibling;
delete f2;
}
else
{
fNode=f1->child;
while(fNode)
{
if(strcmp(fNode->sibling->data,f2->data)==0)
{
fNode->sibling=f2->sibling;
delete f2;
return;
}
fNode=fNode->sibling;
}
}
}
else
printf("删除节点不存在!");
}
/**************************************************************************************
功能:查找文件的父节点。
形式:void FindFile(BiTree x, char F_name[],BiTree &fNode,BiTree &f1, BiTree &f2)
输入:无。
输出:无。
附注:F_name:为查找名称。
Node 为查找节点。
fNode为查找的父节点。
***************************************************************************************/
void FindFile_(BiTree x,char F_name[],BiTree &fNode,BiTree &Node)
{
BiTree x1,F_node;
LinkQueue Q;InitQueueLink(Q);
if(x)
EnQueueLink(Q,x);
else
{
printf("栈为空。");
return;
}
while(!EmptyQueueLink(Q))
{
DeQueueLink(Q,x1);
F_node=x1; //x1--------root
if(strcmp(F_name,x->data)==0)
{
Node=x;
fNode=NULL;
}
x1=x1->child;
while(x1)
{
if(strcmp(F_name,x1->data)==0)
{
fNode=F_node;
Node=x1;
return;
}
EnQueueLink(Q,x1);
x1=x1->sibling;
}
}
}
/*
void FindFile(BiTree x, char F_name[],BiTree &fNode,BiTree &f1, BiTree &f2)
{
if(x == NULL) return;
if(strcmp(x->data,F_name) == 0)
{ //找到则返回父节点指针和当前节点指针
f2 = x; //当前节点
f1 = fNode; //父节点
}
else
{
fNode = x; //暂存上一级节点指针
FindFile(x->child, F_name,fNode, f1, f2);
FindFile(x->sibling, F_name, fNode, f1, f2);
}
}
*/
/**************************************************************************************
菜单
***************************************************************************************/
void menu()
{
printf("*~~~~~~~~~~~~~~~~~~~~~↖(^ω^)↗~~~~~~~~~~~~~~~~~~~~~~~~~~~~*\n");
printf("* ~~~~~~~~~ 欢迎您使用我的软件 ~~~~~~~~~~~~ * 作者:=李=\n");
printf("* ~~~~~~~~ 请提出宝贵意见! ~~~~~~~~~~~~ * =鑫=\n");
printf("* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * =磊=\n");
printf("*下面请选择您要使用的功能: * 软件1001\n");
printf("* 1.创建 * 0.退出\n");
printf("* 2.插入