#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct lib_book{
int num;
char name[20];
struct lib_book *next;
};
struct lib_book *information(); /*录入图书信息*/
struct lib_book *back_book(struct lib_book *head,struct lib_book *stud);/*归还图书*/
struct lib_book *lend_book(struct lib_book *head,int num); /*借出图书*/
void print_book(struct lib_book *head); /*遍历图书信息*/
int main()
{
struct lib_book *head,*p;
int choice,num;
char name[20];
int size=sizeof(struct lib_book);
do{
printf("1:录入图书 2:归还 3:借出 4:遍历 0:退出\n");
printf("输出你的选择: ");
scanf("%d",&choice);
switch(choice){
case 1:
head=information();
break;
case 2:
printf("输入要归还的图书的编号和书名\n");
scanf("%d%s",&num,name);
p=(struct lib_book*)malloc(size);
p->num=num;
strcpy(p->name,name);
head=back_book(head,p);
break;
case 3:
printf("输入要借出的图书的编号 \n");
scanf("%d",&num);
head=lend_book(head,num);
break;
case 4:
print_book(head);
break;
case 0:
break;
}
}while(choice!=0);
return 0;
}
struct lib_book *information(){ /*录入图书信息*/
struct lib_book *head,*p;
int num;
char name[20];
int size=sizeof(struct lib_book);
head=NULL;
printf("输入编号和图书名字: ");
scanf("%d%s",&num,name);
while(num!=0){
p=(struct lib_book*)malloc(size);
p->num=num;
strcpy(p->name,name);
head=back_book(head,p);
printf("输入下一本图书的编号和名字\n");
printf("输入的编号为0的数据代表录入结束\n");
scanf("%d%s",&num,name);
}
return head;
}
struct lib_book* back_book(struct lib_book *head,struct lib_book *stud){ /*归还图书*/
struct lib_book *ptr,*ptr1,*ptr2;
ptr2=head;
ptr=stud;
if(head==NULL){
head=ptr;
head->next=NULL;
}
else{
while((ptr->num>ptr2->num)&&(ptr2->next!=NULL)){
ptr1=ptr2;
ptr2=ptr2->next;
}
if(ptr->num<=ptr2->num){
if(head==ptr2) head=ptr;
else ptr1->next=ptr;
ptr->next=ptr2;
}
else
{
ptr2->next=ptr;
ptr->next=NULL;
}
}
return head;
}
struct lib_book * lend_book(struct lib_book *head,int num){ /*借出图书*/
struct lib_book *ptr1,*ptr2;
while(head!=NULL&&head->num==num){
ptr2=head;
head=head->next;
free(ptr2);
}
if(head==NULL)
return NULL;
ptr1=head;
ptr2=head->next;
while(ptr2!=NULL){
if(ptr2->num==num){
ptr1->next=ptr2->next;
free(ptr2);
}
else
ptr1=ptr2;
ptr2=ptr1->next;
}
return head;
}
void print_book(struct lib_book *head){ /*遍历图书信息*/
struct lib_book *ptr;
if(head==NULL){
printf("\n没有记录\n");
return;
}
printf("\n图书信息如下: \n");
for(ptr=head;ptr!=NULL;ptr=ptr->next){
printf("%d\t%s\t",ptr->num,ptr->name);
printf("\n");
}
}
1.题目
图书管理小程序,要求:
1、自定义图书目录卡数据结构,初始化10本图书信息(可以写死在程序里)
2、实现借书,还书功能。详细过程如上课描述。
2.需求分析
-
程序为了实现图书的借入与归还的功能。
-
数据的输入包括图书的编号和名称。
-
输入的形式分别为整数与字符串。
3.调试分析
(1)遇到的问题有:如何建立链表,归还有几个点;
1.建立链表过程如下:需要调用归还时的函数back_book(head,p);首先需要声明一个指针*p,并指向结构体定义的数据的地址,然后把指针p通过函数back_book(head,p)录入数据;
而函数back_book(head,p)如果链表为空时直接把p指向head,head的下一位指向链表尾部;然后通过比较大小来判断应该插入的位置,通过编号的升顺序来排列,如果要插入的为首部,则head=ptr;
ptr->next=ptr2;
如果要插入到中间的位置,则 e ptr1->next=ptr;
ptr->next=ptr2;(ptr1是ptr2的前一位)
如果要插入的是末尾,则 ptr2->next=ptr;
ptr->next=NULL;
(其中ptr2指的是待插入的位置)
最后再返回链表的首部;
-
算法的不足之处在于1.插入和删除的速度较慢,2,不可以增长长度,比如想要删除或者增加数据时整个链表都需要移动。
-
我的体会:一定要明白链表存储数据时是不连续的,并且要明白指针的作用和指针移动的过程,记住链表是有头有尾的。
(3)后续再做优化。