s=(LinkList*)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("录入成功!
\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->next;
}
p->next=s;
p=s;
p->next=NULL;
printf("录入成功!
\n");
Sleep(1000);
}
system("cls");
menu();
return0;
查询
LinkList*p=L->next;//p指向第一个数据结点
intc;
intx=0;
charname1[10],author1[10],press1[10];
printf("1按书名查询:
\n");
printf("2按作者名查询:
\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){
case1:
printf("请输入图书书名:
\n");
scanf("%s",name1);
while(p!
=NULL){
if(strcmp(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++;
Sleep(2000);
system("cls");
menu();
}
}
if(p==NULL&&x==0)
printf("对不起,不存在此图书!
\n");
break;
case2:
printf("请输入图书作者:
\n");
scanf("%s",author1);
while(p!
=NULL){
if(strcmp(author1,p->data.author)!
=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++;
Sleep(2000);
system("cls");
menu();
}
}
if(p==NULL&&x==0)
printf("对不起,不存在此图书!
\n");
break;
case3:
printf("请输入图书的出版社名称:
\n");
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->data.press,p->data.count,p->data.price);
printf("\n");
p=p->next;
x++;
Sleep(2000);
system("cls");
menu();
}
}
if(p==NULL&&x==0)
printf("对不起!
不存在此图书\n");
break;
case4:
break;
}
五、调试分析
所遇问题的解决方法及分析
当我编写录入函数时,对如何将数据储存到链表中无从下手。
后来经过查询和多次尝试,决定用尾插法建立链表,采用这样的方法简单明了,易于编程。
算法的时空分析及改进设想
O(n)
经验和体会
通过这次的上机实验,让我们对线性表的理解又有了进一步的提升,更加清楚地了解到线性表的储存方式。
6、使用说明
打开程序,根据界面提示即可
7、测试结果(截屏)
8、附录
#include
#include
#include
#include
#include
typedefstruct{
intnum;
charname[20];
charauthor[20];
charpress[20];
intcount;
charprice[10];
}ElemType;
typedefstructLNode//定义单链表结点类型
{
ElemTypedata;
structLNode*next;
}LinkList;
voidmenu(){//菜单函数
printf("----------------------------------------------------------\n");
printf("欢迎光临图书管理系统!
\n");
printf("-----------------------------------------------------------\n");
printf("1.图书信息录入添加功能:
\n");
printf("2.图书信息查询功能:
\n");
printf("3.图书信息排序功能:
\n");
printf("4.图书的修改功能:
\n");
printf("5.图书的删除功能:
\n");
printf("0.退出系统:
\n");
printf("请选择你需要的操作:
\n");}
voidInitList(LinkList*L)//初始化线性表
{
L=(LinkList*)malloc(sizeof(LinkList));//创建头结点
L->next=NULL;
}
intCreateListR(LinkList*L)//尾插法建表
{
inti,n;
LinkList*s,*q,*p;
p=L;
while(p->next!
=NULL)
p=p->next;
printf("请输入需要录入的图书信息的个数:
n=");
scanf("%d",&n);
for(i=1;is=(LinkList*)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("录入成功!
\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->next;
}
p->next=s;
p=s;
p->next=NULL;
printf("录入成功!
\n");
Sleep(1000);
}
system("cls");
menu();
return0;
}
voidLocateElem(LinkList*L)//查询
{
LinkList*p=L->next;//p指向第一个数据结点
intc;
intx=0;
charname1[10],author1[10],press1[10];
printf("1按书名查询:
\n");
printf("2按作者名查询:
\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){
case1:
printf("请输入图书书名:
\n");
scanf("%s",name1);
while(p!
=NULL){
if(strcmp(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++;
Sleep(2000);
system("cls");
menu();
}
}
if(p==NULL&&x==0)
printf("对不起,不存在此图书!
\n");
break;
case2:
printf("请输入图书作者:
\n");
scanf("%s",author1);
while(p!
=NULL){
if(strcmp(author1,p->data.author)!
=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++;
Sleep(2000);
system("cls");
menu();
}
}
if(p==NULL&&x==0)
printf("对不起,不存在此图书!
\n");
break;
case3:
printf("请输入图书的出版社名称:
\n");
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->data.press,p->data.count,p->data.price);
printf("\n");
p=p->next;
x++;
Sleep(2000);
system("cls");
menu();
}
}
if(p==NULL&&x==0)
printf("对不起!
不存在此图书\n");
break;
case4:
break;
}
}
intSort(LinkList*L)//递增有序排序(直接插入排序法)
{
LinkList*p=L->next,*q,*r;//p指向第一个数据结点
if(p!
=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.numdata.num)
q=q->next;//在有序表中找插入*p的直接前驱结点*q的位置
p->next=q->next;//将*p插入到*q之后
q->next=p;
p=r;//扫描原单链表余下的结点
}
}
return0;
}
voidDisplay(LinkList*L)//输出排序结果
{
LinkList*p=L->next;
while(p!
=NULL){
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;
}
}
intModifyList(LinkList*L)//修改
{
LinkList*p=L;
charname1[10];
printf("请输入要修改的图书的书名:
\n");
scanf("%s",name1);
while(p!
=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");
return0;
}
p=p->next;
}
printf("不存在此图书\n");
return0;
}
intListDelete(LinkList*L)//删除
{
LinkList*p=L->next,*q=L;
charname1[10];
if(p!
=NULL){
printf("请输入要删除的书名:
");
scanf("%s",name1);
}
while(p->next!
=NULL&&strcmp(p->data.name,name1)!
=0){
p=p->next;
q=q->next;
}
if(p->next!
=NULL)//如果p此时不是最后一个节点,说明此时已经找到书
{
q->next=p->next;
printf("删除成功!
\n");
return0;
}
if(p->next==NULL&&strcmp(name1,p->data.name)!
=0)//如果p此时为最后一个结点并且没有找到与之相符的书名
{
printf("你输入的书名不存在,请核实后重新输入!
\n");
}else{
q->next=NULL;
printf("删除成功!
\n");
}
return0;
}
}
intmain()//主函数
{
ints;
LinkList*L;
L=(LinkList*)malloc(sizeof(LinkList));
InitList(L);
menu();
printf("请输入编号:
\n");
scanf("%d",&s);
while(s!
=0){
switch(s){
case1:
CreateListR(L);
break;
case2:
LocateElem(L);
break;
case3:
Sort(L);
Display(L);
break;
case4:
ModifyList(L);
break;
case5:
ListDelete(L);
break;
case6:
Borrow(L);
break;
case7:
Return(L);
break;
case0:
printf("谢谢使用\n");
break;
}
scanf("%d",&s);
}
return0;
}