📄 tushuguanguanli.txt
字号:
}
else if((o<p->keynum&&o>0&&p->ptr[o-1]->keynum==(m-1)/2&&p->ptr[o+1]->keynum==(m-1)/2)||(o==0&&p->ptr[o+1]->keynum==(m-1)/2)) /* 相邻兄弟结点中的关键字数目均等于(m-1)/2 */
{
for(j=i;j<q->keynum;j++)
{
q->key[j]=q->key[j+1];
q->ptr[j]=q->ptr[j+1];
q->ptr[j]->parent=q;
} /* 所在结点关键字移位 */
q->key[q->keynum]=p->key[o+1]; /* 双亲结点关键字下移 */
for(j=q->keynum+1;j<=m-1;j++)
{
q->key[j]=p->ptr[o+1]->key[j-q->keynum];
q->ptr[j]=p->ptr[o+1]->ptr[j-q->keynum];
q->ptr[j]->parent=q;
}
q->keynum=m-1;
q->parent=p; /* 合并兄弟结点 */
for(j=o+1;j<=p->keynum;j++)
{
p->key[j]=p->key[j+1];
p->ptr[j]=p->ptr[j+1];
p->ptr[j]->parent=p;
} /* 其余兄弟结点移位 */
p->ptr[p->keynum]->keynum=0;
p->ptr[p->keynum]->parent=p;
y=(BTree)malloc(sizeof(BTNode));
y=q;
p->keynum--;
if(p->keynum<(m-1)/2)T=Unite(T,p,y); /* 若使双亲结点关键字数目小于(m-1)/2 ,进行相应处理*/
return(T);
}
else if(o==p->keynum&&p->ptr[o-1]->keynum==(m-1)/2) /* 没有右兄弟并且左兄弟结点关键字数目为(m-1)/2 */
{
p->ptr[o-1]->key[p->ptr[o-1]->keynum+1]=p->key[o]; /* 双亲结点关键字下移 */
for(j=(m+3)/2;j<=m-1;j++)
{
p->ptr[o-1]->key[j]=q->key[j-(m-1)/2];
p->ptr[o-1]->ptr[j]=q->ptr[j-(m-1)/2];
p->ptr[o-1]->parent=p;
}
p->ptr[o-1]->keynum=m-1; /* 合并兄弟结点 */
p->ptr[o]=NULL;
y=(BTree)malloc(sizeof(BTNode));
y=p->ptr[o-1];
p->keynum--;
if(p->keynum<(m-1)/2)T=Unite(T,p,y); /* 若使双亲结点关键字数目小于(m-1)/2 ,进行相应处理*/
return(T);
}
}
}
}
}
}
}
save_name(Borrower *head) /* 保存借阅者的信息 */
{
FILE *fp;
Borrower *info;
info=head;
if((fp=fopen("Borrow.txt","wb+"))==NULL){cprintf("Cannot the file!\n");getch();}
else
while(info!=NULL)
{
fwrite(info,sizeof(Borrower),1,fp);
info=info->next;
}
fclose(fp);
}
Borrower *load_name() /* 将借阅者信息load出来 */
{
FILE *fp;
Borrower *last,*info,*head;
head=(Borrower*)malloc(sizeof(Borrower));
if((fp=fopen("Borrow.txt","rb"))==NULL){head=NULL;cprintf("Cannot the file!\n");getch();}
else{
last=(Borrower*)malloc(sizeof(Borrower));
fread(head,sizeof(Borrower),1,fp);
last=head;
while(!feof(fp))
{ info=(Borrower*)malloc(sizeof(Borrower));
if(!info){
cprintf("Out of Memory");getch();
}
if(1!=fread(info,sizeof(Borrower),1,fp)) break;
last->next=info;
last=info;
}
}
fclose(fp);
return(head);
}
FILE *saveview(FILE *fp,BTree T) /* 保存个结点信息 */
{
BTree p;
int i;
if(T->keynum!=0)
{
if(fwrite(T,sizeof(BTNode),1,fp)!=1){cprintf("file write error\n");getch();}
for(i=0;i<=T->keynum;i++)
{
p=T->ptr;
fp=saveview(fp,p);
}
}
return(fp);
}
void save(BTree T) /* 保存树的信息 */
{
FILE *fp;
if((fp=fopen("B_tree.txt","wb"))==NULL){cprintf("Cannot the file!\n");getch();}
else
fp=saveview(fp,T);
fclose(fp);
}
BTree load() /* 获取树的信息 */
{
FILE *fp;
BTree s,last;
int i;
if((fp=fopen("B_tree.txt","rb"))==NULL){cprintf("Cannot the file!\n");getch();}
else
{
s=(BTree)malloc(sizeof(BTNode));
s->keynum=0;
while(!feof(fp))
{
last=(BTree)malloc(sizeof(BTNode));
if(!last)
{cprintf("Out of memery!");getch();}
if(1!=fread(last,sizeof(BTNode),1,fp))break;
for(i=1;i<=last->keynum;i++)
{
s=InsertBTree(s,last->key);
}
}
}
fclose(fp);
return s;
}
main()
{
BTree T;
int f,tag=0,i,f2,year[12]={31,28,31,30,31,30,31,31,30,31,30};
Book k;
char sel,no[20];
Result *find;
Borrower *stu,*p,*p2;
struct date d;
int j,l;
char *menu[]={
"MAIN MENU",
"I:Insert",
"S:Search",
"Delete",
"B:Borrow",
"R:Return",
"isplay",
"k:reflush",
"Load",
"Q:exit"
};
T=(BTree)malloc(sizeof(BTNode));
T->keynum=0;
stu=(Borrower*)malloc(sizeof(Borrower));
stu=NULL;
textmode(BW80);
window(1,1,80,25);
clrscr();
textbackground(BLACK);
textcolor(WHITE);
putch(218);
for(l=1;l<15;l++)putch(196);putch(191);
for(l=1;l<25;l++)
for(j=1;j<=80;j++)
putch(179);
gotoxy(1,25);
putch(192);
for(l=1;l<15;l++)putch(196);putch(217);
window(2,2,15,24);
clrscr();
textcolor(BLUE);
gotoxy(2,2);
cprintf("%s",menu[0]);
textcolor(YELLOW);
for(l=1;l<=9;l++)
{
gotoxy(2,l+3);
cprintf("%s",menu[l]);
}
textcolor(WHITE);
window(17,1,80,25);
clrscr();
putch(218);
for(l=18;l<79;l++)putch(196);putch(191);
for(l=2;l<25;l++)
{
gotoxy(1,l);putch(179);
gotoxy(63,l);putch(179);
}
gotoxy(1,25);
putch(192);
for(l=18;l<79;l++)putch(196);putch(217);
gotoxy(1,7);
putch(195);
for(l=18;l<79;l++)putch(196);putch(180);
window(18,8,78,24);
clrscr();
while(1)
{
clrscr();
sel=getch();
switch(sel)
{
case 'i':
clrscr();
gotoxy(1,1);cprintf("Input your insert book's key:");
scanf("%d",&k.key); /* 输入书号 */
find=SearchBTree(T,k.key); /* 查找 */
if(find->tag==1) /* 已经存在,只将总库存量增加 */
{
gotoxy(1,2);cprintf("The book is exist!");
gotoxy(1,3);cprintf("The amount of this book added:");
scanf("%d",&f);
find->pt->key[find->i].total+=f;
find->pt->key[find->i].left+=f;
}
else
{
gotoxy(1,2);cprintf("the book's name:");
scanf("%s",k.bname); /* 输入书名 */
gotoxy(1,3);cprintf("the book's writer:");
scanf("%s",k.writter); /* 输入著者 */
gotoxy(1,4);cprintf("the book's total:");
cscanf("%d",&k.total); /* 输入总存量 */
k.left=k.total;
T=InsertBTree(T,k);
}
save(T);if(stu!=NULL)save_name(stu);
getch();
clrscr();
display(1,1,T,55);
getch();
break;
case 's':
clrscr();
gotoxy(1,1);cprintf("Input your searching key:");
cscanf("%d",&f); /* 输入查找图书的书号 */
find=(Result*)malloc(sizeof(Result));
find=SearchBTree(T,f);
if(find->tag==1)
{
gotoxy(1,2);cprintf("the book's key :%d",find->pt->key[find->i].key);
gotoxy(1,3);cprintf("the book's name :");cputs(find->pt->key[find->i].bname);
gotoxy(1,4);cprintf("the book's writer:%s",find->pt->key[find->i].writter);
gotoxy(1,5);cprintf("the book's left :%d",find->pt->key[find->i].left);
gotoxy(1,6);cprintf("the book's total :%d",find->pt->key[find->i].total);
}
else {gotoxy(1,2);cprintf("The key could not been found!");}
getch();
getch();
clrscr();
if(T->keynum!=0){gotoxy(1,1);cprintf("The tree is"); display(1,2,T,55);}
getch();
break;
case 'd':
clrscr();
cprintf("Input your deleted key:");
cscanf("%d",&f); /* 输入删除图书的书号 */
T=DeleteBTree(T,f);
if(T->keynum==0)cprintf("No Datas on the tree");
else
{
gotoxy(1,2);cprintf("The tree is");
display(1,3,T,55);
}
p=stu;
if(p->key.key==f){stu=p->next;}
while(p!=NULL)
{
p2=p;
p=p->next;
if(p->key.key==f){p2->next=p->next;free(p);}
}
save(T);save_name(stu);
getch();
getch();
break;
case 'b':
clrscr();
cprintf("Which book:");
scanf("%d",&f); /* 输入要借阅的图书 */
find=SearchBTree(T,f);
if(find->tag==0){gotoxy(1,2);cprintf("This book is not exist!");getch();getch();}
else if(find->pt->key[find->i].left>0)
{
find->pt->key[find->i].left--;
p=(Borrower*)malloc(sizeof(Borrower));
gotoxy(1,2);
cprintf("Your Number:");
scanf("%s",p->number); /* 输入图书证号 */
getdate(&d);
p->year=d.da_year;
p->month=d.da_mon;
p->day=d.da_day;
p->deadline=90;
p->key=find->pt->key[find->i];
p->next=NULL;
if(stu==NULL)stu=p;
else {p->next=stu->next;stu->next=p;}
gotoxy(1,3);cprintf("Borrow succeed!");
save(T);save_name(stu);getch();
}
else
{
gotoxy(1,2);
cprintf("The book has no left!\n");
getch();
}
break;
case 'r':
clrscr();
cprintf("The book's key:");
scanf("%d",&f); /* 输入归还图书的书号 */
gotoxy(1,2);cprintf("Your number:");
scanf("%s",no); /* 输入图书证号 */
p=stu;
tag=0;
if(strcmp(p->number,no)==0&&p->key.key==f){stu=p->next;find=SearchBTree(T,f);find->pt->key[find->i].left++;tag=1;save(T);save_name(stu);}
else
{
while(p!=NULL)
{
p2=p;
p=p->next;
if(strcmp(p->number,no)==0&&p->key.key==f){find=SearchBTree(T,f);find->pt->key[find->i].left++;tag=1;break;}
}
if(tag==1){p2->next=p->next;free(p);save(T);save_name(stu);}
} /* 注销借阅者 */
if(tag==0){gotoxy(1,3);cprintf("The man is not exist!");getch();}
break;
case 'p':
window(18,2,78,6);
clrscr();
cprintf("lease input your chose:");
gotoxy(1,3);cprintf("1.Display the btree");
gotoxy(1,4);cprintf("2.Display the borrower");
sel=getch();
clrscr();
window(18,8,78,24);
switch(sel){
case '1':if(T->keynum==0){gotoxy(1,1);cprintf("No Datas on the tree!");}
else display(1,1,T,55);
getch();
break;
case '2':clrscr(); /* 显示借阅者的情况 */
p=stu;
l=2;
if(p==NULL){cprintf("No borrower!");}
else{
gotoxy(1,1);cprintf("Number key bookname writer year mon day deadline");
while(p!=NULL)
{
getdate(&d);
f=0;
f2=0;
for(i=1;i<p->month;i++)
f+=year[i-1];
for(i=1;i<d.da_mon;i++)
f2+=year[i-1];
if(p->year%400==0||(p->year%4==0&&p->year%100!=0))
{if(p->month>2){f+=1;f2+=1;}}
f+=p->day;
f2+=d.da_day;
if(d.da_year!=p->year)
{
if(p->year%400==0||(p->year%4==0&&p->year%100!=0))f=366-f;
for(i=p->year+1;i<d.da_year;i++)
if(i%400==0||(i%4==0&&i%100!=0))f+=366;
else f+=365;
f+=f2;
}
else f=f2-f;
p->deadline=90-f;
gotoxy(1,l++);cprintf("%-9s%-5d%-12s%-12s%-5d%-4d%-4d%d",p->number,p->key.key,p->key.bname,p->key.writter,p->year,p->month,p->day,p->deadline);
p=p->next;
if(l==16&&p!=NULL){gotoxy(1,l);cprintf("Press any key to continue...");getch();clrscr(); gotoxy(1,1);cprintf("Number key bookname writer year mon day deadline");l=2;}
}
}
getch();
break;
}
break;
case 'k': save(T);save_name(stu);break;
case 'l': T=load();stu=load_name();display(1,1,T,55);getch();break;
case 'q': exit(1);break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -