C语言链表如何实现图书管理系统

作者:袖梨 2022-06-25

之前参照网上的资料用链表实现了图书管理系统,包括简单的增删改查功能以及借书还书功能,我是VC6.0下写的一个控制台程序,格式参照的网上的。在动手编码之前,你需要理清自己的思路。首先,需要确定图书馆里系统中主要有那几个对象,这里我写了学生对象和图书对象。不妨在纸上写出或画出它们主要包括哪些属性以及其可能的对应关系,这里根据不同人的要求会有所不同。清楚这些之后,就可以设计学生和图书的数据结构,比如这里我用的结构体存储其信息。然后就需要考虑,我想要哪些功能,除了基本的增删改查之外,我还想要哪些功能?比如借书、还书,我怎么表示这之间的关系?可以通过图书的属性来记录该书的状态,及是否被借走,谁借了。主要就是这个思路,图书的增删改查是通过链表实现的,当然也可以用数组实现,只不过那会浪费较多的空间。

// MyLibManSys.cpp : Defines the entry point for the console application. 

// 
 
#include "stdafx.h" 
#include "iostream" 
 
struct book{ 
  int id; 
  char title[20]; 
  char author[20]; 
  double price; 
  char state[20]; 
  int student_id; 
  char student_name[20]; 
  struct book* next; 
}; 
 
struct student{ 
  int id; 
  char name[20]; 
  char sex[10]; 
  char borrow_book[30]; 
  struct student* next; 
}; 
void Print_Book(struct book *head_book); 
void Print_Student(struct student *head_student); 
struct book *Create_New_Book();/*创建新的图书库*/  
struct student *Create_New_Student();/*创建新的学生库*/ 
struct book *Insert_Book(struct book *head_book,struct book *new_book);/*增加图书,逐个添加*/  
//void Insert_Book(struct book *head_book,struct book *new_book);/*增加图书,逐个添加*/ 
//函数的参数是一个指针时,不要在函数体内部改变指针所指的地址,那样毫无作用,需要修改的只能是指针所指向的内容。即应把指针当作常量 
struct student *Insert_Student(struct student *head_student,struct student *new_student);/*增加学生,逐个添加*/  
struct book *Search_Book_ById(int id,struct book *head_book);  
struct book *Search_Book_ByTitle(char *title,struct book *head_book);  
struct book *Search_Book_ByPrice(double price_h,double price_l,struct book *head_book); 
//bool Delete_Book(int id,book* head_book); 
struct book* Delete_Book(int id,book* head_book); 
struct student *Search_Student(int id,struct student *head_student); 
struct student* Delete_Student(int id,student* head_student); 
 
void Lent_Book(int id,int student_id,struct book *head_book,struct student *head_student); 
void Back_Book(int id,int student_id,struct book *head_book,struct student *head_student); 
 
int main() 
{ 
  struct book* head_book,*p_book; 
  struct student* head_student, *p_student; 
  int choice, f, id, student_id; 
  int m = 1; 
  char name[20],sex[10]; 
  char title[20]; 
  double price_h,price_l,price; 
  char author[20]; 
  int size_book=sizeof(struct book); 
  int size_student=sizeof(struct student); 
  printf("n欢迎您第一次进入图书管理系统!nn");  
  printf("----->[向导]----->[新建图书库]nn");  
  printf("注意:当输入图书编号为0时,进入下一步.nn");  
  head_book=Create_New_Book();  
  system("cls"); 
  //Print_Book(head_book); 
  printf("n欢迎您第一次进入图书管理系统!nn");  
  printf("----->[向导]----->[新建会员库]nn");  
  printf("注意:当输入会员学号为0时,进入主菜单.nn"); 
  head_student=Create_New_Student();  
  system("cls"); 
  //Print_Student(head_student); 
  do{ 
    printf("nttt〓〓〓〓〓图书管理系统〓〓〓〓〓nn");  
    printf("n");  
    printf("ttt[1]:借书办理t");printf(" [6]:还书办理n");  
    printf("n");  
    printf("ttt[2]:查询图书t");printf(" [7]:查询学生n");  
    printf("ttt[3]:添加图书t");printf(" [8]:添加学生n");  
    printf("ttt[4]:删除图书t");printf(" [9]:删除学生n");  
    printf("ttt[5]:遍历图书t");printf("[10]:遍历学生nn");  
    printf("ttt〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓nn");  
    printf("ttt0:退出nn");  
    printf("请选择<0~10>:");  
    scanf("%d",&choice); 
    switch(choice){ 
    case 0: 
      system("cls");  
      printf("nttt〓〓〓〓〓图书管理系统〓〓〓〓〓nn");  
      printf("n谢谢您的使用!nn");  
      break; 
    case 1: 
      system("cls"); 
      printf("nttt〓〓〓〓〓图书管理系统〓〓〓〓〓nn"); 
      printf("输入借出图书编号:n");  
      scanf("%d",&id); 
      printf("输入借入学生学号:n"); 
      scanf("%d",&student_id); 
      Lent_Book(id,student_id,head_book,head_student); 
      break; 
    case 2: 
      system("cls");  
      printf("nttt〓〓〓〓〓图书管理系统〓〓〓〓〓nn");  
      printf("1.按编号查询nn");  
      printf("2.按名称查询nn");  
      printf("3.按价格区间查询nn");  
      printf("0.返回主菜单nn");  
      printf("请选择:");  
      scanf("%d",&f);  
      if(f==1){  
        printf("请输入查询图书编号:");  
        scanf("%d",&id);  
        printf("相关信息如下:nn");  
        head_book=Search_Book_ById(id,head_book);  
        break;  
      }  
      else if(f==2){ 
        getchar(); 
        printf("请输入查询图书名称:");  
        gets(title); 
        printf("相关信息如下:nn");  
        head_book=Search_Book_ByTitle(title,head_book);  
        break;  
      }  
      else if(f==3){  
        printf("请输入最高价格:");  
        scanf("%lf",&price_h);  
        printf("请输入最低价格:");  
        scanf("%lf",&price_l);  
        printf("相关信息如下:nn");  
        head_book=Search_Book_ByPrice(price_h,price_l,head_book);  
        break;  
      }  
      else if(f==0){  
        break;  
      }  
      break; 
    case 3: 
      system("cls");  
      printf("nttt〓〓〓〓〓图书管理系统〓〓〓〓〓nn");  
      printf("请输入图书编号:");  
      scanf("%d",&id);  
      printf("请输入图书名称:");  
      scanf("%s",title);  
      printf("请输入作者名字:");  
      scanf("%s",author);  
      printf("请输入单价:");  
      scanf("%lf",&price);  
      printf("n"); 
      struct book *ptr_b; 
      for(ptr_b=head_book;ptr_b;ptr_b=ptr_b->next)  
      { 
        if(ptr_b->id==id)  
        {  
          printf("此编号图书已存在n");  
          m=0;  
          break;  
        }  
      }  
      if(m){  
        p_book=(struct book *)malloc(size_book);  
        strcpy(p_book->title,title);  
        p_book->id=id;  
        p_book->price=price;  
        p_book->student_id=-1;  
        strcpy(p_book->author,author);  
        strcpy(p_book->state,"存在");   
        strcpy(p_book->student_name,"待定");  
      // head_book=Insert_Book(head_book,p_book);  
        Insert_Book(head_book,p_book); 
        printf("n添加图书成功!nn");  
      }  
      break; 
    case 4: 
      system("cls");  
      printf("nttt〓〓〓〓〓图书管理系统〓〓〓〓〓nn");  
      printf("输入删除图书编号:n");  
      scanf("%d",&id);  
      /*if(Delete_Book(id,head_book)){ 
        printf("n删除图书成功!nn"); 
      }else{ 
        printf("删除失败"); 
      }*/ 
      head_book = Delete_Book(id,head_book); 
      break; 
    case 5:  
      system("cls");  
      printf("nttt〓〓〓〓〓图书管理系统〓〓〓〓〓nn");  
      Print_Book(head_book);  
      break; 
    case 6: 
      system("cls"); 
      printf("nttt〓〓〓〓〓图书管理系统〓〓〓〓〓nn"); 
      printf("输入归还图书编号:n");  
      scanf("%d",&id); 
      printf("输入归还学生学号:n"); 
      scanf("%d",&student_id); 
      Back_Book(id,student_id,head_book,head_student); 
      break; 
    case 7: 
      system("cls");  
      printf("nttt〓〓〓〓〓图书管理系统〓〓〓〓〓nn");    
      printf("请输入查询学生学号:");  
      scanf("%d",&id);  
      printf("相关信息如下:nn");  
      head_student=Search_Student(id,head_student);  
      break; 
    case 8: 
      system("cls");  
      printf("nttt〓〓〓〓〓图书管理系统〓〓〓〓〓nn");  
      printf("请输入学生编号:");  
      scanf("%d",&id);  
      printf("请输入学生姓名:");  
      scanf("%s",name);  
      printf("请输入学生性别:");  
      scanf("%s",sex);   
      printf("n"); 
      struct student *ptr_s; 
      for(ptr_s=head_student;ptr_s;ptr_s=ptr_s->next)  
      { 
        if(ptr_s->id==id)  
        {  
          printf("此学号学生已存在n");  
          m=0;  
          break;  
        }  
      }  
      if(m){  
        p_student=(struct student *)malloc(size_student);   
        p_student->id=id;   
        strcpy(p_student->name,name);  
        strcpy(p_student->sex,sex);   
        strcpy(p_student->borrow_book,"无");  
        head_student=Insert_Student(head_student,p_student);  
        printf("n添加学生成功!nn");  
      }  
      break; 
    case 9: 
      system("cls");  
      printf("nttt〓〓〓〓〓图书管理系统〓〓〓〓〓nn");  
      printf("输入删除学生学号:n");  
      scanf("%d",&id);  
      head_student = Delete_Student(id,head_student); 
      break; 
    case 10: 
      system("cls");  
      printf("nttt〓〓〓〓〓图书管理系统〓〓〓〓〓nn");  
      Print_Student(head_student); 
    } 
  }while(choice!=0); 
  return 0; 
} 
 
struct book *Create_New_Book(){ 
  struct book *head_book,*p_book;  
  int id, tag;  
  double price;  
  char title[20],author[20];  
  int size_book=sizeof(struct book);  
    
  head_book=NULL;  
  printf("请输入图书编号:");  
  scanf("%d",&id);  
  printf("请输入图书名称:");  
  scanf("%s",title);  
  printf("请输入作者名字:");  
  scanf("%s",author);  
  printf("请输入单价:");  
  scanf("%lf",&price);  
  printf("n");  
  while(true){  
    p_book=(struct book *)malloc(size_book);  
    strcpy(p_book->title,title);  
    p_book->id=id;  
    p_book->price=price;  
    p_book->student_id=-1;  
    strcpy(p_book->author,author);  
    strcpy(p_book->state,"存在");   
    strcpy(p_book->student_name,"待定");  
    head_book=Insert_Book(head_book,p_book); 
    printf("是否继续?继续输入1,退出按任意键n"); 
    scanf("%d",&tag); 
    if(tag!=1){ 
      break; 
    } 
    printf("请输入图书编号:");  
    scanf("%d",&id);  
    printf("请输入图书名称:");  
    scanf("%s",title);  
    printf("请输入作者名字:");  
    scanf("%s",author);  
    printf("请输入单价:");  
    scanf("%lf",&price);  
    printf("n");  
  }  
  return head_book; 
} 
 
struct student *Create_New_Student(){ 
  struct student *head_student,*p_student;  
  int id, tag; 
  char sex[10]; 
  char name[20];  
  int size_student=sizeof(struct student);  
    
  head_student=NULL;  
  printf("请输入学生编号:");  
  scanf("%d",&id);  
  printf("请输入学生姓名:");  
  scanf("%s",name);  
  printf("请输入学生性别:");  
  scanf("%s",sex);   
  printf("n");  
  while(true){  
    p_student=(struct student *)malloc(size_student);   
    p_student->id=id;   
    strcpy(p_student->name,name);  
    strcpy(p_student->sex,sex);   
    strcpy(p_student->borrow_book,"无");  
    head_student=Insert_Student(head_student,p_student);  
    printf("是否继续?继续输入1,退出按任意键n"); 
    scanf("%d",&tag); 
    if(tag!=1){ 
      break; 
    } 
    printf("请输入学生编号:");  
    scanf("%d",&id);  
    printf("请输入学生姓名:");  
    scanf("%s",name);  
    printf("请输入学生性别:");  
    scanf("%s",sex);   
    printf("n");  
  }  
  return head_student; 
} 
 
struct book *Insert_Book(struct book *head_book,struct book *new_book){ 
  struct book *p,*q; 
 
  p=q=head_book; 
   
  if(head_book==NULL){  //单向链表为空的情况 
    head_book=new_book; 
    new_book->next = NULL; 
  }else{ 
    while((new_book->id>p->id)&&(p->next!=NULL)){ 
      q = p; 
      p = p->next; 
    } 
    if(new_book->id<=p->id){ 
      new_book->next=p; 
      if(head_book==p) 
        head_book=new_book; 
      else 
        q->next = new_book; 
    }else{ 
      p->next=new_book; 
      new_book->next=NULL; 
    } 
  } 
  return head_book; 
}; 
 
struct student *Insert_Student(struct student *head_student,struct student *new_student){ 
  struct student *p,*q; 
 
  p=q=head_student; 
   
  if(head_student==NULL){ //单向链表为空的情况 
    head_student=new_student; 
    new_student->next = NULL; 
  }else{ 
    while((new_student->id>p->id)&&(p->next!=NULL)){ 
      q = p; 
      p = p->next; 
    } 
    if(new_student->id<=p->id){ 
      new_student->next=p; 
      if(head_student==p) 
        head_student=new_student; 
      else 
        q->next = new_student; 
    }else{ 
      p->next=new_student; 
      new_student->next=NULL; 
    } 
  } 
  return head_student; 
} 
 
struct book *Search_Book_ById(int id,struct book *head_book){ 
  struct book *ptr_book = head_book;  
  int flag=0;  
  while(ptr_book!=NULL)  
  { 
    if(ptr_book->id==id){ 
      printf("图书编号:%dn",ptr_book->id); 
      printf("图书名称:%sn",ptr_book->title); 
      printf("图书单价:%.2lfn",ptr_book->price); 
      printf("图书作者:%sn",ptr_book->author); 
      printf("存在状态:%sn",ptr_book->state); 
      printf("借书人姓名:%sn",ptr_book->student_name);  
      printf("学号:%dn",ptr_book->student_id); 
      printf("n"); 
      flag++; 
    } 
    if(flag>0) 
    { 
      break; 
    } 
    ptr_book = ptr_book->next; 
  }  
  if(flag==0){  
      printf("暂无此图书信息!nn");  
  }  
  return head_book;  
}; 
 
struct book *Search_Book_ByTitle(char *title,struct book *head_book){ 
  struct book *ptr_book = head_book;  
  int flag=0;  
  while(ptr_book!=NULL)  
  {  
    if(strcmp(ptr_book->title,title)==0){  
      printf("图书编号:%dn",ptr_book->id);  
      printf("图书名称:%sn",ptr_book->title);  
      printf("图书单价:%.2lfn",ptr_book->price);  
      printf("图书作者:%sn",ptr_book->author);  
      printf("存在状态:%sn",ptr_book->state);  
      printf("借书人姓名:%sn",ptr_book->student_name);   
      printf("学号:%dn",ptr_book->student_id);  
      printf("n");  
      flag++;  
    } 
    if(flag>0) 
    { 
      break; 
    } 
    ptr_book = ptr_book->next; 
  }  
  if(flag==0){  
      printf("暂无此图书信息!nn");  
  }  
  return head_book; 
}; 
 
struct book *Search_Book_ByPrice(double price_h,double price_l,struct book *head_book){ 
  struct book *ptr_book = head_book;  
  int flag=0;  
  while(ptr_book!=NULL)  
  {  
    if(ptr_book->price>=price_l&&ptr_book->price<=price_h){  
      printf("图书编号:%dn",ptr_book->id);  
      printf("图书名称:%sn",ptr_book->title);  
      printf("图书单价:%.2lfn",ptr_book->price);  
      printf("图书作者:%sn",ptr_book->author);  
      printf("存在状态:%sn",ptr_book->state);  
      printf("借书人姓名:%sn",ptr_book->student_name);   
      printf("学号:%dn",ptr_book->student_id);  
      printf("n");  
      flag++;  
    } 
    ptr_book = ptr_book->next; 
  }  
  if(flag==0){  
      printf("暂无此图书信息!nn");  
  }  
  return head_book; 
} 
 
/*bool Delete_Book(int id,book* head_book){ 
  bool flag=true; 
  struct book *p,*q; 
  p=q=head_book; 
  if(p->id==id&&p->next==NULL){ 
    head_book=NULL; 
  } 
 
  while(p->id!=id&&p->next!=NULL){ 
    q=p; 
    p=p->next; 
  } 
  if(p->id==id){ 
    if(p==head_book){ 
      head_book=p->next; 
    }else{ 
      q->next=p->next; 
    } 
    free(p); 
  }else{ 
    flag=false; 
    printf("找不到该书"); 
  } 
  return flag; 
};*/ 
 
struct book* Delete_Book(int id,book* head_book){ 
  bool flag=true; 
  struct book *p,*q; 
  p=q=head_book; 
 
  while(p->id!=id&&p->next!=NULL){ 
    q=p; 
    p=p->next; 
  } 
  if(p->id==id){ 
    if(p==head_book){ 
      head_book=p->next; 
    }else{ 
      q->next=p->next; 
    } 
 
    free(p); 
    printf("删除成功!n"); 
  }else{ 
    flag=false; 
    printf("找不到该书"); 
  } 
  return head_book; 
}; 
 
struct student* Delete_Student(int id,student* head_student){ 
  bool flag=true; 
  struct student *p,*q; 
  p=q=head_student; 
 
  while(p->id!=id&&p->next!=NULL){ 
    q=p; 
    p=p->next; 
  } 
  if(p->id==id){ 
    if(p==head_student){ 
      head_student=p->next; 
    }else{ 
      q->next=p->next; 
    } 
 
    free(p); 
    printf("删除成功!n"); 
  }else{ 
    flag=false; 
    printf("找不到该学生"); 
  } 
  return head_student; 
}; 
 
struct student *Search_Student(int id,struct student *head_student){ 
  struct student *ptr_student = head_student;  
  int flag=0;  
  while(ptr_student!=NULL)  
  { 
    if(ptr_student->id==id){ 
      printf("学号:%dn",ptr_student->id); 
      printf("姓名:%sn",ptr_student->name); 
      printf("性别:%sn",ptr_student->sex); 
      printf("借书:%sn",ptr_student->borrow_book);  
      printf("n"); 
      flag++; 
    } 
    if(flag>0) 
    { 
      break; 
    } 
    ptr_student = ptr_student->next; 
  }  
  if(flag==0){  
      printf("暂无此学生信息!nn");  
  }  
  return head_student;  
}; 
 
void Lent_Book(int id,int student_id,struct book *head_book,struct student *head_student){ 
  struct book* p=head_book; 
  struct student* q=head_student; 
  if(p==NULL||q==NULL){ 
    printf("书本或学生不存在n"); 
    return; 
  } 
  while(p!=NULL&&q!=NULL){ 
    if(p->id!=id){ 
      p=p->next; 
    } 
    if(q->id!=student_id){ 
      q=q->next; 
    } 
    if(p->id==id&&q->id==student_id){ 
      break; 
    } 
  } 
  if(p==NULL||q==NULL){ 
    printf("书本或学生不存在n"); 
    return; 
  }else{ 
    if(strcmp(p->state,"存在")!=0){ 
      printf("书已借出!抱歉!"); 
      return; 
    }else{ 
      p->student_id=student_id; 
      strcpy(p->student_name,q->name); 
      strcpy(q->borrow_book,p->title); 
      strcpy(p->state,"已借出"); 
      printf("已成功借出!/n"); 
    } 
  } 
}; 
 
void Back_Book(int id,int student_id,struct book *head_book,struct student *head_student){ 
  struct book* p=head_book; 
  struct student* q=head_student; 
  if(p==NULL||q==NULL){ 
    printf("书本或学生不存在n"); 
    return; 
  } 
  while(p!=NULL&&q!=NULL){ 
    if(p->id!=id){ 
      p=p->next; 
    } 
    if(q->id!=student_id){ 
      q=q->next; 
    } 
    if(p->id==id&&q->id==student_id){ 
      break; 
    } 
  } 
  if(p==NULL||q==NULL){ 
    printf("书本或学生不存在n"); 
    return; 
  }else{ 
    if(strcmp(p->state,"存在")==0){ 
      printf("书未借出!抱歉!"); 
      return; 
    }else{ 
      p->student_id=-1; 
      strcpy(p->student_name,"待定"); 
      strcpy(q->borrow_book,"无"); 
      strcpy(p->state,"存在"); 
      printf("已成功归还!/n"); 
    } 
  } 
}; 
 
void Print_Book(struct book *head_book){ 
  struct book* p=head_book; 
 
  if(p==NULL){  
    printf("n无记录nn");  
    return;  
  }  
  printf("n图书编号t图书名称t图书单价t图书作者nn");  
  while (p!=NULL) 
  { 
    printf("%dtt%stt%.2lftt%snn",p->id,p->title,p->price,p->author); 
    p = p->next; 
  } 
} 
 
void Print_Student(struct student *head_student){ 
  struct student* p=head_student; 
 
  if(p==NULL){  
    printf("n无记录nn");  
    return;  
  }  
  printf("n学生姓名t学生性别t学生学号nn");  
  while (p!=NULL) 
  { 
    printf("%stt%stt%dn",p->name,p->sex,p->id); 
    p = p->next; 
  } 
} 

代码可以直接运行,这里我都是在控制台上直接显示的,如果想从文件读取和向文件写入学生和图书信息,只需要把相应的printf和scanf部分改为文件操作。这个是很久之前写的,详细的函数以及功能讲解这里就不介绍了。欢迎大家讨论和指导。

相关推荐

C语言中的getchar和putchar的使用方法》、《C语言如何利用异或进行两个值的交换详解

相关文章

精彩推荐