1、 数 据 结 构 课 程 设 计 说 明 书 学生姓名: 学 号: 学 院: 专 业: 题 目: 成绩 指导教师 年 月 日 1 设计目的(小标题黑体五号字) 设计一个计算机管理系统完成图书管理基本业务(数据可以存储在一个数据文件中,数据结构、具体数据自定)。 2. 设计内容和要求 具体功能有:1)每种书的登记内容包括书号、书名、著作者、出版单位、现存量和库存量;2)对书号建立索引表(线性表)以提高查找效率;3)采编入
2、库:新购一种书,确定书号后,登记到图书帐目表中,如果表中已有,则只将库存量增加;4)借阅:如果一种书的现存量大于0,则借出一本,登记借阅者的书证号和归还期限,改变现存量;5)归还:注销对借阅者的登记,改变该书的现存量。 3.本设计所采用的数据结构 所用数据结构:线性表、查找、排序 链表:用一组地址任意的存储单元存放线性表中的数据元素。 以元素(数据元素的映象) + 指针(指示后继元素存储位置) = 结点(表示数据元素 或 数据元素的映象) 以“结点的序列”表示线性表称作线性链表(单链表) 单链表是一种链式存取的结构,为找第 i 个数据元素必须先找到第 i-1 个数据元素。
3、因此,查找第 i 个数据元素的基本操作为:移动指针,比较 j 和 i。 (1)malloc(size) 在内存的动态存储区申请一个长度为size字节的连续空间。 (2)calloc(n,size) 在内存的动态存储区申请n个长度为size字节的连续空间,函数返回值为分配空间的首地址。若此函数未被成功执行,函数返回值为0。 (3)free(p) 释放由指针p所指向的存储单元,而存储单元的大小是最近一次调用malloc()或calloc()函数时所申请的存储空间。 运用了单链表的插入、删除、排序、修改等一些操作! 4. 功能模块详细设计 4.1 详细设计思想 (一) 基本思想:
4、 (二) 图书信息录入、图书信息的查询、图书信息的排序、图书信息的修改、图书信息的删除、图书的借阅、图书的归还、退出图书管理系统。 (三) 程序中的主要函数有: void main() //主函数 int CreateListR(LinkList *L) //尾插法建表 void LocateElem(LinkList *L) //查询 int Sort(LinkList *L) //递增有序排序(直接插入排序法) void Display(LinkList *L) //输出排序结果 ModifyList(LinkList
5、L) //修改
int ListDelete(LinkList *L) //删除
void Borrow(LinkList *L) //借阅
void Return(LinkList *L) //归还
图书信息的录入添加
图书信息的查询模块
图书信息的排序模块
图书信息的修改模块
图书信息的删除模块
图
书的
借阅模块
图书的归还模块
退出图书管理系统
图 书 管 理 系 统
主 程 序 模 块
4.2 核心代码
#include
6、
7、inkList *) malloc(sizeof(LinkList)); //创建头结点 L->next = NULL; } int CreateListR(LinkList *L) //尾插法建表 { int i, n; LinkList *s, *q, *p; p = L; while (p->next != NULL ) p = p->next; printf("请输入需要录入的图书信息的个数:n="); scanf("%d", &n); for (i = 1; i < n + 1; i++) { s = (LinkLis
8、t *) malloc(sizeof(LinkList)); printf("书号 书名 作者 出版社名称 存馆数量 定价\n"); scanf("%d%s%s%s%d%s", &s->data.num, s->data.name, s->data.author, s->data.press, &s->data.count, s->data.price); q = L->next; if (q == NULL ) { p->next = s; p = s; p->next = NULL; printf("录入成
9、功!\n"); continue; } while (q != NULL ) { if (strcmp(s->data.name, q->data.name) == 0) { printf("此图书已存在!"); printf("请重新输入:\n"); scanf("%d%s%s%s%d%s", &p->data.num, p->data.name, p->data.author, p->data.press, &p->data.count, p->data.price); } q = q->
10、next; } p->next = s; p = s; p->next = NULL; printf("录入成功!\n"); } return 0; } void LocateElem(LinkList *L) //查询 { LinkList *p = L->next; //p指向第一个数据结点 int c; int x = 0; char name1[10], author1[10], press1[10]; printf(" 1 按书名查询:\n"); printf(" 2
11、 按作者名查询:\n"); printf(" 3 按出版社名称:\n"); printf(" 4 返回\n"); printf(" 请选择1--4进行操作:\n"); scanf("%d", &c); if (c > 4 || c < 1) { printf("您的输入有误!\n"); scanf("%d", &c); } switch (c) { case 1: printf("请输入图书书名: \n"); scanf("%s", name1); while (p != NULL ) { if (strcmp(
12、name1, p->data.name) != 0) //查找图书书名 p = p->next; else { printf("书号 书名 作者 出版社名称 存馆数量 定价\n"); printf("%d\t%s\t%s\t%s\t%d\t%s", p->data.num, p->data.name, p->data.author, p->data.press, p->data.count, p->data.price); printf("\n"); p = p->next; x++;
13、 } } if (p == NULL && x == 0) printf("对不起,不存在此图书!\n"); break; case 2: printf("请输入图书作者:\n"); scanf("%s", author1); while (p != NULL ) { if (strcmp(author1, p->data.author) != 0) //查找图书作者 p = p->next; else { printf("书号 书名 作者 出版社名称 存馆数量 定价\n"); prin
14、tf("%d\t%s\t%s\t%s\t%d\t%s", p->data.num, p->data.name, p->data.author, p->data.press, p->data.count, p->data.price); printf("\n"); p = p->next; x++; } } if (p == NULL && x == 0) printf("对不起,不存在此图书!\n"); break; case 3: printf("请输入图书的出版社名称: \n");
15、scanf("%s", press1); while (p != NULL ) { if (strcmp(press1, p->data.press) != 0) //查找图书出版社名称 p = p->next; else { printf("书号 书名 作者 出版社名称 存馆数量 定价\n"); printf("%d %s %s %s %d %s", p->data.num, p->data.name, p->data.author, p->d
16、ata.press, p->data.count, p->data.price); printf("\n"); p = p->next; x++; } } if (p == NULL && x == 0) printf("对不起!不存在此图书\n"); break; case 4: break; } } int Sort(LinkList *L) //递增有序排序(直接插入排序法) { LinkList *p = L->next, *q, *r; //p指向第一个数据结点 if (p !=
17、NULL ) //若原单链表中有一个或以上的数据结点 { r = p->next; //r保存*p结点直接后继结点的指针 p->next = NULL; //构造只含一个数据结点的有序表 p = r; while (p != NULL ) { r = p->next; //r保存*p结点的直接后继结点的指针 q = L; while (q->next != NULL && q->next->data.num < p->data.num) q = q->
18、next; //在有序表中找插入*p的直接前驱结点*q的位置 p->next = q->next; //将*p插入到*q之后 q->next = p; p = r; //扫描原单链表余下的结点 } } return 0; } void Display(LinkList *L) //输出排序结果 { LinkList *p = L->next; while (p != NULL ) { printf("书号 书名 作者 出版社名称 存馆数量 定价\n"); printf("%d \t %s \
19、t %s\t %s\t%d\t %s", p->data.num, p->data.name, p->data.author, p->data.press, p->data.count, p->data.price); printf("\n"); p = p->next; } } int ModifyList(LinkList *L) //修改 { LinkList *p = L; char name1[10]; printf("请输入要修改的图书的书名:\n"); scanf("%s", name1); while (p !=
20、 NULL ) { if (strcmp(name1, p->data.name) == 0) //查找所要修改的书名 { printf("请输入修改后的信息!\n"); printf("书号 书名 作者 出版社名称 存馆数量 定价\n"); scanf("%d%s%s%s%d%s", &p->data.num, p->data.name, p->data.author, p->data.press, &p->data.count, p->data.price); printf("修改成功!\n"); ret
21、urn 0; } p = p->next; } printf("不存在此图书\n"); return 0; } int ListDelete(LinkList *L) //删除 { LinkList *p = L->next, *q = L; char name1[10]; if (p != NULL ) { printf("请输入要删除的书名:"); scanf("%s", name1); } while (p->next != NULL && strcmp(p->data.name, name1) != 0) { p
22、 = p->next; q = q->next; } if (p->next != NULL ) //如果p此时不是最后一个节点,说明此时已经找到书 { q->next = p->next; printf("删除成功!\n"); return 0; } if (p->next == NULL && strcmp(name1, p->data.name) != 0) //如果p此时为最后一个结点并且没有找到与之相符的书名 { printf("你输入的书名不存在,请核实后重新输入!\n"); } else { q->next
23、 NULL; printf("删除成功!\n"); } return 0; } void Borrow(LinkList *L) //借阅 { LinkList *p = L->next; char name1[10]; printf("请输入要借阅的图书的书名:\n"); scanf("%s", name1); while (p->next != NULL && strcmp(name1, p->data.name) != 0) p = p->next; if (p->next == NULL && strcmp(name1, p->
24、data.name) != 0) printf("此图书不存在!\n"); else if (p->data.count < 1) printf("此书已借完!\n"); else if (strcmp(name1, p->data.name) == 0) { printf("借书成功!\n"); p->data.count--; } } void Return(LinkList *L) //归还 { LinkList *p = L->next; char name1[10]; printf("输入归还书的书名: \n"); s
25、canf("%s", name1); while (p->next != NULL && strcmp(name1, p->data.name) != 0) p = p->next; if (p->next == NULL && strcmp(name1, p->data.name) != 0) printf("错误!此图书不存在!\n"); else if (strcmp(name1, p->data.name) == 0) { printf("该书归还成功!\n"); p->data.count++; } } void menu() {
26、 //菜单函数 printf("---------------------------------------------------------- \n"); printf(" 欢迎光临图书管理系统! \n"); printf("----------------------------------------------------------- \n"); printf("1.图书信息录入添加功能:\n"); printf("2.图书信息查询功能:\n"); printf("3.图书信息
27、排序功能:\n"); printf("4.图书的修改功能:\n"); printf("5.图书的删除功能:\n"); printf("6.图书借阅功能:\n"); printf("7.图书归还功能:\n"); printf("0.退出系统:\n"); printf("请选择你需要的操作:\n"); } int main() //主函数 { int s; LinkList *L; L = (LinkList *) malloc(sizeof(LinkList)); InitList(L); menu(); printf("请输入编号:
28、\n"); scanf("%d", &s); while (s != 0) { switch (s) { case 1: CreateListR(L); break; case 2: LocateElem(L); break; case 3: Sort(L); Display(L); break; case 4: ModifyList(L); break; case 5: ListDelete(L); break; case 6: Borro
29、w(L); break; case 7: Return(L); break; case 0: printf("谢谢使用\n"); break; } scanf("%d", &s); } return 0; } (此页附在说明书后,请在验收前填好) 班级:11060141 题目:图书馆管理系统 学号 姓名 设计模块 成绩 1106014106 王烨 资料收集 修改和删除 1106014122 张艳明 需求分析 任务书 查询和排序 1106014130 张攀 程序调试 主函数跟借还 THANKS !!! 致力为企业和个人提供合同协议,策划案计划书,学习课件等等 打造全网一站式需求 欢迎您的下载,资料仅供参考
©2010-2025 宁波自信网络信息技术有限公司 版权所有
客服电话:4009-655-100 投诉/维权电话:18658249818