数据结构 C语言 树形结构 简单目录管理系统

这篇具有很好参考价值的文章主要介绍了数据结构 C语言 树形结构 简单目录管理系统。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  1. 需求分析

在图书、操作系统文件夹、学生等管理系统中,目录管理是必要环节,如何高效搜寻与低复杂度存储是实现这一环节的关键性问题。本课程设计需完成一种基于多叉树结构简单目录管理系统,该系统能以交互式界面进行创建目录、删除目录、查找目录、修改目录、层次遍历目录、深度遍历目录及退出管理系统操作。

  1. 设计目的

(1)完成一种简单的目录管理系统,灵活运用自己所学的数据结构知识。

(2)系统的观点和软件开发一般规范进行软件开发,巩固、深化理论知识,提高编程水平,并在此过程中培养严谨的科学态度和良好的工作作风。

  1. 需求概述

完成一种简单的目录管理系统,进行高效搜寻与低复杂度存储,其具体功能需求如下:

  1. 交互性强:能够从终端进行人机交互。

  1. 创建目录:能够已一种高效的数据结构进行数据的存储。

  1. 删除目录:能够删除对应的目录信息。

  1. 查找目录:能够查找对应的目录信息,

  1. 修改目录:能够修改对应的目录信息。

  1. 层次遍历目录:能够层次遍历目录信息。

  1. 深度遍历目录:能够深度遍历目录信息。

  1. 退出管理系统:能够退出管理系统。

  1. 需求说明

完成一种简单的目录管理系统,进行高效搜寻与低复杂度存储。系统能够以交互式界面完成目录的查询、添加、修改、删除、排序等功能,主界面如下图1-1所示。

数据结构  C语言  树形结构 简单目录管理系统

图1-1 主界面

  1. 概要设计

本节以上述需求明确具体数据结构类型,数据存储方式及功能函数封装。由目录管理系统的特性分析可知,一个父级目录下可以有多个子级目录,多个子级目录并没有顺序关系。因此,本课程设计采取了多叉树的数据结构及进行存储数据,以层次遍历显示所有文件,以深度遍历找到根目录到叶子目录的最长文件路径。

  1. 数据类型的定义

  1. 定义多叉树的节点结构体,代码如下表2-1所示。

表2-1 多叉树的节点结构体源码


typedef struct node_t
{
    char*  name;               // 节点名
    int   n_children;         // 子节点个数
    int   level;              // 记录该节点在多叉树中的层数
    struct  node_t** children; // 指向其自身的子节点,children一个数组,该数组中的元素时node_t*指针
} NODE; // 对结构体重命名
  1. 实现一个栈,用于输出目录时,以子目录到根目录的顺序进行输出,代码如下表2-2所示。

表2-2 栈结构体源码


typedef struct stack_t
{
    NODE**  array; // array是个数组,其元素为NODE*型指针
    int    index; // 指示栈顶元素
    int    size;   // 栈的大小
} STACK; // 重命名
  1. 实现一个队列,用于层次遍历及深度遍历进行输出,代码如下表2-3所示。

表2-3 队列结构体源码


typedef struct queue_t
{
    NODE**  array; // array是个数组,其内部元素为NODE*型指针
    int    head;   // 队列的头
    int    tail;     // 队列的尾
    int    num;    // 队列中元素的个数
    int    size;   // 队列的大小
} QUEUE;
  1. 功能模块结构图

根据需求分析,为满足用户的功能需求,将系统设计为以下三大模块:

  1. 显示模块:交互式界面显示。

(2) 功能模块:实现目录的管理,如创建、删除、查找、修改、遍历等功能。

系统结构如 图 2-4所示:

数据结构  C语言  树形结构 简单目录管理系统

图2-4 系统结构图

  1. 功能模块

为了实现上述功能模块,分别在多叉树数据结构上定义了多个函数,本系统定义的函数和功能如下表2-5所示:

表2-5 函数与功能对应表

函数名称

功能说明

void* util_malloc(int size)

内存分配函数。

char* util_strdup(char* src)

字符串赋值函数。

FILE* util_fopen(char* name, char* access)

打开文件函数。

STACK* STACKinit(int size)

栈的初始化。

int STACKempty(STACK* sp)

判断栈是否为空。

int STACKpush(STACK* sp, NODE* data)

压栈操作。

int STACKpop(STACK* sp, NODE** data_ptr)

弹栈操作。

void STACKdestroy(STACK* sp)

栈的销毁。

QUEUE* QUEUEinit(int size)

队列初始化。

int QUEUEenqueue(QUEUE* qp, NODE* data)

入队操作。

int QUEUEdequeue(QUEUE* qp, NODE** data_ptr)

出队操作

int QUEUEempty(QUEUE* qp)

判断队列是否为空。

void QUEUEdestroy(QUEUE* qp)

队列的销毁。

NODE* create_node()

生成多叉树节点。

NODE* search_node_r(char name[M], NODE* head)

按照节点名字查找。

void read_file(NODE** head, char* filename)

从文件中读取多叉树,并建立多叉树。

void f1(NODE* head)

层次遍历。

void free_tree_r(NODE* head)

销毁树。

void f2(NODE* head, char* str, char** strBest, int level)

深度遍历。

void Welcome()

显示界面

void Create()

输入节点数据。

int main(int argc, char* argv[])

主界面。

  1. 详细设计

本节在概要设计的基础上,对每个模块内部逻辑处理部分进行详细设计。下面分别讲述核心模块具体实现方法及对应流程图。

  1. 主界面

本模块旨在以良好的交互式界面,提供给客户更好的操作体验。采取了while循环内部判断,根据按键判断以调用相应的处理函数,若未定义按键则需要进入等待直到按出指定按键才会进入下一次循环,具体代码如下表3-1所示。

表3-1 主界面源码


while(1){
                 system("cls");                                           // 清屏
                 Welcome();                                                        //  重新显示界面
                 int i, cho;
                 scanf("%d",  &i);
                 if(1 == i)  Create();
//              if(2 == i)  Delete();
//              if(3 == i)  Search();
//              if(4 == i)  Alter();
                 if(5 == i)  Traversal1();
                 if(6 == i)  Traversal2();
                 if(7 == i)  {
                                                  printf("\n欢迎您再次使用本系统\n\n");
                                                  break;
                                          } 
                 printf("\n返回请输入0\n");
                 begin:                                                                 //  goto 标志位
                         scanf("%d",  &cho);
                 if(0 == cho){
                         continue;
                 }
                 else{
                         printf("您的输入有误,请重新输入\n");
                         goto begin;                                                //  goto 到指定标志位 begin
                 }
        }
  1. 创建多叉树

本次设计通过外部文件与内部存储结合的方式构造了多叉树。需要在交互界面以父节点、子节点个数及子节点名称的顺序进行输入,输入后的数据存放在 data.txt文本中。通过调用data.txt文本数据来进行多叉树的构建,部 分源码如下表3-2所示,流程图如下图3-3所示。

表3-2 创建多叉树源码

数据结构  C语言  树形结构 简单目录管理系统

图3-3 创建多叉树流程图

  1. 查找多叉树

方式一:通过对文本操作,搜寻指定字符串是否存在。

方式二:遍历多叉树,判断字符名是否相同,具体代码如下表3-4所示。

表3-4查找多叉树源码


NODE*  search_node_r(char name[M], NODE* head)
{
    NODE* temp = NULL;
    int i = 0;
 
    if (head != NULL)
    {
        if (strcmp(name, head->name) == 0)  // 如果名字匹配
        {
            temp = head;
        }
        else // 如果不匹配,则查找其子节点
        {
            for (i = 0; i <  head->n_children && temp == NULL/*如果temp不为空,则结束查找*/; ++i)
            {
                temp = search_node_r(name,  head->children[i]); // 递归查找子节点
            }
        }
    }
 
    return temp; // 将查找到的节点指针返回,也有可能没有找到,此时temp为NULL
}
  1. 删除多叉树

通过对文本操作,搜寻指定字符串是否存在后,删除对应节点。

  1. 修改多叉树

通过对文本操作,搜寻指定字符串是否存在,修改对应节点名称。

  1. 层次遍历多叉树

通过队列对父节点进行存储,若不为空出队操作,让其子节点入队,递归实现。为了良好的用户体验,采取的栈的存储结构,以子节点先输出、父节点后输出的顺序进行显示,具体源码如下表3-5所示。

表3-5层次遍历多叉树源码


void  f1(NODE* head)
{
    NODE* p = NULL;
    QUEUE* q = NULL; // 定义一个队列
    STACK* s = NULL; // 定义一个栈
    int i = 0;
 
    q = QUEUEinit(100); // 将队列初始化大小为100
    s = STACKinit(100); // 将栈初始化大小为100
    
    head->level = 0; // 根节点的深度为0
    
    // 将根节点入队列
    QUEUEenqueue(q, head);
 
    // 对多叉树中的节点的深度值level进行赋值
    // 采用层次优先遍历方法,借助于队列
    while (QUEUEempty(q) == 0) // 如果队列q不为空
    {
        QUEUEdequeue(q, &p); // 出队列
        for (i = 0; i < p->n_children;  ++i)
        {
            p->children[i]->level =  p->level + 1; // 对子节点深度进行赋值:父节点深度加1
            QUEUEenqueue(q,  p->children[i]);      // 将子节点入队列
        }
        STACKpush(s, p); // 将p入栈
    }
 
    while (STACKempty(s) == 0) // 不为空
    {
        STACKpop(s, &p); // 弹栈
        fprintf(stdout, "第%d层 目录名为:%s\n",p->level, p->name);
    }
 
    QUEUEdestroy(q); // 消毁队列
    STACKdestroy(s); // 消毁栈
}
  1. 深度遍历多叉树

具体代码如下表3-6所示。

数据结构  C语言  树形结构 简单目录管理系统

表3-6 深度遍历多叉树源码


voidf2(NODE* head, char* str, char** strBest, int level)
{
    int  i = 0; 
    char* tmp = NULL;
    if (head == NULL){
        return;
    }
    tmp = (char*)util_malloc((strlen(str) +strlen(head->name) + 1/*原程序中未加1*/) * sizeof(char));
    sprintf(tmp, "%s  %s", str, head->name);
    if (head->n_children == 0){
        if (*strBest == NULL || strlen(tmp)> strlen(*strBest)){
            free(*strBest);
            *strBest = util_strdup(tmp);
        }
    }
    for (i = 0; i < head->n_children;++i){
        f2(head->children[i], tmp, strBest,level + 1);
    }
    free(tmp);
}
 

4运行结果

这里将展示部分功能的运行结果。

4.1 主界面

主界面如下图4-1所示。

数据结构  C语言  树形结构 简单目录管理系统

图4-1 主界面

4.2 主菜单界面

添加节点界面如下图4-2所示。

数据结构  C语言  树形结构 简单目录管理系统

图4-2 添加节点界面

4.3 层次遍历界面

层次遍历界面如下图4-3所示。

数据结构  C语言  树形结构 简单目录管理系统

图4-3 层次遍历界面

4.4 深度遍历界面

深度遍历界面如下图4-4所示。

数据结构  C语言  树形结构 简单目录管理系统

图4-4 深度遍历界面

代码内容

源码可私信摸鱼哥获取(点个关注私信即可)文章来源地址https://www.toymoban.com/news/detail-468433.html

到了这里,关于数据结构 C语言 树形结构 简单目录管理系统的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构课设—C语言实现通讯录管理系统(顺序表实现)

    这个项目是我大一时期数据结构的课程设计,在我潜心研究下出来的,对于当时的我来说算是非常满意啦,哈哈哈哈哈哈哈哈哈哈☆*: .。. o(≧▽≦)o .。.:*☆ 目录 一、引言 1.目的: 2.意义: 3.主要任务: 4.程序功能: 5.编译工具: 二、正文 1.系统模块: 2.算法流程图: 3.各

    2024年02月02日
    浏览(78)
  • 【C语言&&数据结构】简单题目

    ✨作者:@平凡的人1 ✨专栏:《小菜鸟爱刷题》 ✨一句话:凡是过往,皆为序章 ✨说明: 过去无可挽回, 未来可以改变 为了方便自己的学习以及基于好久没更新博客的原因。特地写了这一篇博客 。💖 本篇博客是一篇记录学习篇,我将之归纳于刷题专栏。方便自己的复习以

    2023年04月08日
    浏览(52)
  • 数据结构-栈(C语言简单实现)

    栈是一种数据结构 栈可以用来存放数字 一次只能向栈里加入一个数字,一次也只能从栈里获得一个数字 栈里到的数字有前后顺序,先进入到的数字在前,后进入的数字在后 每次从栈里获取的数字一定是最后面的数字,最后获取的数字一定是最前面的数字 这种取数字的方法

    2024年02月13日
    浏览(41)
  • 数据结构初阶(用C语言实现简单数据结构)--栈和队列

    ✨✨欢迎来到T_X_Parallel的博客!!       🛰️博客主页:T_X_Parallel       🛰️专栏 : 数据结构初阶       🛰️欢迎关注:👍点赞🙌收藏✍️留言 这小猫真好看 言归正传,通过上篇有关顺序表和链表的博客,可以了解到线性表的一些大致特征,这篇博

    2024年02月08日
    浏览(41)
  • 基于C语言的数据结构课程设计(学生管理系统、停车场管理、家谱管理、校园导航系统)

    一、设计目的 本课程设计是软件工程学生的必修课程,数据结构与算法课程设计既是一门基础课程,又是一门实践性课程。 通过本实训课程的学习和训练,使同学学会分析研究数据对象的特性,学会数据的组织方法,以便选择合适的数据逻辑结构和存储结构,以及相应的运

    2024年02月09日
    浏览(62)
  • 数据结构-队列(C语言的简单实现)

    队列也是一种数据结构,队列也可以用来存放数字 每次只能向队列里将入一个数字,每次只能从队列里获得一个数字 在队列中,允许插入的一段称为入队口,允许删除的一段称为出队口 它的原则是先进先出(FIFO: first in first out),先进入队列的数据先出去,后进入的后出去。

    2024年02月13日
    浏览(46)
  • 数据结构(9)树形结构——大顶堆、小顶堆

    目录 9.1.概述  9.2.操作 9.2.1.插入 9.2.2.删除 9.2.3.代码实现 概念: 根节点是自己所在子树中的 最值 的 完全二叉树。 根节点是所在子树的最大值,称为大顶堆。 根节点是所在子树的最小值,称为小顶堆。 堆的任何子树的根节点到子树上的任意节点,路径上的节点都是有序的

    2024年02月06日
    浏览(36)
  • 数据结构与算法:树形查找

    左子树结点值 根结点值 右子树结点值 对二叉排序树进行中序遍历,可以得到一个递增的有序数列 原理: 对于一个给定的二叉排序树,如果要查找一个节点,可以按照以下步骤进行: 从根节点开始比较。 如果要查找的值等于当前节点的值,则找到了目标节点,返回该节点。

    2024年02月06日
    浏览(44)
  • 【数据结构】树形结构所有路径复原为链表

    目录 1. 树形结构可视化 2. 树形结构转为链表 此目标是要还原树形结构的所有路径。树形结构是一种常见的数据结构,它表示元素之间层次关系。在树形结构中,每个节点可能拥有一个或多个子节点,形成了一个分层的结构。为了还原树形结构的路径,我们需要找到从根节点

    2024年02月06日
    浏览(38)
  • Java获取树形结构数据

    目录 前言: 开发前准备: 数据库: 实体类: VO对象: 代码实现: Controller层: Service层: 运行结果: 第二种 在日常的开发或者工作需求中,我们会用到树形结构数据。树形结构是一个比较常用的数据类型,一般多用于查询包含父子类关系的数据。我们常常通过父级id和层

    2024年02月12日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包