⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.cpp

📁 这是我们做的数据结构课程设计的一个内容
💻 CPP
📖 第 1 页 / 共 2 页
字号:
     t=q->n+1;
     for(k=1;k<=s->n;k++)         //两个结点合拼
       { q->key[t+k-1]=s->key[k-1];
	 q->rec[t+k-1]=s->rec[k-1];
	 u=s->ptr[k-1];
	 q->ptr[t+k-1]=u;
	 if(u!=NULL) u->par=q;  //改变指向父结点的指针
       }
     u=s->ptr[s->n]; q->ptr[t+s->n]=u;
     if(u!=NULL) u->par=q;
     q->n=2*m;
     free(s);  //合拼完毕释放结点
     for(k=j;k<=p->n-1;k++)  //其后的关键字和指针逐个前移
       {
	p->key[k-1]=p->key[k];
	p->rec[k-1]=p->rec[k];
	p->ptr[k]=p->ptr[k+1];
       }
     p->n=p->n-1; s=q; q=p;
     }
   }
   if((q==bth)&&(q->n==0))   //若删除的是头结点而且删除后关键字数为0
     { free(bth); bth=s; bth->par=NULL; //删除头结点,并把s的结点作头结点
       if(s->n==0) {bth=NULL; free(s); } //空树
     }
   printf("\n\t    这本书已经被删除!");
   return(bth);
}//删除B树中元素的函数,并返回B树头指针





struct BookNode *InputNode()
{
  struct BookNode *p;
  int i;
  p=(struct BookNode *)malloc(sizeof(struct BookNode));   //为相应的关键字开辟一个BookNode类型的指针
  fflush(stdin);  //把scanf自动形成的输入流清除,否则流指针不会返回头处
  printf("\n\t    请输入书名: ");     //相应值的输入
  gets(p->title);
  printf("\n\t    请输入该书作者: ");
  gets(p->writer);
  printf("\n\t    请输入该书现库存量: ");
  scanf("%d",&p->current);
  printf("\n\t    请输入该书总库存量: ");
  scanf("%d",&p->total);
  fflush(stdin);
  for(i=0;i<20;i++)
  (p->reader[i]).num[0]='\0';   //用'\0'来初始化借该书的读者证号,表示一开始时没人借书
  return(p);  //返回该结点指针
}//输入相应于该关键字的书信息的函数,返回BookNode类型的书信息结点的指针






void OutputNode(struct TreeNode *bth)
{
  struct TreeNode *q;
  struct BookNode *p;
  int k;
  int x;
  int flag;
  printf("\n\t    请输入你想查找的书的关键字: ");
  scanf("%d",&x);
  q=search(bth,x,&k,&flag);    //寻找需要查找的书的位置
  if(flag==1)
  {
  p=q->rec[k-1];
  printf("\n\t    书名:             %s",p->title);    //输出相关内容
  printf("\n\t    作者:            %s",p->writer);
  printf("\n\t    现库存量:     %d",p->current);
  printf("\n\t    总库存量:       %d",p->total);
  }
  else printf("\n\t这本书不存在!");
}//查找并输出书的信息的函数,无返回值





void borrow(struct TreeNode *bth)
{
  struct TreeNode *q;
  struct BookNode *p;
  int i,k, x, flag,t;
  printf("\n\t    请输入你想借的书: ");
  scanf("%d",&x);
  q=search(bth,x,&k,&flag);  //寻找需要查找的书的位置
  if(flag==1)  //找到并显示该书的信息
  {
  p=q->rec[k-1];
  printf("\n\t    你想借这本书吗 ?(y/n)");
  printf("\n\t    书名:             %s",p->title);
  printf("\n\t    作者:            %s",p->writer);
  printf("\n\t    现库存量:     %d",p->current);
  printf("\n\t    总库存量:       %d",p->total);
  t=getch();
  if(t=='y'||t=='Y')
  {
    if( (p->current)==0) printf("\n\t对不起,这本书已经被借光了...");
    else
    {
      for(i=0;i<20;i++) if( (p->reader[i]).num[0]=='\0') break;
      printf("\n\t    请输入你的借书证号: ");  //输入借书证号
      scanf("%s",(p->reader[i]).num);
      printf("\n\t    请输入借书日期: "); //输入借书日期
      printf("\n\t    年:  ");
      scanf("%d",&((p->reader[i]).bro.year));
      printf("\t      月: ");
      scanf("%d",&((p->reader[i]).bro.month));
      printf("\t      日:   ");
      scanf("%d",&((p->reader[i]).bro.day));

      printf("\n\t    输入应还书日期: "); //输入应还书日期
      printf("\n\t    年:  ");
      scanf("%d",&((p->reader[i]).back.year));
      printf("\t      月: ");
      scanf("%d",&((p->reader[i]).back.month));
      printf("\t      日:   ");
      scanf("%d",&((p->reader[i]).back.day));

      p->current--;        //现存书量减1
      printf("\n\t    你已借了该书.");}
    }

  }
  else printf("\n\t    这本书不存在!"); //没找到
}//借书函数,无返回值





void payback(struct TreeNode *bth)
{
  struct TreeNode *q;
  struct BookNode *p;
  int i,k, x, flag,t,j;
  int year,month,day,d;
  float pay;
  char temp[20];
  printf("\n\t    请输入你还的书: ");
  scanf("%d",&x);
  q=search(bth,x,&k,&flag);    //寻找需要还的书的位置
  if(flag==1)
  {
  p=q->rec[k-1];
  printf("\n\t    你想还这本书吗 ?(y/n)");
  printf("\n\t    书名:             %s",p->title);
  printf("\n\t    作者:            %s",p->writer);
  printf("\n\t    现库存量:     %d",p->current);
  printf("\n\t    总库存量:       %d",p->total);
  t=getch();
  if(t=='y'||t=='Y')
  {
      printf("\n\t    请输入你的借书证号: ");
      scanf("%s",temp);
      j=0;
      for(i=0;i<20;i++)
      {
	if(! (strcmp(temp,(p->reader[i]).num))) {j=1;break;} //查看是否有借书
      }
      if(j==0) {printf("\n\t    你没有借书.");return;}  //该借书证号的人没借书
      printf("\n\t    今天是:");   //输入当天日期
      printf("\n\t    年:  ");
      scanf("%d",&year);
      printf("\t      月: ");
      scanf("%d",&month);
      printf("\t      日:   ");
      scanf("%d",&day);
      d=0;
      if(year<(p->reader[i]).back.year) d=1; //判断是否已过了还书日期,d=1还没过期,d=0过期
      if(year<=(p->reader[i]).back.year && month<(p->reader[i]).back.month) d=1;
      if(year<=(p->reader[i]).back.year && month<=(p->reader[i]).back.month && day<(p->reader[i]).back.day) d=1;
      if(d==0)
      {
	pay=(year-(p->reader[i]).back.year)*365+(month-(p->reader[i]).back.month)*30+(day-(p->reader[i]).back.day);
    printf("\n\t    你在 %d-%d-%d 借了这本书",(p->reader[i]).bro.year,(p->reader[i]).bro.month,(p->reader[i]).bro.day);  //打印借书和还书日期
	printf("\n\t    你应该在   %d-%d-%d 还这本书",(p->reader[i]).back.year,(p->reader[i]).back.month,(p->reader[i]).back.day);
	printf("\n\t    今天是        %d-%d-%d",year,month,day);
	printf("\n\n\t  所以你超出了还书日期");
	printf("\n\t    你应该被罚款 %2.1f 元.",0.1*pay); //过期一天还1角钱
      }
      (p->reader[i]).num[0]='\0'; //已还,清除该读者借书记录
      p->current++;  //现存书量加1
      printf("\n\t  你已经还了这本书.");
   // }
  }

  }
  else printf("\n\t  你要还一本没库存的书 ???");  //没可能还一本没库存的书

}//还书函数,无返回值






char menu(void)
{ 
  
  PP
  printf("1.采编入库");
  PPP
  printf("2.清除库存");
  PP
  printf("3.显示该树");
  PPP
  printf("4.查找");
  PP
  printf("5.借阅");
  PPP
  printf("6.归还");
  PP
  printf("7.退出");
  PP
  printf("请选择: ");
  return getch();
}//显示菜单函数,返回接收的字符


void main()
{
  char c,t;
//  int x;
  int p=1;
  struct TreeNode *bth=NULL;
  printf("\n\t ********************************************************************");
  printf("\n\t    学院:计算机学院\t     专业班级:网络工程2班");
  printf("\n\t     姓名:  黎灶群  \t       学号: 200208024214");
  printf("\n\t ********************************************************************");
  printf("\n\t ********************************************************************");
  printf("\n\t ********************     欢迎进入图书管理系统    *******************");
  printf("\n\t ********************************************************************");
 while(1)
  {
  c=menu(); //显示菜单
  putch(c);
  getch();
  switch(c)  //按菜单函数返回值调用各相应函数
  {
  case '1': bth=insert(bth);
	        printf("\n\t这棵B树是:\n");
	        all(bth,p);
	    break;

  case '2': bth=del(bth);
	        printf("\n\t这棵B树是:\n");
	        all(bth,p);
	    break;

  case '3':
	    printf("\n\t这棵B树是:\n");
	    all(bth,p);
	    break;

  case '4': OutputNode(bth);
	    break;

  case '5': borrow(bth);
	    break;

  case '6': payback(bth);
	    break;

  case '7':
	    printf("\n\t你想退出吗?(y/n)");
	    t=getch();
	    if(t=='y'||t=='Y') exit(0);
	    break;
  default :break;
  }
  printf("\n\t 按任意键返回主菜单....");
  getch();
}
} 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -