资源描述
1 设计目标
《数据结构》课程关键介绍最常见数据结构,说明多种数据结构内在逻辑关系,讨论其在计算机中存放表示,和在其上进行多种运算时实现算法,并对算法效率进行简单分析和讨论。进行数据结构课程设计要达成以下目标:
n 了解并掌握数据结构和算法设计方法,含有初步独立分析和设计能力;
n 初步掌握软件开发过程问题分析、系统设计、程序编码、测试等基础方法和技能;
n 提升综合利用所学理论知识和方法独立分析和处理问题能力;
训练用系统见解和软件开发通常规范进行软件开发,培养软件工作者所应含有科学工作方法和作风。
2. 设计内容和要求
关键分为两大功效:
(1) 图书管理(增加图书、查询图书、删除图书、图书借阅、还书);
(2) 会员管理(增加会员、查询会员、删除会员、借书信息)。
设计要求:
(1) 符合课题要求,实现对应功效;
(2) 要求界面友好美观,操作方便易行;
(3) 注意程序实用性、安全性;
3.本设计所采取数据结构
采取两条单链表,其头结点分别为head、mhead全局变量来存放图书信息和会员信息。其定义数据结构以下:
/*图书信息结构体*/
typedef struct elem
{
char bookid[5];
char bookname[50];
char bookauthor[20];
char bookmark[2];
char memberid[4];
}elemtype;
/*图书链表结点结构体*/
typedef struct node
{
elemtype data;
struct node *next;
}lnode,*linknode;
/*会员信息结构体*/
typedef struct memberelem
{
char memberid[4];
char membername[20];
}memberelemtype;
/*会员链表结点结构体*/
typedef struct membernode
{
memberelemtype data;
struct membernode *next;
}mlnode,*mlinknode;
4.功效模块具体设计
图书借阅管理系统
图书管理模块
会员管理模块
增加图书
查询图书
删除图书
图书借阅
还书
增加会员
查询会员
借书信息
删除会员
4.1 具体设计思想
系统开启时,经过读取文件完成对以head、mhead为表头单链表完成初始化。初始化后系统进入系统菜单,其运行界面以下:
当选择功效1时,进入图书管理模块,其运行界面以下:
当选择功效2时,进入会员管理模块,其运行界面以下:
在图书管理界面中,当选择功效1时,查看全部图书,其运行界面图:
在会员管理界面中,当选择功效1时,查看全部会员,其运行界面图:
4.2各个实现函数
为了实现上述功效,特定义以下函数原型,具体代码参见源代码部分:
void main() /*入口*/
void initallinfo() /*初始化图书和会员链表*/
void welform() /*系统总菜单*/
void printbookinfo(linknode head) /*输出图书信息函数*/
void addbook() /*增加图书模块*/
void select() /*按编号查询图书*/
void delete() /*按编号删除图书*/
void borrow() /*借阅图书*/
void returnbook() /*还书*/
void bookmanagetitle() /*图书管理二级菜单*/
void bookmanage() /*二级图书管理功效选择函数*/
void printmemberinfo(mlinknode head) /*输出会员信息函数*/
void addmember() /*增加会员模块*/
void selectmember() /*按编号查询会员*/
void deletemember() /*按编号删除会员*/
void membermanagetitle() /*会员管理二级菜单*/
void membermanage() /*二级会员管理功效选择函数*/
4.4图书会员链表
程序调试数据如表:
图书初始数据表
bookid
bookname
bookauthor
bookmark
memberid
0001
sanguoyanyi
luoguanzhong
N
0
0002
hongloumeng
caoxueqin
N
0
0003
xiyouji
wuchengen
Y
001
0004
shuihuzhuan
shinaian
N
0
0005
javascript
Join
N
0
0006
cprogrom
tanghaoqiang
N
0
0007
liaozhaizhiyi
pusongling
Y
007
0008
jia
bajin
N
0
0009
richu
caoyu
Y
003
0010
nahan
luxun
N
0
会员信息表
memberid
membername
001
zhouxicai
002
longqidong
003
lipengfei
004
gaopeng
005
chenwentang
006
yangminghao
4.5 关键代码
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>
#define NULL 0
typedef struct elem
{
char bookid[5];
char bookname[50];
char bookauthor[20];
char bookmark[2];
char memberid[5];
}elemtype;
typedef struct node
{
elemtype data;
struct node *next;
}lnode,*linknode;
typedef struct memberelem
{
char memberid[5];
char membername[25];
}memberelemtype;
typedef struct membernode
{
memberelemtype data;
struct membernode *next;
}mlnode,*mlinknode;
linknode head;
mlinknode mhead;
FILE *bp,*bq;
void initallinfo()
{
FILE *bp,*bq;
linknode p,q;
mlinknode m,n;
head=(lnode*)malloc(sizeof(lnode));
head->next=NULL;
mhead=(mlnode*)malloc(sizeof(mlnode));
mhead->next=NULL;
bp=fopen("book.txt","rb");
printf("%s",feof(bp));
bq=fopen("member.txt","rb");
printf("%s",feof(bp));
if(bp==NULL)
{
printf("can not open bookbat!");
getchar();
getchar();
}
else
{
do
{
p=(lnode*)malloc(sizeof(lnode));
fread(p,sizeof(lnode),1,bp);
q=p->next;
p->next=head->next;
head->next=p;
}while(q!=NULL);
fclose(bp);
}
if(bq==NULL)
{
printf("can not open memberdat!");
getchar();
getchar();
}
else
{
do
{
m=(mlnode*)malloc(sizeof(mlnode));
fread(m,sizeof(mlnode),1,bq);
n=m->next;
m->next=mhead->next;
mhead->next=m;
}while(n!=NULL);
fclose(bq);
}
}
void mainmenu()
{
system("cls");
printf(" SYSTEM MAIN MENU \n");
printf("*********************************************\n");
printf("*1:book manage *\n");
printf("*-------------------------------------------*\n");
printf("*2:member manage *\n");
printf("*-------------------------------------------*\n");
printf("*0:quit *\n");
printf("*********************************************\n");
printf("\nPlease input order:\n");
}
void printbookinfo(linknode head)
{
linknode p=head->next;
system("cls");
printf("The book informations are:\n");
printf("%-7s%-20s%-15s%-6s%s\n","id","title","author","mark","borrower");
printf("*********************************************\n");
for(;p!=NULL;p=p->next)
printf("%-7s%-20s%-15s%-6s%s\n",p->data.bookid,p->data.bookname,p->data.bookauthor,p->data.bookmark,p->data.memberid);
printf("\nPlease anykey return.....");
getchar();
getchar();
}
void addbook()
{
linknode p=(lnode*)malloc(sizeof(lnode));
system("cls");
printf("Add books.....\n");
printf("%-7s%-20s%-15s%\n","id(5)","title","author");
printf("*********************************************\n");
scanf("%s%s%s",p->data.bookid,p->data.bookname,p->data.bookauthor);
p->data.bookmark[0]='N';
p->data.bookmark[1]='\0';
p->data.memberid[0]='0';
p->data.memberid[1]='\0';
p->next=head->next;
head->next=p;
printf("\nAdd success!\n");
printf("\nPress anykey return.....");
getchar();
getchar();
}
void select()
{
char id[5];
linknode p;
system("cls");
p=head->next;
printf("select book by id.....\n");
printf("Please input book id :\n");
scanf("%s",id);
while(p!=NULL)
{
if(strcmp(p->data.bookid,id)==0)
break;
else
p=p->next;
}
if(p==NULL)
printf("\nThe book not exit!\n");
else
{
printf("\n%-7s%-20s%-15s%-3s%s\n","id","title","author","borrowed","borrower");
printf("********************************************\n");
printf("\n%-7s%-20s%-15s%-3s%s\n",p->data.bookid,p->data.bookname,p->data.bookauthor,p->data.bookmark,p->data.memberid);
}
printf("\nPlease anykey return.....");
getchar();
getchar();
}
void deletebook()
{
char id[5];
linknode p,q;
system("cls");
p=head->next;
q=head;
printf("delete book by id......\n");
printf("Please input book id:\n");
scanf("%s",id);
while(p!=NULL)
{
if(strcmp(p->data.bookid,id)==0)
break;
else
{
q=p;
p=p->next;
}
}
if(p==NULL)
printf("\nThe book you want to delete are not exit!\n");
else
{
q->next=p->next;
free(p);
printf("\nDelete success!\n");
}
printf("\nPress anykey return.....");
getchar();
getchar();
}
void borrow()
{
char id[5];
char mid[5];
linknode p;
mlinknode q;
system("cls");
printf("borrow book.....\n");
do
{
p=head->next;
printf("Please input book id:\n");
scanf("%s",id);
while(p!=NULL)
{
if(strcmp(p->data.bookid,id)==0)
break;
else
p=p->next;
}
if(p==NULL)
{
printf("\nThe book doesn't exit!please input it again!\n");
}
}while(p!=NULL);
if(p!=NULL)
{
do
{
q=mhead->next;
printf("\nPlease input member id:\n");
scanf("%s",mid);
while(q!=NULL)
{
if(strcmp(q->data.memberid,mid)==0)
break;
else
q=q->next;
}
if(q==NULL)
{
printf("\nYou are not member!input again!\n");
}
}while(q==NULL);
if(q!=NULL&&(strcmp(p->data.bookmark,"Y"))!=0)
{
strcpy(p->data.bookmark,"Y");
strcpy(p->data.memberid,q->data.memberid);
printf("\nsuccessed!\n");
getchar();
getchar();
}
else
{
printf("\nThe book have borrowed,please wait afew days.....");
getchar();
getchar();
}
}
printf("\nPress anykey return.....");
getchar();
getchar();
}
void returnbook()
{
char id[5];
linknode p;
system("cls");
p=head->next;
printf("return book.....\n");
printf("Please input book id:\n");
scanf("%s",id);
while(p!=NULL)
{
if(strcmp(p->data.bookid,id)==0)
break;
else
p=p->next;
}
if(p==NULL)
printf("\nThe book you want to retrun are not exit!\n");
else
{
strcpy(p->data.bookmark,"N");
strcpy(p->data.memberid,"0");
printf("\nsuccessed!\n");
}
printf("\nPress anykey return.....");
getchar();
getchar();
}
void bookmanagetitle()
{
system("cls");
printf(" BOOK MANAGE MENU \n");
printf("*********************************************\n");
printf("*1:Look all books *\n");
printf("*-------------------------------------------*\n");
printf("*2:Add book *\n");
printf("*-------------------------------------------*\n");
printf("*3:Select book by id *\n");
printf("*-------------------------------------------*\n");
printf("*4:Delete book by id *\n");
printf("*-------------------------------------------*\n");
printf("*5:Borrow book *\n");
printf("*-------------------------------------------*\n");
printf("*6:Return book *\n");
printf("*-------------------------------------------*\n");
printf("*0:Return to main form *\n");
printf("*********************************************\n");
printf("\nPlease input order:\n");
}
void bookmanage()
{
int ch;
while(1)
{
bookmanagetitle();
scanf("%d",&ch);
if(ch==0)
break;
switch(ch)
{
case 1:printbookinfo(head);
break;
case 2:addbook();
break;
case 3:select();
break;
case 4:deletebook();
break;
case 5:borrow();
break;
case 6:returnbook();
break;
case 0:break;
default:printf("\nTou have input the wrong order!\n");
printf("Press anykey return.....");
getchar();
getchar();
}
}
}
void printmemberinfo(mlinknode head)
{
mlinknode mp=head->next;
system("cls");
printf("The member infomations are....\n");
printf("%-7s%s\n","id","name");
printf("********************************************\n");
for(;mp!=NULL;mp=mp->next)
printf("%-7s%s\n",mp->data.memberid,mp->data.membername);
printf("\nPress anykeykey return.....");
getchar();
getchar();
}
void addmember()
{
mlinknode p=(mlnode*)malloc(sizeof(mlnode));
system("cls");
printf("Add member.....\n");
printf("%-7s%s\n","id","name");
printf("*******************************************\n");
scanf("%s%s",p->data.memberid,p->data.membername);
p->next=mhead->next;
mhead->next=p;
printf("\nAdd success!");
printf("\nPress anykey return.....");
getchar();
getchar();
}
void selectmember()
{
char id[5];
mlinknode p;
system("cls");
printf("select member by id.....\n");
p=mhead->next;
printf("Please input member id:\n");
scanf("%s",id);
while(p!=NULL)
{
if(strcmp(p->data.memberid,id)==0)
break;
else
p=p->next;
}
if(p==NULL)
printf("\nThe member not exit!\n");
else
{
printf("\n%-7s%s\n","id","name");
printf("*****************************************\n");
printf("%-7s%s\n",p->data.memberid,p->data.membername);
}
printf("\nPress anykey return.....");
getchar();
getchar();
}
void deletemember()
{
char id[5];
mlinknode p,q;
system("cls");
printf("delete member.....\n");
p=mhead->next;
q=mhead;
printf("Please input member id:\n");
scanf("%s",id);
while(p!=NULL)
{
if(strcmp(p->data.memberid,id)==0)
break;
else
{
q=p;
p=p->next;
}
}
if(p==NULL)
printf("\nThe member you want to delete are not exit!\n");
else
{
q->next=p->next;
free(p);
printf("\nDelete success!\n");
}
printf("\nPress anykey return.....");
getchar();
getchar();
}
void membermanagetitle()
{
system("cls");
printf(" MEMBER MANAGE MENU \n");
printf("*******************************************\n");
printf("*1:Look all memberinfo *\n");
printf("*-----------------------------------------*\n");
printf("*2:Add member *\n");
printf("*-----------------------------------------*\n");
printf("*3:Select member by id *\n");
printf("*-----------------------------------------*\n");
printf("*4:Delete member by id *\n");
printf("*-----------------------------------------*\n");
printf("*0:Return to main form *\n");
printf("*******************************************\n");
printf("\nPlease input order:\n");
}
void membermanage()
{
int ch;
while(1)
{
membermanagetitle();
scanf("%d",&ch);
if(ch==0)
break;
switch(ch)
{
case 1:printmemberinfo(mhead);
break;
case 2:addmember();
break;
case 3:selectmember();
break;
case 4:deletemember();
break;
case 0:break;
default:printf("\nYou have input the wrong order!\n");
printf("Press anykey return.....");
getchar();
getchar();
}
}
}
void main()
{
int ch;
initallinfo();
while(1)
{
mainmenu();
scanf("%d",&ch);
switch(ch)
{
case 1:bookmanage();
break;
case 2:membermanage();
break;
case 0:exit(0);
default:printf("\nYou have input the wrong order!\n");
printf("Press anykey return.....");
getchar();
getchar();
}
}
}
5.课程设计心得及存在问题
在这次课程设计中,我加深了对链表这个数据结构了解和认识,学会了链表建立、结点加入和删除、信息输出、简单图形界面构建等多个功效。在链表方面,即使学习了理论知识,但对它具体应用,经过课程设计实际应用了链表。对于操作界面,我认为还有很多要学,经过课程设计,对此有了部分了解。在调试过程中,从文件中读入数据,建立链表比较困难,要用到”rb”文件,只能用原来文件。这次课程设计,使我加深了对《数据结构》这门课了解,认识到数据结构关键性,计算机科学思想精妙,我要努力学习。
展开阅读全文