#include<stdio.h>
#include<stdlib.h> //含清屏函数的头文件
#include<string.h>
#define MAXSIZE 20 //每个文件夹可以存MAXSIZE个文件或文件夹
typedef struct node //文件或文件夹结点
{
char name[20]; //文件或文件夹名字
struct node *parent; //指向上层文件夹
int b; //文件与文件夹的判定,1为文件夹,0为文件
struct node *next[MAXSIZE]; //指向下一个文件或文件夹
int num; //文件夹或文件数目
}FNode;
typedef struct sqst //路径存储用的栈
{
char route[10][20]; //该栈可以存10个文件或文件夹名字
int top;
}SeqStack;
//****************基本函数
void InitStack(SeqStack *&sq) //初始化栈
{
sq = (SeqStack *)malloc(sizeof(SeqStack));
sq->top = -1;
}
void Push(SeqStack *&sq,FNode *floder) //进栈
{
sq->top++;
strcpy(sq->route[sq->top],floder->name);
}
int StackEmpty(SeqStack *sq) //判断栈空
{
if(sq->top == -1)
return 1;
else
return 0;
}
//****************重要函数
int Attention() //注意
{
int m;
printf(" 本程序由王东,张墨竹,黄景共同完成。\n");
printf(" 该程序仿照windows数据管理器的树型结构,是一个小的文件和文件夹管理程序。\n");
printf(" 使用时需要注意以下几点:\n");
printf(" 1,屏幕最上方是文件或文件夹的所在路径。\n");
printf(" 2,文件夹的名字被[]扩上,文件的名字原样输出。\n");
printf(" 3,每个功能执行完后,请按照提示按下回车。\n");
printf(" 4,如果要取消按序删除操作,请输入0;要取消别的操作请在输名字时直接按回车!\n");
printf(" 确定并使用该程序请键入1,否则键入0。\n");
scanf("%d",&m);
if(m != 1)
m=0;
return m;
}
void PrintRoute(FNode *floder,FNode *root) //打印路径
{
SeqStack *sq;
FNode *f;
InitStack(sq);
f = floder;
for( ; f != root ; ) //存储路径
{
Push(sq,f);
f = f->parent;
}
f = floder;
printf("********************************************\n");
printf("当前文件夹的路径:root:");
for( ; !StackEmpty(sq) ; ) //打印路径
{
printf("\\%s",sq->route[sq->top]);
sq->top--;
}
printf("\n");
}
void PrintFiles(FNode *floder) //打印当前文件夹的内容
{
int i;
printf("********************************************\n");
if(floder->num == 0)
printf("该文件夹内容为空!\n");
else
printf("该文件夹包含的文件及文件夹如下:\n");
for(i=0 ; i != floder->num ; i++)
{
printf("%d\t",i+1);
if(floder->next[i]->b ==1) //判断是否为文件夹
printf("[");
printf("%s",floder->next[i]->name);
if(floder->next[i]->b ==1)
printf("]");
printf("\n");
}
}
void OpenFloder(FNode *&floder) //打开文件夹
{
int i=0,j=0;
char ch,name[20];
while(i<floder->num) //遍历该文件夹的内容
{
if(floder->next[i]->b) //给文件夹计数
{
j++;
}
i++;
}
if(j == 0)
{
printf("该文件夹内不含文件夹,不能执行打开操作!");
getchar();
return;
}
i=0;
printf("请输入要打开的文件夹:");
while((ch = getchar()) != '\n')
name[i++] = ch;
name[i] = '\0';
if(i == 0)return ;
i=0;
while(strcmp(name,floder->next[i]->name)) //在文件夹中比较
{
i++;
if(i=j) //文件夹比较完了
{
printf("没找到要打开的文件夹!");
getchar();
return;
}
}
floder = floder->next[i]; //更换文件夹地址
}
void BackUp(FNode *&floder,FNode *root) //返回上一层
{
if(floder == root) //判断文件夹是否为最上层
{
printf("该文件夹为最上层文件夹,不能再返回上一层了!\n");
getchar();
}
else
floder = floder->parent; //更换文件夹地址
}
void AddFloder(FNode *&floder) //添加文件夹
{
FNode *f;
int i=0;
char ch;
if(floder->num == MAXSIZE) //判断文件夹容量是否为满
{
printf("该文件夹容量为满,不能再添加文件夹了!\n");
getchar();
}
else
{
f = (FNode *)malloc(sizeof(FNode));
f->b = 1;
f->num = 0;
printf("请输入文件夹名字:");
while((ch = getchar()) != '\n')
f->name[i++] = ch;
f->name[i] = '\0';
if(i == 0)return;
if(floder->num != 0) //文件夹中有文件或文件夹
{
i = 0;
while(floder->next[i]->b) //计数文件夹
{
if(strcmp(f->name,floder->next[i]->name) == 0) //遍历下一层,确定不重名
{
printf("有文件夹与新文件夹重名,创建失败!");
getchar();
return ;
}
i++;
if(i = floder->num)break;
}
for(i = floder->num ; floder->next[i-1]->b == 0 ; i--) //文件后移一位
floder->next[i] = floder->next[i-1];
while(strcmp(f->name,floder->next[i-1]->name) < 0) //比新文件夹名字大的后裔一位
{
floder->next[i] = floder->next[i-1];
i--;
if(i == 0)break;
}
floder->next[i] = f; //增加文件夹
}
else //文件夹内不含文件或文件
floder->next[floder->num] = f;
f->parent = floder;
floder->num++;
printf("增加文件夹成功!\n");
getchar();
}
}
void AddFile(FNode *&floder) //添加文件
{
FNode *f;
int i=0;
char ch;
if(floder->num == MAXSIZE) //判断文件夹容量是否为满
{
printf("该文件夹容量为满,不能再添加文件夹了!\n");
getchar();
}
else //添加文件
{
f = (FNode *)malloc(sizeof(FNode));
f->b = 0;
printf("请输入文件名字:");
while((ch = getchar()) != '\n')
f->name[i++] = ch;
f->name[i] = '\0';
if(i == 0)return;
f->parent = floder;
if(floder->num != 0)
{
for(i = 0 ; i < floder->num ; i++) //找到第一个文件的位置
if(floder->next[i]->b == 0)break;
while(i < floder->num) //遍历下一层,确定不重名
{
if(strcmp(f->name,floder->next[i]->name) == 0)
{
printf("有文件夹与新文件夹重名,创建失败!");
getchar();
return ;
}
i++;
}
while(strcmp(f->name,floder->next[i-1]->name) < 0) //比新文件的名字大的文件后移一位
{
if(floder->next[i-1]->b == 1)break;
floder->next[i] = floder->next[i-1];
i--;
if(i == 0) break; //文件比较完了
}
floder->next[i] = f; //添加文件
}
else
floder->next[floder->num] = f; //添加文件
floder->num++;
printf("增加文件成功!");
getchar();
}
}
void DelNum(FNode *&floder) //按序号删除文件夹或文件
{
int i;
if(floder->num == 0) //判断文件夹容量是否为满
{
printf("该文件夹容量为空,不能再进行删除操作了!\n");
getchar();
}
else
{
printf("请输入要删除的文件夹或文件的序号:");
scanf("%d%c",&i);
if(i == 0)return;
if(i > floder->num || i < 1) //判断序号的正确性
{
printf("输入的序号有误,操作无法进行!");
getchar();
}
else
{
if(floder->num != 1) //删除操作
for( ; i<floder->num ; i++)
floder->next[i-1] = floder->next[i];
floder->num--;
printf("删除操作成功!");
getchar();
}
}
}
void DelFloderName(FNode *&floder) //按名字删除文件夹
{
int i,j = 0;
char ch,name[20];
if(floder->num == 0) //判断文件夹容量是否为空
{
printf("该文件夹容量为空,不能再进行删除操作了!\n");
getchar();
}
else
{
printf("请输入要删除的文件夹的名字:");
while((ch = getchar()) != '\n')
name[j++] = ch;
name[j] = '\0';
if(j == 0)return;
for(i = 0 ; i < floder->num && floder->next[i]->b ; i++) //寻找要删除的文件夹
{
if(strcmp(name,floder->next[i]->name) == 0)break;
}
if(i == floder->num || floder->next[i]->b == 0) //没找到
{
printf("输入的名字有误,操作无法进行!");
getchar();
}
else
{
if(floder->num != 1) //删除操作
for(i++ ; i<floder->num ; i++)
floder->next[i-1] = floder->next[i];
floder->num--;
printf("删除操作成功!");
getchar();
}
}
}
void DelFileName(FNode *&floder) //按名字删除文件
{
int i,j = 0;
char ch,name[20];
if(floder->num == 0) //判断文件夹容量是否为空
{
printf("该文件夹容量为空,不能再进行删除操作了!\n");
getchar();
}
else
{
printf("请输入要删除的文件的名字:");
while((ch = getchar()) != '\n')
name[j++] = ch;
name[j] = '\0';
if(j == 0)return;
for(i = floder->num - 1 ; i > -1 && floder->next[i]->b == 0 ; i--) //寻找要删除的文件
{
if(strcmp(name,floder->next[i]->name) == 0)break;
}
if(i == -1 || floder->next[i]->b) //没找到
{
printf("输入的名
panda162
- 粉丝: 7
- 资源: 19
最新资源
- welearn刷时长版本v3.0.bat
- 前端分析-2023071100789-y5
- 前端分析-2023071100789
- 调查问卷系统源代码全套技术资料.zip
- 环境监测系统源代码全套技术资料.zip
- SDUT linux期末理论题题库+大题复习资料+7次实验报告
- 前端分析-2023071100789
- 前端分析-2023071100789
- 基于springboot的调查问卷管理系统源代码全套技术资料.zip
- MATLAB代码:计及碳排放交易及多种需求响应的微网 电厂日前优化调度 关键词:碳排放交易 需求响应 空调负荷 电动汽车 微网 电厂优化调度 参考文档:计及电动汽车和需求响应的多类电力市场下
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
- 1
- 2
前往页