C语言_链表实现目录

目录结构体的构思过程

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值