数据结构课程设计 修道士野人问题和西文图书管理系统方案_第1页
数据结构课程设计 修道士野人问题和西文图书管理系统方案_第2页
数据结构课程设计 修道士野人问题和西文图书管理系统方案_第3页
数据结构课程设计 修道士野人问题和西文图书管理系统方案_第4页
数据结构课程设计 修道士野人问题和西文图书管理系统方案_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

./题号题目3、修道士与野人问题需求分析 n个修道士和n个野人渡河,只有一条小船,能容纳c人,两种人都会划船,建立过河方式。满足: 野人无法侵犯修道士。这就要求无论在何处,修道士的个数不得少于野人的人数〔除非修道士个数为0。设计程序模拟该过程。 程序的输入为修道士〔野人的个数以及每条船容纳人的个数。输出为判断是否可以安全渡河。如果能,则给出一个小船来回次数最少的最佳方案。 要求: 〔1用一个三元组〔x1,x2,x3表示渡河过程中各个状态。其中,x1表示起始岸上修道士个数,x2表示起始岸上野人个数,x3表示小船位置〔0——在目的岸,1——在起始岸。例如〔5,3,0表示起始岸上有5个修道士,3个野人,小船在目的岸一边。 〔2采用邻接表做为存储结构。最短路径搜索采用广度搜索法。 〔3输出最优解 若问题有解〔能渡过河去,则输出一个最佳方案。用三元组表示渡河过程中的状态,并用箭头指出这些状态之间的迁移: 目的状态←…中间状态←…初始状态。若问题无解,则给出"渡河失败"的信息。〔4求出所有的解。 2、设计2.1设计思想数据结构设计:根据题目要求,用图形结构,用邻接表来存储结点,以及结点之间的关系,同时在广度优先遍历中利用到队列。算法设计:先定义一个图利用邻接表储存结构,再举出在船上修道士和野人的所有情况,然后判断其修道士是否处于安全的状态,如果安全则将该点添加到图中,点添加完后在看两点之间是否连通如果连通则可将边添加到图中,这样就创建出了图,然后分别利用广度搜索和深度搜索来完成题目的要求。Printf1<>DFS<>2.2设计表示Printf1<>DFS<>函数调用关系图AdjLGraphMain<>AdjLGraphMain<>Printf<>BroadFSearch<>Printf<>BroadFSearch<>SeqCQueueCreat<>Connect<>Checking<>SeqCQueueCreat<>Connect<>Checking<>函数接口规则说明intSearch<AdjLGraph*G,intx,inty,intm>/*查找起始和最后的结点,其中x,y,m分别表示起始岸修道士人数,野人人数和船的状态*/intChecking<DataTypex>/*检查修道士是否安全,x表示邻接表中的一个结点*/intConnect<AdjLGraph*G,inti,intj>/*将能走通的点连接起来,i,j为图中的两个结点*/voidCreat<AdjLGraph*G>/*图的创建*/intPrint<AdjLGraphG>/*从后向前打印最短路径*/intBroadFSearch<AdjLGraphG,intu,intv>/*用广度优先遍历搜索最短路径,u表示起始结点,v表示最后的结点*/voidPrint1<AdjLGraphG>/*打印输出所有最短路径*/voidDFS<AdjLGraphG,intu,intv,intvisited[]>/*利用深度搜索找出所有最短路径,u表示起始结点,v表示最后的结点,visited[]用来标记结点是否被访问*/2.3详细设计首先是定义邻接表typedefstruct{intdaoshi;//道士intyeren;//野人intship;//船的位置}DataType;typedefstructNode//边结点的结构体{intdest;//邻接边的弧头顶点序号structNode*next;//单链表的下一个结点指针}Edge;typedefstruct{DataTypedata;//顶点数据元素intsource;//弧尾顶点序号Edge*adj;//邻接边的头指针}AdjLHeight;typedefstruct{AdjLHeighta[200];//邻接表数组intnumOfVerts;//顶点个数intnumOfEdges;//边个数}AdjLGraph;//邻接表结构体同时定义了几个全局变量,便于函数的直接利用intn,c;//修道士和野人人数为n,船能容纳人数为cintPath[200];//保存结点的后驱结点intPath1[200];//保存结点的前驱结点利用上述结构和相关函数可以构造出图,然后对图进行利用;然后在广度优先遍历搜索中用到了队列typedefstruct{intqueue[200];intrear;intfront;intcount;}SeqCQueue;最后通过主函数main调用各函数得到相关信息intmain<>{AdjLGraphG;intvisited[200];//标记结点是否被访问printf<"输入小船可装的人数:\n">;while<scanf<"%d",&c>!=EOF>{memset<Path,0,sizeof<0>>;memset<visited,0,sizeof<visited>>;memset<Path1,0,sizeof<Path1>>;N=0;printf<"输入野人或修道士的个数:\n">;scanf<"%d",&n>;AdjInitiate<&G>;Creat<&G>;v1=Search<&G,n,n,1>;v2=Search<&G,0,0,0>;if<BroadFSearch<G,v1,v2>==0>printf<"渡河失败\n">;else{printf<"输出所有最短路径的情况:\n">;DFS<G,v1,v2,visited>;printf<"共有%d种情况\n",N>;}printf<"输入小船可装的人数:\n">;}return0;}3、调试分析在进行运行的时候,曾出现了打印输出错误,经过一步一步调试,发现在插入结点的时候出现了插入错误,即没有考虑到结点后驱的改变,通过改正,重新运行检测,运行结果正确,在排版时通过一步步调试,能够使输出结果很明显的表示的船的方案。用户手册在VC下运行,很简单的输入,只需输入野人和道士的人数N和船能承载的人的个数C即可。5、测试数据及测试结果〔1输入修道士和野人的人数n=6,船能容纳的人c=2,;不能安全渡河;测试结果:输入修道士和野人人数为n=3,船能容纳的人c=2;渡河成功测试结果:输出一种最短路径输出所有最短路径输出最短路径数目:源程序清单#include<stdio.h>#include<stdlib.h>#include<string.h>#include<malloc.h>intn,c;//修道士和野人人数为n,船能容纳人数为cintPath[200];//保存结点的后驱结点intPath1[200];//保存结点的前驱结点typedefstruct{intdaoshi;//道士intyeren;//野人intship;//船的位置}DataType;typedefstructNode//边结点的结构体{intdest;//邻接边的弧头顶点序号structNode*next;//单链表的下一个结点指针}Edge;typedefstruct{DataTypedata;//顶点数据元素intsource;//弧尾顶点序号Edge*adj;//邻接边的头指针}AdjLHeight;typedefstruct{AdjLHeighta[200];//邻接表数组intnumOfVerts;//顶点个数intnumOfEdges;//边个数}AdjLGraph;//邻接表结构体voidAdjInitiate<AdjLGraph*G>//初始化{inti;G->numOfEdges=0;//图的边数G->numOfVerts=0;//顶点数for<i=0;i<200;i++>{G->a[i].source=i;G->a[i].adj=NULL;}}voidInsertVertex<AdjLGraph*G,inti,DataTypex>//插入顶点{if<i>=0&&i<200>{G->a[i].data.daoshi=x.daoshi;//修道士人数G->a[i].data.yeren=x.yeren;//野人人数G->a[i].data.ship=x.ship;//船的状态G->numOfVerts++;}elseprintf<"顶点越界\n">;}voidInsertEdge<AdjLGraph*G,inti,intj>//插入边{Edge*p;if<i<0||i>=G->numOfVerts||j<0||j>=G->numOfVerts>{printf<"参数i或j越界出错!\n">;return;}p=<Edge*>malloc<sizeof<Edge>>;//申请邻接边单链表结点空间p->dest=j;//置邻接边弧头序号p->next=G->a[i].adj;//G->a[i].adj=p;G->numOfEdges++;}voidAdjDestroy<AdjLGraph*G>//释放指针存空间{inti;Edge*p,*q;for<i=0;i<G->numOfVerts;i++>//依次释放存空间{p=G->a[i].adj;while<p!=NULL>{q=p->next;free<p>;p=q;}}}//队列typedefstruct{ intqueue[200]; intrear; intfront; intcount;}SeqCQueue;//初始化voidQueueInitiate<SeqCQueue*Q>{ Q->rear=0; Q->front=0; Q->count=0;}//非空否intQueueNotEmpty<SeqCQueueQ>{ if<Q.count!=0>return1; elsereturn0;}//入队列intQueueAppend<SeqCQueue*Q,intx>{ if<Q->count>0&&Q->rear==Q->front> { printf<"队列已满无法插入!\n">; return0; } else { Q->queue[Q->rear]=x; Q->rear=<Q->rear+1>%200; Q->count++; return1; }}//出队列intQueueDelete<SeqCQueue*Q,int*d>{ if<Q->count==0> { printf<"队列已空无数据元素出队列!\n">; return0; } else { *d=Q->queue[Q->front]; Q->front=<Q->front+1>%200; Q->count--; return1; }}//取队头数据元素intQueueGet<SeqCQueueQ,int*d>{ if<Q.count==0> { printf<"队列已空无数据元素可取!\n">; return0; } else { *d=Q.queue[Q.front]; return1; }}//查找起始和最后的结点intSearch<AdjLGraph*G,intx,inty,intm>{ inti; for<i=0;i<G->numOfVerts;i++> if<G->a[i].data.daoshi==x&&G->a[i].data.yeren==y &&G->a[i].data.ship==m> returni; return-1;}intChecking<DataTypex>//检查修道士是否安全{ if<<x.daoshi>=x.yeren||x.daoshi==0>&&<<n-x.daoshi>>=<n-x.yeren>||x.daoshi==n>&& x.daoshi>=0&&x.daoshi<=n&&x.yeren>=0&&x.yeren<=n> return1; elsereturn0;}//将能走通的点连接起来intConnect<AdjLGraph*G,inti,intj>{intm; m=<G->a[i].data.daoshi-G->a[j].data.daoshi>+<G->a[i].data.yeren-G->a[j].data.yeren>;if<G->a[i].data.ship==0&&G->a[j].data.ship==0||G->a[i].data.ship==1&&G->a[j].data.ship==1> return0;//两个结点都在此岸或都在对岸,不连通elseif<G->a[i].data.ship==1&&G->a[j].data.ship==0>//从起始岸到目的岸人数要减少{ if<G->a[j].data.daoshi>G->a[i].data.daoshi||G->a[j].data.yeren>G->a[i].data.yeren> //如果J结点的道士或野人的个数比开始船没从I开到J时还大时 return0; if<G->a[j].data.daoshi==G->a[i].data.daoshi&&G->a[j].data.yeren==G->a[i].data.yeren> return0; if<m>c>return0;//船上的人超重 return1;} elseif<G->a[i].data.ship==0&&G->a[j].data.ship==1> { //从终点到起始最后人应该有所增加 if<G->a[j].data.daoshi<G->a[i].data.daoshi||G->a[j].data.yeren<G->a[i].data.yeren> //如果J结点的道士或野人的个数比开始船没从I开到J时还小时 return0; if<G->a[j].data.daoshi==G->a[i].data.daoshi&&G->a[j].data.yeren==G->a[i].data.yeren> return0; if<<-1>*m>n>return0;//船上的人超重 return1; }return0;}//创建图voidCreat<AdjLGraph*G>{ inti,j,k,m; m=0; DataTypex; for<k=0;k<=1;k++>//船有两种情况,在对岸和在起始岸 { for<i=0;i<=n;i++> for<j=0;j<=n;j++> {x.daoshi=i; x.yeren=j; x.ship=k;if<Checking<x>==1> { InsertVertex<G,m,x>; m++; } } }for<i=0;i<G->numOfVerts;i++> for<j=0;j<G->numOfVerts;j++> if<Connect<G,i,j>> { InsertEdge<G,i,j>; }}intN;//渡河成功的总次数intM;//最短路径intv1;//起始点intv2;//终点//从后向前打印最短路径intPrint<AdjLGraphG>{ intk,i=0; printf<"<%d%d%d><",G.a[v2].data.daoshi,G.a[v2].data.yeren,G.a[v2].data.ship>; for<k=Path1[v2];k!=v1;k=Path1[k]> { i++; printf<"<%d%d%d><",G.a[k].data.daoshi,G.a[k].data.yeren,G.a[k].data.ship>; }printf<"<%d%d%d>\n",G.a[v1].data.daoshi,G.a[v1].data.yeren,G.a[v1].data.ship>; returni;}//用广度优先遍历搜索最短路径intBroadFSearch<AdjLGraphG,intu,intv>{Edge*p;intvisit[200];//标记点是否被访问intw,z;memset<visit,0,sizeof<visit>>;//对数组visit[200]清零SeqCQueueQ;visit[u]=1;QueueInitiate<&Q>;QueueAppend<&Q,u>;while<QueueNotEmpty<Q>>{ QueueDelete<&Q,&w>; p=G.a[w].adj; while<p!=NULL> {z=p->dest; if<z==v> {Path1[z]=w;//保存前驱 printf<"输出一种最短路径的情况\n">; M=Print<G>; return1; } elseif<!visit[z]>//结点j未被访问过 {Path1[z]=w; visit[z]=1;QueueAppend<&Q,z>; } p=p->next; }}return0;}voidPrint1<AdjLGraphG>{ intk,j; inti=0; DataTypea1[200];memset<a1,0,sizeof<a1>>; for<k=Path[v1];k!=v2;k=Path[k]> { a1[0]=G.a[v1].data; a1[i+1]=G.a[k].data; i++; } if<i==M> {a1[i+1]=G.a[v2].data; N++; printf<"<%d%d%d>",G.a[v1].data.daoshi,G.a[v1].data.yeren,G.a[v1].data.ship>; for<j=1;j<=M+1;j++> { printf<"--><%d%d>--><%d%d%d>",abs<a1[j].daoshi-a1[j-1].daoshi>,abs<a1[j].yeren-a1[j-1].yeren>,a1[j].daoshi,a1[j].yeren,a1[j].ship>; } printf<"\n">; }}//利用深度搜索找出所有最短路径voidDFS<AdjLGraphG,intu,intv,intvisited[]>{ Edge*p; intw; visited[u]=1; p=G.a[u].adj; while<p!=NULL> { w=p->dest; if<w==v> { Path[u]=w;//记下当前结点的后驱 Print1<G>; } elseif<visited[w]==0>{ Path[u]=w; //找后驱,保存下来 DFS<G,w,v,visited>; } p=p->next; } visited[u]=0;}intmain<>{ AdjLGraphG; intvisited[200];//标记结点是否被访问 printf<"输入小船可装的人数:\n">; while<scanf<"%d",&c>!=EOF> { memset<Path,0,sizeof<0>>; memset<visited,0,sizeof<visited>>; memset<Path1,0,sizeof<Path1>>; N=0; printf<"输入野人或修道士的个数:\n">; scanf<"%d",&n>; AdjInitiate<&G>;Creat<&G>; v1=Search<&G,n,n,1>; v2=Search<&G,0,0,0>;if<BroadFSearch<G,v1,v2>==0> printf<"渡河失败\n">; else{ printf<"输出所有最短路径的情况:\n">;DFS<G,v1,v2,visited>; printf<"共有%d种情况\n",N>; }printf<"输入小船可装的人数:\n">; } return0;}题号题目6、西文图书管理系统需求分析图书管理基本业务活动包括:对一本书的采编入库、清除库存、借阅和归还等等。试设计一个图书管理系统,将上述业务活动借助于计算机系统完成。要求:〔1每种书的登记容至少包括书号、书名、著者、现存量和总库存量等五项。〔2作为演示系统,不必使用文件,全部数据可以都在存存放。要用B-树〔4阶树对书号建立索引,以获得高效率。〔3系统应有以下功能:采编入库、清除库存、借阅、归还、显示〔以凹入表的形式显示等。2、设计2.1设计思想数据结构设计:本题要求用B_树来进行存储,其逻辑结构为树形结构,B_树有利于关键字的查找,是一种平衡多叉排序树。算法设计:将比关键字小的元素插到该关键字的左孩子结点中,比关键字大的的元素插到该关键字的右孩子结点中,当一个结点中关键字的个数超过规定的个数时,该节点要进行分裂,并且保证所有的叶子结点都在同一层。2.2设计表示函数调用关系图InsertNode<>B-树Inputku<>InsertNode<>B-树Inputku<>SearchBTree<>SearchBTree<>Lookku<>Lookku<>Lend<>Lend<>Main〔Main〔Returnbook<>Returnbook<>Exit<0>Clearku<>Output<>Exit<0>Clearku<>Output<>〔2函数接口规则说明voidSetNull<BTree&p>/*设结点中的指针向量为空*/intSearchNode<BTreep,KeyType*k>/*在结点中查找关键字,k为所要查找的关键字*/ResultSearchBTree<BTreet,KeyType*k>/*在B-树中查找关键字k,返回值是该关键字的状态*/voidcpy<KeyType*p,KeyType*q>/*将q的值赋给p*/voidInsertInNode<BTree&q,inti,KeyType*k,BTreept>/*在结点q中插入关键字k和指针pt*/voidSplit<BTreep,BTree&q>/*分裂结点p,将新结点存放在q中*/voidInsertBTree<BTree&t,KeyType*k,BTreeq,inti>/*在树t中的q结点的第i个位置插入关键字k*/voidInsertNode<BTree&t,KeyType*key>/*在树t中插入关键字*/2.3详细设计此处难点在于B_树的结点的分裂,当插入结点时,判断结点中关键字的个数是否>规定的个数,如果大于则要对此结点进行分裂,在分裂时,要改变孩子结点的parent指针,并且把分裂出的关键字放到该关键字的parent结点中,然后继续判断是否要分裂,一直到符合要求。在输出B_树时,用凹入法打印输出,将编号的B_树用以存储图书即可。主要用到的结构体是下面三个首先是用一个结构来存储关键字的信息typedefstruct{charname[20];//书名charauther[30];//作者longbooknum;//书号intallstore;//书的库存intsign;//用以计算是否借出的标志}book;//书的结构体然后定义B-树typedefstructBTNode{intkeynum;//结点中关键字的个数structBTNode*parent;//结点的双亲结点KeyTypekey[m+1];//结点中的关键字structBTNode*ptr[m+1];//孩子结点数组}BTNode,*BTree;//B_树结构体再用一个结构体来表示关键字的各种状态typedefstruct{BTNode*pt;inti;//表示关键字位置inttag;//判断关键字是否存在}Result;//用以记录结果的结构接着是与这些结构相关的函数,通过这些函数可以实现题目要求的相关功能。3、调试分析在进行检测时,出现了分裂时的错误,就是没有考虑到在分裂结点时,该结点的孩子结点的parent指针的改变,通过调试和改正,测试正确。4、用户手册在VC下运行,输入数据时按照提示的容进行输入即可。测试数据及测试结果运行时,初始显示数据输入‘1’时,进行图书入库操作输入‘2’时查询图书库存〔4输入‘3’借阅图书输入‘4’归还图书输入‘5’显示所有图书输入‘6’清除库存输入‘0’退出;源程序清单#include<stdio.h>#include<malloc.h>#include<string.h>typedefstruct{charname[20];//书名charauther[30];//作者longbooknum;//书号intallstore;//书的库存intsign;//用以计算是否借出的标志}book;//书的结构体typedefbookKeyType;#defineFALSE0#defineTRUE1#definem4typedefstructBTNode{intkeynum;//结点中关键字的个数structBTNode*parent;//结点的双亲结点KeyTypekey[m+1];//结点中的关键字structBTNode*ptr[m+1];//孩子结点数组}BTNode,*BTree;//B_树结构体typedefstruct{BTNode*pt;inti;//表示关键字位置inttag;//判断关键字是否存在}Result;//用以记录结果的结构体//设结点中的指针向量为空voidSetNull<BTree&p>{inti=0;while<i<=p->keynum>{p->ptr[i]=NULL;i++;}}//在结点中查找关键字intSearchNode<BTreep,KeyType*k>{inti=1;while<i<=p->keynum>{if<k->booknum<p->key[i].booknum>returni-1;i++;}returni-1;}//在B_树中查找关键字kResultSearchBTree<BTreet,KeyType*k>{BTreep=t,q=NULL;boolfound=FALSE;//表示是否找到关键字inti=0;Resultresult;while<p&&!found>{i=SearchNode<p,k>;if<i>0&&p->key[i].booknum==k->booknum>found=TRUE;else{q=p;p=p->ptr[i];}}if<found>{result.pt=p;result.i=i;result.tag=1;}else{result.pt=q;result.i=i;result.tag=0;}returnresult;}//赋值函数voidcpy<KeyType*p,KeyType*q>{p->allstore=q->allstore;strcpy<p->auther,q->auther>;p->booknum=q->booknum;strcpy<p->name,q->name>;p->sign=q->sign;}//在结点中插入新的关键字k和指针ptvoidInsertInNode<BTree&q,inti,KeyType*k,BTreept>{intj;for<j=q->keynum;j>i;j-->cpy<&<q->key[j+1]>,&<q->key[j]>>;//大于要插入关键字的关键字向后移cpy<&<q->key[j+1]>,k>;//将关键字k插入i+1的位置for<j=q->keynum;j>i;j-->//关键字位置变化的同时其指针的值也发生改变q->ptr[j+1]=q->ptr[j];q->ptr[j+1]=pt;//孩子结点也随之改变if<pt>{pt->parent=q;}q->keynum++;}//分裂结点p,q用来存放新结点voidSplit<BTreep,BTree&q>{ints=m%2==0?m/2-1:m/2,i,j=0,t;p->keynum=s;q=<BTree>malloc<sizeof<BTNode>>;SetNull<q>;for<i=s+2;i<=m;i++>//分裂成独立的结点{q->ptr[j]=p->ptr[i-1];cpy<&<q->key[++j]>,&<p->key[i]>>;}q->ptr[j]=p->ptr[i-1];q->keynum=j;for<t=s+1;t<=m;t++>{if<p->ptr[t]!=NULL>p->ptr[t]->parent=q;}}//在q结点第i个位置插入关键字voidInsertBTree<BTree&t,KeyType*k,BTreeq,inti>{BTreeap=NULL,root;//ap表示分裂出来的结点boolfinish=FALSE;//表示是否插入成功ints;KeyType*x;x=<KeyType*>malloc<sizeof<KeyType>>;cpy<x,k>;while<q&&!finish>{InsertInNode<q,i,x,ap>;if<q->keynum<m>finish=TRUE;else//q结点有m-1个关键字{s=m%2==0?m/2:m/2+1;Split<q,ap>;cpy<x,&<q->key[s]>>;//中间数据元素向上插入到双亲结点中q=q->parent;if<q>i=SearchNode<q,x>;//查找中间元素插入的位置}}if<!finish>//进行到了根结点的分裂{root=<BTree>malloc<sizeof<BTNode>>;SetNull<root>;cpy<&<root->key[1]>,x>;root->ptr[0]=t;root->ptr[1]=ap;root->keynum=1;root->parent=NULL;if<t>t->parent=root;if<ap>ap->parent=root;t=root;}}//在B_树中插入一个关键字voidInsertNode<BTree&t,KeyType*key>{Resultresult;result=SearchBTree<t,key>;if<!result.tag>//关键字不存在,插入{InsertBTree<t,key,result.pt,result.i>;}}//图书采编入库voidInputku<BTree*r>{bookb;Resultre;printf<"按照书号书名作者库存量的顺序输入书的信息,当输入书号-1时结束:\n">;while<1>{ scanf<"%d",&b.booknum>;if<b.booknum<0>break; scanf<"%s%s%d",&,&b.auther,&b.allstore>;b.sign=b.allstore;//表示该书没有被借出re=SearchBTree<*r,&b>;if<re.tag==0>InsertNode<*r,&b>;else{re.pt->key[re.i].allstore+=b.allstore;re.pt->key[re.i].sign+=b.sign;}}}//借阅图书voidlend<BTree*r>{bookb;intk;Resultre;printf<"输入所借书的书号:">; scanf<"%d",&b.booknum>;if<b.booknum<0>{printf<"输入错误!\n">;return;} printf<"输入所借书的数量:">; scanf<"%d",&k>;re=SearchBTree<*r,&b>;if<re.tag==0>printf<"抱歉,没有此书!\n">;else{if<re.pt->key[re.i].allstore>=k>re.pt->key[re.i].allstore-=k;elseprintf<"该书库存不够!\n">;if<re.pt->key[re.i].sign==0>printf<"此书以清除库存,请采编入库!\n">; if<re.pt->key[re.i].allstore>=0&&re.pt->key[re.i].sign>0>printf<"借书成功\n">;}}//查看库存voidlookku<BTreer>{ bookb;Resultre;printf<"请输入你要查找的书的信息<书号,名字,作者>:">;scanf<"%d",&b.booknum>;if<b.booknum<0>{printf<"输入错误!\n">;return;} scanf<"%s%s",&,&b.auther>;re=SearchBTree<r,&b>;if<re.tag==0>printf<"没有此图书!\n">;elseprintf<"此书库存为:%d\n\n",re.pt->key[re.i].allstore>;}//归还图书voidreturnbook<BTree*r>{bookb;intk;Resultre;printf<"请输入归还的书的书号:">;scanf<"%d",&b.booknum>;if<b.booknum<0>{printf<"输入错误!">;return;}printf<"输入归还的本数:">; scanf<"%d",&k>;re=SearchBTree<*r,&b>;if<re.tag==0>printf<"没有此图书!\n">;elsere.pt->key[re.i].allstore+=k; printf<"归还成功!\n">;}//显示所有图书voidoutput<BTreer,intn>{inti=1,j;if<r==NULL>return;while<i<=r->keynum>{output<r->ptr[i-1],n+1>;for<j=0;j<n;j++>printf<"">;if<n>=0>{printf<"">;printf<"书号:%d,书名:%s,作者:%s,库存:%d",r->key[i].booknum,r->key[i].name,r->key[i].auther,r->key[i].allstore>;if<r->key[i].sign==0>printf<">此书以清除库存!\n">;elseprintf<"\n\n">;}i++;}output<r->ptr[i-1],n+1>;}//清除库存voidclearku<BTree*r>{bookb;Resultre;printf<"请输入你要清除库存的书的信息<书号,名字,作者>:">; scanf<"%d",&b.booknum>;if<b.booknum<0>{printf<"输入错误!">;return;} scanf<"%s%s",&,&b.auther>;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论