目录结构体的构思过程
1、确定单个目录的结构
参考Windows下的目录形式,一个目录有4部分进行链接:上级目录、下级目录、同级左目录、同级右目录。因此一个目录的基本链表形式应该如下图:
这上下左右四个节点,并不是一定要有链接值。如果没有链接,在代码中的体现就是指针指向NULL。
2、确定多级目录的结构
有了单个目录的形式,就可以将他们串起来,形成一个多级目录。这里采用的方法是:将上级目录只链接一个下级目录,结构如下:
3、确定需要做的功能
模仿Linux相关指令,本文将实现如下几种功能:
mkdir | 创建目录 |
rmdir | 删除目录 |
ls | 列出子目录 |
pwd | 显示当前目录 |
cd | 查找指定目录、跳转到指定目录 |
目录功能的C语言实现
1、创建目录(增)
目录是一个链表,因此所要首先声明一个目录的结构体。
struct dir {
char name[128]; /* 目录的名字 */
struct dir *up_next; /* 链接上级目录 */
struct dir *down_next; /* 链接下级目录 */
struct dir *left_next; /* 链接同级左级目录 */
struct dir *right_next; /* 链接同级右级目录 */
};
创建目录分为两步:
- 使用malloc给结构体分配一个空间,并对参数进行初始化(指针都指向NULL)
- 对目录进行链接、名称有效性判断
1.1 编写开辟空间函数
开辟空间步骤就两步:
- malloc开辟空间,并检查是否开辟成功,如果malloc失败会返回NULL
- 初始化成员列表,数组使用memset清零,指针全部指向NULL
具体的代码实现如下:
/* 创建1:malloc开辟空间 */
struct dir* Dir_Create_NewLink(void){
struct dir * newlink = NULL;
//开辟空间,开辟失败返回NULL
newlink = (struct dir *)malloc(sizeof(struct dir));
if(newlink == NULL){
printf("malloc failed\n");
return NULL;
}
//初始化
memset(newlink->name,'\0',128);
newlink->up_next = NULL;
newlink->down_next = NULL;
newlink->left_next = NULL;
newlink->right_next = NULL;
return newlink;
}
1.2 编写目录创建函数
目录创建也需要两步:
- 对结构体的上下左右指针进行链接。
- 对名称进行有效性判断,并赋值给结构体的name数组中
具体代码如下:
注意:该代码的名称判断有效性中的重名检测函数并未编写,重名检测所用到的函数将在后面编写
/* 创建2:链接目录、对目录进行命名 */
void Dir_Create_NewDir(struct dir* now_dir,struct dir* new_dir,struct dir* root_dir,char* file_name){
struct dir* pointTem;
struct dir* point = now_dir;
char new_name[128];/* 用于暂存目录名字 */
char* point_name = NULL;
/* 传入参数有效性判断 */
if(now_dir == NULL){
printf("now_dir is NULL\n");
return;
}
if(new_dir == NULL){
printf("new_dir is NULL\n");
return;
}
if(root_dir == NULL){
printf("root_dir is NULL\n");
return;
}
if(file_name == NULL){
printf("file_name is NULL\n");
return;
}
//1.链接
//例如当前为根 \ ,则创建的目录为 \abc
//1.1上级链接,新节点为当前节点的子目录
new_dir->up_next = now_dir;//上级目录是当前位置
//1.2下 指NULL,新建的目录没有子目录
new_dir->down_next = NULL;
//1.3将新目录插入到上级目录链接中:
//1.3.1 当前目录没有子目录,则这作为第一个子目录,即子目录的头
//point指向的是new_dir
if(point->down_next == NULL){
point->down_next = new_dir;
}
//1.3.2如果有子目录,遍历目录链表,进行尾插
else{
point = point->down_next;//poi