📄 main.c
字号:
#include <Stdio.h>
#include <Conio.h>
#include <stdlib.h>
#include <string.h>
struct usernode{ /*用户结点定义*/
int struction; /*1为管理员,0为普通用户*/
char name[20];
struct usernode *next;
}*head=NULL,*p,*w;
typedef struct usernode Usernode;
struct catalog{ /*文件目录结点定义*/
char name[20];
char creator[20];
int struction; /*当为目录时为1,当为文件时为0*/
struct catalog *parent,*leftchild,*rightsibling;
/*定义父亲结点、最左子树、右兄弟*/
}*root=NULL,*q;
typedef struct catalog Catalog;
void choose();
void creatcatalog();
void deletecatalog();
void opencatalog();
void creatfile();
void renamefile();
void checkfile();
void movefile();
void deletefile();
void login();
void land();
void deleteuser();
void returncatalog();
void print(Catalog *now);
/**********************************************************************************/
void creatcatalog() /*创建目录函数*/
{
int z,c=0,d=1;
char named[20];
Catalog *t,*newcatalog;
newcatalog=(Catalog*)malloc(sizeof(Catalog));
printf("\n当前的目录为%s,输入新建子目录名:",q->name);
scanf("%s",named);
if(q->leftchild!=NULL) /*如果当前目录的最左子树不为空*/
{
t=q->leftchild;
while(t!=NULL && d==1) /*查询是否存在相同命名的目录*/
{
d=0;
for(z=0;(z<=19 && named[z]!='\0') || (t->name[z]!='\0' && z<=19);z++)
if(named[z]!=t->name[z])
d=1;
if(d==1)
t=t->rightsibling;
}
if(t!=NULL && t->struction==1) /*存在相同命名时*/
{
printf("\n此目录已存在!");
c=1;
}
else
for(z=0;z<=19;z++) /*对新目录名赋值*/
newcatalog->name[z]=named[z];
}
if(c==0)
{
if(q->leftchild==NULL) /*当当前目录的最左子树为空时,直接赋值*/
{
q->leftchild=newcatalog;
for(z=0;z<=19;z++)
newcatalog->name[z]=named[z];
}
else
{ /*当最左子树不为空时*/
t=q->leftchild;
while(t->rightsibling!=NULL) /*将新建目录插入到当前目录的最右子树中*/
t=t->rightsibling;
t->rightsibling=newcatalog;
}
for(z=0;z<=19;z++)
newcatalog->creator[z]=p->name[z]; /*对新建目录的其它属性赋值*/
newcatalog->parent=q;
newcatalog->leftchild=NULL;
newcatalog->rightsibling=NULL;
newcatalog->struction=1;
print(q);
}
}
/**********************************************************************************/
void deletecatalog() /*删除目录函数*/
{
int z,b=0,d=1;
Catalog *k=q->leftchild,*l=q;
char named[20];
print(q);
if(q->leftchild==NULL) /*当最左子树为空*/
printf("\n没有可以删除的目录");
else
{
while(k!=NULL && k->struction==0) /*查询当最左子树不为空时,是否存在子目录*/
k=k->rightsibling;
if(k==NULL)
printf("\n没有可以删除的目录");
else
{ /*当存在子目录时*/
printf("\n输入要删除的目录名:");
scanf("%s",named);
while(k!=NULL && d==1) /*查询是否有匹配的子目录名*/
{
d=0;
for(z=0;(z<=19 && named[z]!='\0') || (k->name[z]!='\0' && z<=19);z++)
if(named[z]!=k->name[z])
d=1;
if(d==1)
{
l=k;
k=k->rightsibling;
}
}
if(k==NULL)
printf("\n不存在此目录!");
else
{ /*找到匹配子目录时*/
for(z=0;z<=19;z++)
{
if(k->creator[z]!=p->name[z]) /*查询此子目录的创建者是否为当前用户*/
b=1;
}
if(b==1) /*当当前用户不为创建者*/
printf("\n你不能删除此目录!");
else
{
if(l==q) /*删除目录*/
q->leftchild=k->rightsibling;
else
l->rightsibling=k->rightsibling;
printf("\n删除目录成功!");
print(q);
}
}
}
}
}
/**********************************************************************************/
void opencatalog() /*打开目录函数*/
{
int d=1,z;
Catalog *t;
char named[20];
t=q;
print(q);
if(q->leftchild==NULL) /*当最左子树为空*/
printf("没有可以打开的目录!");
else
{
q=q->leftchild;
while(q!=NULL && q->struction==0) /*查询当最左子树不为空时,是否存在子目录*/
q=q->rightsibling;
if(q==NULL) /*不存在子目录*/
{
printf("\n没有可以打开的目录!");
q=t;
}
else
{
printf("\n输入要打开的目录:");
scanf("%s",named);
while(q!=NULL && d==1) /*查询是否存在要打开的目录名*/
{
d=0;
for(z=0;(z<=19 && named[z]!='\0') || (q->name[z]!='\0' && z<=19);z++)
if(named[z]!=q->name[z])
d=1;
if(d==1)
q=q->rightsibling; /*当找到要打开的目录或者不存在此目录时停止循环*/
}
if(q==NULL)
{
printf("\n不存在此目录!");
q=t;
}
}
print(q); /*输出当前目录状态*/
}
}
/**********************************************************************************/
void creatfile() /*创建文件函数*/
{
int z,c=0,d=1;
char named[20];
Catalog *t,*newfile;
newfile=(Catalog*)malloc(sizeof(Catalog));
printf("\n当前的目录为%s,输入新建文件名:",q->name);
scanf("%s",named);
if(q->leftchild!=NULL) /*如果当前目录的最左子树不为空*/
{
t=q->leftchild;
while(t!=NULL && d==1) /*查询是否存在相同命名的文件*/
{
d=0;
for(z=0;(z<=19 && named[z]!='\0') || (t->name[z]!='\0' && z<=19);z++)
if(named[z]!=t->name[z])
d=1;
if(d==1)
t=t->rightsibling;
}
if(t!=NULL && t->struction==0) /*存在相同命名时*/
{
printf("\n此文件已存在!");
c=1;
}
else
for(z=0;z<=19;z++) /*对新文件名赋值*/
newfile->name[z]=named[z];
}
if(c==0)
{
if(q->leftchild==NULL) /*当当前目录的最左子树为空时,直接赋值*/
{
q->leftchild=newfile;
for(z=0;z<=19;z++)
newfile->name[z]=named[z];
}
else
{ /*当最左子树不为空时*/
t=q->leftchild;
while(t->rightsibling!=NULL) /*将新建文件插入到当前目录的最右子树中*/
t=t->rightsibling;
t->rightsibling=newfile;
}
for(z=0;z<=19;z++) /*对新建文件的其它属性赋值*/
newfile->creator[z]=p->name[z];
newfile->parent=q;
newfile->leftchild=NULL;
newfile->rightsibling=NULL;
newfile->struction=0;
print(q);
}
}
/**************************************************************************/
void renamefile() /*文件重命名函数*/
{
Catalog *k=q->leftchild,*t=q;
int z,d=1;
char named[20];
char namedn[20];
print(q);
if(q->leftchild==NULL) /*当最左子树为空*/
printf("\n没有可以重命名的文件");
else
{
while(k!=NULL && k->struction==1) /*查询当最左子树不为空时,是否存在文件*/
k=k->rightsibling;
if(k==NULL)
printf("\n没有可以重命名的文件");
else
{
printf("\n输入要重命名的文件名:");
scanf("%s",named);
while(k!=NULL && d==1) /*查询是否有符合命名的文件*/
{
d=0;
for(z=0;(z<=19 && named[z]!='\0') || (k->name[z]!='\0' && z<=19);z++)
if(named[z]!=k->name[z])
d=1;
if(d==1)
k=k->rightsibling;
}
if(k==NULL)
printf("\n不存在此文件!");
else
{
d=1;
for(z=0;z<=19;z++) /*查询当前用户是否为文件创建者*/
{
if(k->creator[z]!=p->name[z])
d=0;
}
if(d==0) /*如果不是文件创建者*/
printf("\n你没有权限重命名此文件!");
else
{
printf("\n输入新的文件名:");
scanf("%s",namedn);
k=q->leftchild;
d=1;
while(k!=NULL && d==1) /*查询新文件名是否已存在*/
{
d=0;
for(z=0;(z<=19&&namedn[z]!='\0')||(k->name[z]!='\0'&& z<=19);z++)
if(namedn[z]!=k->name[z])
d=1;
if(d==1)
k=k->rightsibling;
}
if(k!=NULL)
printf("\n已存在此文件名!");
else
{
k=q->leftchild;
while(k!=NULL && d==1) /*找到要重命名的文件*/
{
d=0;
for(z=0;(z<=19 && named[z]!='\0') || (k->name[z]!='\0' && z<=19);z++)
if(named[z]!=k->name[z])
d=1;
if(d==1)
{
t=k;
k=k->rightsibling;
}
}
if(t==q) /*重命名操作*/
q->leftchild=k->rightsibling;
else
t->rightsibling=k->rightsibling;
k=(Catalog*)malloc(sizeof(Catalog));
for(z=0;z<=19;z++)
k->name[z]=namedn[z];
if(q->leftchild==NULL)
q->leftchild=k;
else
{
t=q->leftchild;
while(t->rightsibling!=NULL)
t=t->rightsibling;
t->rightsibling=k;
}
for(z=0;z<=19;z++)
k->creator[z]=p->name[z];
k->parent=q;
k->leftchild=NULL;
k->rightsibling=NULL;
k->struction=0;
printf("\n操作成功!");
}
}
}
}
}
print(q);
}
/**********************************************************************************/
void checkfile() /*查看文件信息函数*/
{
Catalog *k=q->leftchild;
int z,d=1;
char named[20];
char namedn[20];
print(q);
if(q->leftchild==NULL) /*当最左子树为空*/
printf("\n没有可以查看的文件");
else
{
while(k!=NULL && k->struction==1)/*查询当最左子树不为空时,是否存在文件*/
k=k->rightsibling;
if(k==NULL)
printf("\n没有可以查看的文件");
else
{
printf("\n输入要查看的文件名:");
scanf("%s",named);
while(k!=NULL && d==1) /*查询是否有符合命名的文件*/
{
d=0;
for(z=0;(z<=19 && named[z]!='\0') || (k->name[z]!='\0' && z<=19);z++)
if(named[z]!=k->name[z])
d=1;
if(d==1)
k=k->rightsibling;
}
if(k==NULL)
printf("\n不存在此文件!");
else
printf("文件名:%s \n文件创建者:%s\n",k->name,k->creator);
}
}
}
/**********************************************************************************/
void movefile() /*移动文件函数*/
{
Catalog *k=q->leftchild,*t=q,*s,*b;
int z,e=0,d=1;
char named[20];
print(q);
if(q->leftchild==NULL) /*最左子树为空*/
printf("\n没有可以移动的文件");
else
{
while(k!=NULL && k->struction==1) /*当最左子树不为空时*/
k=k->rightsibling; /*当前目录是否存在文件*/
if(k==NULL)
printf("\n没有可以移动的文件");
else
{
k=q->leftchild;
printf("\n输入要移动的文件名:");
scanf("%s",named);
while(k!=NULL && d==1) /*查询是否存在此文件*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -