C语言--图书管理系统待续版



#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.需求分析

  1. 程序为了实现图书的借入与归还的功能。

  2. 数据的输入包括图书的编号和名称。

  3. 输入的形式分别为整数与字符串。

    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. 算法的不足之处在于1.插入和删除的速度较慢,2,不可以增长长度,比如想要删除或者增加数据时整个链表都需要移动。

  2. 我的体会:一定要明白链表存储数据时是不连续的,并且要明白指针的作用和指针移动的过程,记住链表是有头有尾的。

(3)后续再做优化。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值