数据结构实验:项目管理系统

项目管理系统的设计与实现

(哈希表实现存储)


一、项目背景

在一个大的项目中,会被分解成许多小项目,目前要对整体项目进行统计管理没有较好的工具,所以本项目的事实为了能够高效,简洁的管理大项目以及所分解的小项目。


二、项目概述

过输入被分解的最小项目,统一管理大项目的进度,简洁明了的显示项目信息,并实现项目的创建,查看,修改,删除,以及项目的存储与读取。

三、项目功能

1、创建项目:创建时需要输入项目名称、管理组号、组长姓名、项目日期、状态等2、查询项目:查询项目号对应的项目信息。
3、修改项目:修改项目号对应的项目中某一信息。
4、删除项目:删除项目信息。
5、保存信息:将所有子项目信息保存到本地存储(自动)
6、导入信息:将本地数据文件导入到程序中(自动)

四、项目流程图

代码如下(示例):

五、项目相关函数调用关系

在这里插入图片描述

六、函数概述

1、创建结点函数:

程序功能创建一个结构体结点
性能要求
限制条件程序内部使用
输入
输出创建成功返回结点地址,创建失败返回NULL
算法逻辑1.malloc分配结点空间
2.判断是否创建成功,成功返回结点地址,失败返回NULL
相关对象及接口调用LNode_Creat()函数。
备注

2、选项显示函数:

程序功能在屏幕打印选项信息
性能要求
限制条件程序内部使用
输入
输出显示各个选项以及选项功能。
算法逻辑printf输出打印信息
相关对象及接口调用Menu()函数。
备注

3、插入结点函数:

程序功能插入一个结构体结点
性能要求
限制条件操作人员使用
输入1.表的地址
2.插入的数据信息
输出插入成功返回OK,插入失败返回NULL
算法逻辑1.malloc分配结点空间,并判断是否创建成功,失败直接返回NULL
2.将数据信息赋值给分配空间
3.遍历至表尾,插入结点,返回OK
相关对象及接口调用LNode_Insert(Link pList, type_data Data)函数。
备注

4、查询结点函数:

程序功能查询结点信息
性能要求
限制条件操作人员使用
输入1.表的地址
2.项目的编号信息
输出查询结点存在,输出此结点所有信息并返回OK,结点不存在返回NULL
算法逻辑1.判断项目编号是否为-1
2.遍历整个链表进行查询,结点存在,输出此结点;编号信息为-1,输出所有结点信息,不存在,返回NULL。
相关对象及接口调用LNode_Index(Link pList, int ID)函数。
备注

5、删除结点函数:

程序功能删除一个结构体结点
性能要求
限制条件操作人员使用
输入1.表的地址
2.删除项目编号
3.删除保存的数据信息
输出删除成功返回OK,删除失败返回NULL
算法逻辑1.遍历查找结点
2.找到结点,将结点数据存入old_Data中并返回OK,找不到结点返回NULL
3.链表保护,释放结点
相关对象及接口调用LNode_Dele(Link pList, int ID, type_data *Data)函数。
备注

6、保存数据函数:

程序功能将链表数据保存到数据文件中
性能要求
限制条件操作人员使用
输入表的地址
输出成功保存返回OK,失败返回NULL
算法逻辑1.判断文件是否存在,存在打开,不存在新建文件并打开
2.遍历链表,将数据域保存到文件中
3.判断是否保存成功,成功返回OK,失败返回NULL
相关对象及接口调用Link_Save(Link pList)函数。
备注

7、导入数据函数:

程序功能将数据文件导入到链表中
性能要求
限制条件操作人员使用
输入表的地址
输出成功保存返回OK,失败返回NULL
算法逻辑1.判断文件是否存在,存在打开并读取,不存在返回NULL
2.读取一个typede_data大小数据,调用插入函数插入到表尾
3.判断是否导入成功,成功返回OK,失败返回NULL
相关对象及接口调用Link_Inport(Link pList)函数。
备注

8、结点数据输入函数:

程序功能输入数据保存到结构体结点中
性能要求
限制条件内部函数使用
输入结构体地址
输出成功输入返回OK,失败返回NULL
算法逻辑1.判断结构体地址是否存在
2.将结构体数据挨个输入其中
3.判断是否输入成功,成功返回OK,失败返回ERROR
相关对象及接口调用LNode_Data_Scanf(type_data *Data)函数。
备注

9、数据修改函数:

程序功能修改结构体中某一数据
性能要求
限制条件内部函数使用
输入1.结构体地址
2.修改位置
输出成功输入返回OK,失败返回NULL
算法逻辑1.判断结构体地址是否存在
2.判断修改位置是否正确,正确则输入数据
3.判断输入是否合法,合法将结构体位置修改为新值返回OK,非法返回ERROR
相关对象及接口调用LNode_Data_Modify(type_data *Data, char *name)函数。
备注

10、哈希函数:

程序功能计算哈希表存储位置
性能要求
限制条件内部函数使用
输入结点ID
输出返回计算后位置数值
算法逻辑对参数取余
相关对象及接口调用Hash_Func(int key)函数。
备注可以不用单独写此函数

11、哈希插入:

程序功能在哈希表中插入数据
性能要求
限制条件内部函数使用
输入1.哈希表地址
2.数据名称
3.插入数据ID
输出成功插入返回INSERT_DATA_SUCCESS,失败返回INSERT_DATA_FAILE
算法逻辑1.调用哈希函数计算插入位置
2.调用链表插入函数实现结点插入
相关对象及接口调用Hash_Insert(List Arr[], type_data Data, int ID)函数。
备注

12、哈希查询:

程序功能查询哈希表中指定ID数据
性能要求
限制条件内部函数使用
输入1 哈希表地址
2 查询数据ID
3 数据存储地址
输出查询成功返回ID_FIND_SUCCESS,失败返回ID_FIND_NO
算法逻辑1调用哈希函数计算查询位置
2调用链表查询函数实现结点查询
相关对象及接口调用Hash_Index(List Arr[],int ID,type_data *Data)函数。
备注

13、哈希查询s:

程序功能查询哈希表中所有数据
性能要求
限制条件内部函数使用
输入哈希表地址
输出
算法逻辑1调用哈希函数计算查询位置
2循环调用链表查询函数实现结点查询
相关对象及接口调用Hash_Indexs(List Arr[])函数。
备注

14、哈希表修改函数:

程序功能修改哈希表中指定ID数据中指定数据
性能要求
限制条件内部函数使用
输入1 哈希表地址
2 查询数据ID
输出
算法逻辑1调用哈希函数计算查询位置
2 调用链表修改函数实现结点修改
相关对象及接口调用Hash_Modify(List Arr[],int ID)函数。
备注

七、完整程序代码


这篇文章主要讲述逻辑思维,所以代码可以自己尝试一下。
可以自行优化。

总结

数据结构实验包含:链表,哈希表,查找算法等的综合,是将理论转为实际的最有效方法。
切记:
1、定义变量一定要初始化!!!!
2、写完一个函数一定要验证一下是否有Bug!!!
3、更新一定要保存旧版!

  • 22
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
数据结构》实验题目 实验一 学生成绩管理(链表)  实验目的:熟练掌握单链表操作的基本算法实现。  实现功能:以带表头结点的单链表为存储结构,实现如下学生成绩管理的设计要求。  实验机时:6  设计要求: (1)定义学生成绩链表结点结构类型,以xscjList和*XscjLink命名,数据域:学号NO、姓名Name、手机号MTel、邮箱地址Email、籍贯 BornAddr、A分成绩AScore、B分成绩BScore,指针域:*next; (2)实现创建学生成绩链表函数void Build(XscjLink &T),输入学号、姓名、手机号、邮箱地址、籍贯、A分成绩、B分成绩,建议用文件操作来输入数据; (3)实现函数void Update(XscjLink T, char *Name, float *ScoreA),将姓名为Name的学生的A分成绩改为ScoreA; (4)实现输出学生成绩信息void OutPut(XscjLink T),输出所有学生的学号、姓名、手机号、邮箱地址、籍贯、A分成绩、B分成绩; (5) 实现函数void Insert(XscjLink T, char *Name, char *No),插入学号为NO,姓名为Name学生信息,将链表中学号≤NO的结点放到该结点的前面,将学号>NO的结点放到该结点后面; (6)实现函数void Sort(XscjLink T),将该学生按照B分成绩进行非递减排序; (7)实现函数void Merge(XscjLink &T1;, XscjLink &T2;),将两个按B分成绩非递减排序的学生成绩单合并为一个按B分成绩非递增排序的通讯录,B分成绩相同且学号相同的成绩记录在结果中只保留一个;要求算法的时间复杂度不超过两个链表的长度之和O(m+n); (8)实现函数int Count(XscjLink T);统计籍贯是“广州”的学生人数; (9)实现函数void MoveK(XscjLink T, int k),将学生成绩链表中倒数第k个结点之后的所有结点移到头结点后面(保持结点间的先后顺序),注意:严禁采用先计算链表长度n再减k(即n-k)的方法;要求算法的时间复杂度不超过个链表的长度O(n); (10)实现函数void ReverseN(XscjLink T),将学生成绩链表的正中间位置结点之后的全部结点倒置,注意:严禁采用先计算链表长度n再除以2(即n/2)的方法;要求算法的时间复杂度不超过个链表的长度O(n); (11)主控函数main()调用以上函数,分别输出(2)、(3)、(5)、(6)、(7)、(8)、(9)(10)处理后的链表内容、输出籍贯是“广州”的学生人数。 可能用到的函数: 从文件中读取学生成绩数据:fscanf(文件指针,"%s %s %s %s %s %f %f", p->NO, p->Name, p->Mtel, p->Email, p-> BornAddr, p->AScore, p->BScore); 输出学生成绩数据:printf("%s %s %s %s %s %f %f", p->NO, p->Name, p->Mtel, p->Email, , p-> BornAddr, p->AScore, p->BScore); 字符串赋值函数:char * strcpy(char *, const char *); 字符串比较函数:int strcmp(const char *, const char *) #include #include #include //定义学生成绩链表结点结构 typedef struct XscjNode { char NO[10]; //学号 char Name[16]; //姓名 char MTel[11]; //手机号 char EMail[16]; //邮箱地址 char BornAddr[20]; //籍贯(值域:"北京"、"上海"、"大连"等等,只写城市名称) float AScore; // A分成绩 float BScore; //B分成绩 struct XscjNode *next; //指针域 }XscjList, *XscjLink; 实验二 Huffman编码(二叉树)  实验目的:熟练掌握二叉树应用(Huffman编码)的基本算法实现。  实现功能:对输入的一串电文字符实现Huffman编码,再对Huffman编码生成的代码串进行译码,输出电文字符串。实现功能如下: • Huffman树的建立 • Huffman编码的生成 • 编码文件的译码  实验机时:10  设计思路: 数据结构: #define n 100 //叶子结点数 #define m 2*n-1 // Huffman树中结点总数 typedef struct { char data; 字符 int weight; //权值 int lchild , rchild , parent; //左右孩子及双亲指针 }HTNode; //树中结点类型 typedef HTNode HuffmanTree[m+1]; //0号单元不用 主要实现函数:  统计字符串中字符的种类以及各类字符的个数的函数  构造Huffman树的函数  Huffman编码的函数  建立正文的编码文件的函数  代码文件的译码函数  主函数 实验三 各种排序方法的比较  实验目的:熟练掌握内部排序算法的实现。  实现功能:编制一个演示内部排序算法比较的程序。要求通过编写程序实现起泡排序、直接插入排序、简单选择排序、快速排序、希尔排序、堆排序等常用的内部排序算法,并通过样本数据比较各个算法的时空特性  实验机时:4
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jsvdv

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值