数据结构课程设计c
㈠ 求数据结构课程设计 马踏棋盘 C语言
没看见你说的是非递归的。
其实我也不懂,碰巧知道答案,在上下的。 不能插图。
9.3 马踏棋盘(1)
【题目要求】
国际象棋的棋盘为8*8的方格棋盘。现将"马"放在任意指定的方格中,按照"马"走棋的规则将"马"进行移动。要求每个方格只能进入一次,最终使得"马"走遍棋盘的64个方格。编写一个C程序,实现马踏棋盘操作,要求用1~64这64个数字标注马移动的路径,也就是按照求出的行走路线,将数字1,2,……64依次填入棋盘的方格中,并输出。
国际象棋中,"马"的移动规则如图9-4所示。
图9-4 "马"的移动规则
如图9-4所示,图中实心的圆圈代表"马"的位置,它下一步可移动到图中空心圆圈标注的8个位置上,该规则叫做"马走日"。但是如果"马"位于棋盘的边界附近,它下一步可移动到的位置就不一定有8个了,因为要保证"马"每一步都走在棋盘中。
【题目分析】
马踏棋盘的问题其实就是要将1,2,…,64填入到一个8*8的矩阵中,要求相邻的两个数按照"马"的移动规则放置在矩阵中。例如数字a放置在矩阵的(i,j)位置上,数字a+1只能放置在矩阵的(i-2,j+1),(i-1,j+2),(i+1,j+2),(i+2,j+1),(i+2,j-1),(i+1,j-2),(i-1,j-2),(i-2,j-1)之中的一个位置上。将矩阵填满并输出。这样在矩阵中从1,2…遍历到64,就得到了马踏棋盘的行走路线。因此本题的最终目的是输出一个8*8的矩阵,在该矩阵中填有1,2…64这64个数字,相邻数字之间遵照"马走日"的规则。
解决马踏棋盘问题的一种比较容易理解的方法是应用递归的深度优先搜索的思想。因为"马"每走一步都是盲目的,它并不能判断当前的走步一定正确,而只能保证当前这步是可走的。"马"走的每一步棋都是从它当前位置出发,向下一步的8个位置中的1个行走(在它下一步有8个位置可走的情况下)。因此"马"当前所走的路径并不一定正确,因为它可能还有剩下的可选路径没有尝试,如图9-5所示。
图9-5 "马"的可选路径
如图9-5所示,假设最开始"马"位于棋盘的(0,0)的位置,接下来"马"有两处位置可走,即(1,2)和(2,1)。这时"马"是无法确定走2的位置最终是正确的,还是走3的位置最终是正确的。因此"马"只能任意先从一个路径走下去(例如从2的位置)。如果这条路是正确的,那当然是幸运的,如果不正确,则"马"要退回到第一步,继续从3的位置走下去。以后"马"走的每一步行走都遵循这个规则。这个过程就是一种深度搜索的过程,同时也是一种具有重复性操作的递归过程。可以用一棵"探索树"来描述该深度优先搜索过程,如图9-6所示。
图9-6 深度优先搜索过程
"马"的行走过程实际上就是一个深度探索的过程。如图9-6所示,"探索树"的根结点为"马"在棋盘中的初始位置(这里用4*4的棋盘示意)。接下来"马"有两种行走方式,于是根结点派生出两个分支。而再往下一步行走,根结点的两个孩子又能够分别派生出其他不同的"行走路线"分支,如此派生下去,就得到了"马"的所有可能的走步状态。可以想见,该探索树的叶子结点只可能有两种状态:一是该结点不能再派生出其他的"走步"分支了,也就是"马"走不通了;二是棋盘中的每个方格都被走到,即"马"踏遍棋盘。于是从该探索树的根结点到第二种情况的叶结点构成的路径就是马踏棋盘的行走过程。
如何才能通过搜索这棵探索树找到这条马踏棋盘的行走路径呢?可以采用深度优先搜索的方法以先序的方式访问树中的各个结点,直到访问到叶结点。如果叶结点是第二种情况的叶结点,则搜索过程可以结束,因为找到了马踏棋盘的行走路径;如果叶结点为第一种情况的叶结点,即走不通了,则需要返回到上一层的结点,顺着该结点的下一条分支继续进行深度优先搜索下去。
因此在设计"马踏棋盘"的算法时可以借鉴前面讲过的图的深度优先遍历算法和二叉树的先序遍历算法。但是在这里并不需要真正地构建这样一棵探索树,我们只需要借用探索树的思想。在实际的操作过程中,所谓的探索树实际就是深度优先搜索的探索路径,每个结点实际就是当前的棋盘状态,而所谓的叶结点要么就是在当前棋盘状态下,"马"无法再进行下一步行走;要么就是马踏棋盘成功。该算法描述可如下:
int TravelChess Board (int x,int y,int tag)
{
chess[x][y] = tag;
if(tag == 64) { return 1;}
找到"马"的下一个行走坐标(x1,y1),如果找到返回flag=1,否则返回flag=0;
while(flag ){
if(TravelChessBoard (x1,y1,tag+1))return 1; /*递归调用TravelChess , 从x1,y1向下搜索;如果从 x1,y1往下马踏棋盘成功,返回1*/
else
继续找到"马"的下一个行走坐标(x1,y1),如果找到返回flag=1,否则返回flag=0;
}
if(flag == 0)
chess[x][y] = 0;
return 0;
}
9.3 马踏棋盘(2)
http://book.51cto.com 2010-03-17 08:57 杨峰 清华大学出版社 我要评论(0)
摘要:《妙趣横生的算法(C语言实现)》第9章综合题,,本章将列举一些经典的综合题编程实例。这些题目生动有趣,同时具有一定的难度,因此作者尽量做到讲解深入浅出,把问题讲透彻,讲清楚。同时希望读者能从中得到启发,启迪思维,提高自身的编程水平。本节为大家介绍马踏棋盘。
标签:妙趣横生 C语言实现 妙趣横生的算法(C语言实现)
Oracle帮您准确洞察各个物流环节
9.3 马踏棋盘(2)
该算法中通过函数TravelChess()递归地搜索"马"的每一种走法。其中参数x,y指定 "马" 当前走到棋盘中的位置,tag是标记变量,每走一个棋盘方格,tag自动增1,它标识着马踏棋盘的行走路线。
算法首先将当前"马"处在棋盘中的位置上添加标记tag,然后判断tag是否等于64,如果等于64,说明这是马踏棋盘的最后一步,因此搜索成功,程序应当结束,返回1。否则,找到"马"下一步可以走到的位置(x1,y1),如果找到这个位置坐标,flag置1,否则flag置0。
下面在flag为1的条件下(即找到x1,y1),递归地调用函数TravelChess()。也就是从x1,y1指定的棋盘中的位置继续向下深度搜索。如果从x1,y1向下搜索成功,即程序一直执行下去,直到tag等于64返回1,那就说明"马"已经踏遍棋盘(马踏棋盘的过程是:先走到棋盘的(x,y)位置,再从(x1,y1)向下深度搜索,走遍全棋盘),于是搜索结束,返回1;否则继续找到"马"的下一个可以行走的坐标(x1,y1),如果找到这个位置坐标,flag置1,并从(x1,y1)向下重复上述的递归搜索,否则flag置0,本次递归结束。
如果找遍当前位置(x,y)的下一个坐标(x1,y1)(一般情况是8种),但是从(x1,y1)向下继续深度优先搜索都不能成功地"马踏棋盘"(此时flag等于0),则表明当前所处的状态并不处于马踏棋盘的"行走路径"上,也就是说"马"本不应该走到(x,y)的位置上,因此将chess[x][y]置0,表明棋盘中该位置未被走过(擦掉足迹),同时返回0,程序退到上一层的探索状态。
这里应当知道,所谓当前位置(x,y)的下一个坐标(x1,y1)是指"马"下一步可以走到的地方,用坐标(x1,y1)返回。在探索树中它处在(x,y)所在的结点的子结点中,如图9-7所示。
图9-7 (x,y)的下一个坐标(x1,y1)
当前位置(x,y)的下一个坐标(x1,y1)的可选个数由当前棋盘的局面决定。一般情况下是有8种可走的位置(如图9-7所示),但是如果"马"位于棋盘的边缘(如图9-7所示的探索树的根结点)或者8个可选位置中有的已被"马"前面的足迹所占据,在这两种情况下(x1,y1)的可选个数就不是8个了。
上述搜索算法相当于先序遍历探索树,只不过它不一定是将探索树完整地遍历,而是当tag等于64时,也就是棋盘被全部"踏遍"时就停止继续搜索了。
下面给出完整的程序清单供读者参考。
程序清单9-3
/*--------------------------------- 9-3.c --------------------------*/
#include "stdio.h"
#define X 8
#define Y 8
int chess[X][Y];
int nextxy(int *x,int *y,int count) /*找到基于x、y位置的下一个可走的位置*/
{
switch(count)
{
case 0: if(*x+2<=X-1 && *y-1>=0 && chess[*x+2][*y-1]==0) {*x =*x+2;*y = *y-1;return 1; } break;
case 1: if(*x+2<=X-1 && *y+1<=Y-1 && chess[*x+2][*y+1]==0) {*x = *x+2; *y = *y+1 ;
return 1;}break;
case 2: if(*x+1<=X-1 && *y-2>=0 && chess[*x+1][*y-2]==0) {*x = *x+1; *y = *y-2; return 1;} break;
case 3: if(*x+1<=X-1 && *y+2<=Y-1 &&chess[*x+1][*y+2]==0) {*x = *x+1; *y = *y+2;
return 1;}break;
case 4: if(*x-2>=0 && *y-1>=0 && chess[*x-2][*y-1]==0) {*x = *x-2; *y = *y-1; return 1;} break;
case 5: if(*x-2>=0 && *y+1<=Y-1 && chess[*x-2][*y+1]==0){*x = *x-2; *y = *y+1; return 1;} break;
case 6:if(*x-1>=0 && *y-2>=0 && chess[*x-1][*y-2]==0) {*x = *x-1; *y = *y-2;return 1;}break;
case 7: if(*x-1>=0 && *y+2<=Y-1 && chess[*x-1][*y+2]==0) {*x = *x-1; *y = *y+2;
return 1;}break;
default: break ;
}
return 0;
}
int TravelChessBoard(int x,int y,int tag) /*深度优先搜索地"马踏棋盘"*/
{
int xx1 = x, yy1 = y, flag = 0,a,b ,count = 0 ;
chess[x][y] = tag;
if(tag == X*Y) { return 1;}
flag = nextxy(&x1,&y1,count);
while(flag == 0 && count <7){
countcount = count + 1;
flag = nextxy(&x1,&y1,count);
}
while(flag ){
if(TravelChessBoard(x1,y1,tag+1))return 1;
xx1 = x;yy1 = y;
countcount = count +1;
flag = nextxy(&x1,&y1,count); /*寻找下一个(x,y)*/
while(flag == 0 && count <7){ /*循环地寻找下一个(x,y)*/
countcount = count + 1;
flag = nextxy(&x1,&y1,count);
}
}
if(flag == 0)
chess[x][y] = 0;
return 0;
}
main()
{
int i,j;
for(i=0;i<X;i++)
for(j=0;j<Y;j++)
chess[i][j] = 0;
if(TravelChessBoard(2,0,1)) {
for(i=0;i<X;i++) {
for(j=0;j<Y;j++)
printf("%d ",chess[i][j]);
printf("\n");
}
printf("The horse has travelled the chess borad\n");
}
else
printf("The horse cannot travel the chess board\n");
getche();
}
9.3 马踏棋盘(3)
http://book.51cto.com 2010-03-17 08:57 杨峰 清华大学出版社 我要评论(0)
摘要:《妙趣横生的算法(C语言实现)》第9章综合题,,本章将列举一些经典的综合题编程实例。这些题目生动有趣,同时具有一定的难度,因此作者尽量做到讲解深入浅出,把问题讲透彻,讲清楚。同时希望读者能从中得到启发,启迪思维,提高自身的编程水平。本节为大家介绍int nextxy(int *x,int *y,int count)。
标签:妙趣横生 C语言实现 妙趣横生的算法(C语言实现)
Oracle帮您准确洞察各个物流环节
9.3 马踏棋盘(3)
【程序说明】
本程序中应用二维数组chess[8][8]作为8*8的棋盘,"马"每走到棋盘的(i,j)处,就将当前的步数tag赋值给chess[i][j]。为了方便起见,将数组chess设置为外部变量。另外定义字符常量X,Y,它规定棋盘的大小。本程序清单中将X和Y都设置为8。
函数TravelChessBoard()是上述马踏棋盘算法的具体实现。本程序中初始的(x,y)位置为(2,0),说明"马"从chess[8][8]的chess[2][0]位置开始进行"马踏棋盘"的。在函数TravelChessBoard()中要调用函数nextxy()。
int nextxy(int *x,int *y,int count)
函数nextxy()包含3个参数:x和y为传递下来的"马"当前踏到棋盘上的位置,它是指针变量。变量count的作用是标记调用nextxy()过程的次数,根据count值的不同,返回基于(x,y)的下一个不同的坐标,以此来避免返回同一个坐标,真正实现寻找"针对当前位置(x,y)的下一个位置"的目的。函数nextxy()的作用是找到"马"当前的位置(x,y)的下一个可以行走的位置,并通过指针修改x、y的内容,将下一个位置坐标用变量x、y返回。
"寻找(x,y)的下一个位置坐标"的操作通过代码:
xx1 = x; yy1 = y; /*将坐标(x1,y1)初始化为当前访问的坐标 (x,y),因为(x,y)不能被改动*/
flag = nextxy(&x1,&y1,count); /*寻找(x,y)下一个位置坐标(x1,y1)*/
while(flag == 0 && count <7){ /*循环地寻找(x,y)的下一个坐标*/
countcount = count + 1;
flag = nextxy(&x1,&y1,count);
}
实现。程序最开始将(x1,y1)初始化为当前坐标(x,y),因为"马"的当前位置坐标(x,y)不能被轻易改动。然后将&x1、&y1作为函数nextxy的参数传递,并通过参数&x1和&y1返回当前坐标(x,y)的第count个下一个坐标(x1,y1)。只有当flag为1时,才表明找到了下一个坐标,于是循环可以停止。但是如果count的值超过了7,则说明无法找到(x,y)的下一个坐标,也就说明棋走不通了。所谓当前位置(x,y)的"下一个位置",如图9-8所示。
(点击查看大图)图9-8 (x,y)的"下一个位置"示意
图中实心的圆圈的坐标为(x,y),它周围的8个空心的圆圈1~8,为当前坐标(x,y)的可选的"下一个"坐标(x1,y1)。每次调用nextxy()都可能得到这8个坐标其中的一个,当参数count为i时,返回圆圈i所处的坐标。这样就保证了不返回同一个坐标。
如果像本程序这样将字符常量X和Y都设置为8,那么程序就执行8*8的马踏棋盘。但是这样一来会非常费时,实践证明应用本程序运算出8*8的马踏棋盘的结果要花几分钟的时间。因此读者在调试程序时可以通过设置X和Y的值减小棋盘的规格,从而更快地得到结果。
本程序的运行结果如图9-9所示。
(点击查看大图)图9-9 程序9-3的运行结果
㈡ c语言数据结构课程设计 顺序表源码
我帮你做好!
㈢ c语言 数据结构课程设计 图书管理系统
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//
#define MAXSIZE 100 //最大值定义为100
#define LIST_INIT_SIZE 100//图书证使用者最大值定义为100
//借书人的结构体
typedef struct Boro//借书行为
{
char BNum[20];//借书的书号
char RetDate[8];//归还日期
struct Boro *next;
}Bor;
typedef struct LinkBook
{
Bor *next; //该图书证的借书行为
char CNum[20]; //卡号
int Total; //借书的数量
}lend[LIST_INIT_SIZE];//借书人数组
//图书的结构体信息
typedef struct LNode
{
char CardNum[20];//图书证号
struct LNode *next;
}LinkList; //借书人
typedef struct book
{//每种图书需要登记的内容包括书号ISBN、书名、作者、出版社、总库存量和现库存量。
char num[20];//书号
char name[20];//书名
char auth[20];//作者
char pub[20];//出版社
int TotNum;//总库存
int NowNum;//现库存
LinkList *next;//借了该书的人
}ook[MAXSIZE];
//
int Retotal;//读者数量
int total; //定义外部变量.书的种类数
//
//结构体初始化
void InitBo(ook &boo) //初始化图书信息
{
for(int i=0;i<MAXSIZE;i++)
{
boo[i].NowNum=0;
boo[i].TotNum=0;
boo[i].next=NULL;
}
}
void InitRe(lend &Lin) //初始化借阅者信息
{
for(int i=0;i<LIST_INIT_SIZE;i++)
Lin[i].next=NULL;
}
//
int mid=0;//外部函数mid,用来返回查找到的位置
bool BinarySearch(ook boo,char SearchNum[]) //二分法查找比较书号
{ //用bool函数,但由于函数不能有两个返回值,所以设置一个外部变量mid,用来返回查找到的位置
int low=0,high=total-1;
int found=0;
while(low<=high)
{
mid=(low+high)/2; //中间点
if(strcmp(boo[mid].num,SearchNum)==0) //书号相同
{
found=1;
return true;
}//查找成功
if(strcmp(boo[mid].num,SearchNum)!=0)//书号不同
high=mid-1;
else low=mid+1;
}
if(found==0)
return false; //查找失败
}
void Buy(ook &boo, char BuyNum[])
{//1、 采编入库:新购入一种书,如果该书在图书账目中已经存在,则将其库存量增加(包
//括总库存量和现库存量),如果该书不存在,则在图书账目中增加一种书,总库存量和现库存量均为1。
if(BinarySearch(boo,BuyNum)) //如果书库中有此书
{
boo[mid].TotNum++; //总库存加1
boo[mid].NowNum++; //现库存加1
printf("入库成功.\n");
printf("已更改书库中该书的信息。编号 %s 的书 %s 作者是 %s ,出版社是 %s ,目前的总库存是 %d ,现库存是 %d 。\n",boo[mid].num,boo[mid].name,boo[mid].auth,boo[mid].pub,boo[mid].TotNum,boo[mid].NowNum);
}
if(!BinarySearch(boo,BuyNum))
{
int i;
for(i=total;i>mid&&total;i--) //插在适合位置 保持有序
boo[i]=boo[i-1]; //空出插入位置
printf("该书在书库中不存在。设立新书目,请补全书的详细信息。\n");
strcpy(boo[i].num,BuyNum);
printf("该书购入的数量是:");
scanf(" %d",&boo[i].NowNum);
boo[i].TotNum=boo[i].NowNum;
printf("该书的名字是:");
scanf(" %s",&boo[i].name);
printf("该书的作者是:");
scanf(" %s",&boo[i].auth);
printf("该书的出版社是:");
scanf(" %s",&boo[i].pub);//补全信息
boo[i].next=NULL;
total++;//总量+1
printf("已增加该书的信息。编号 %s 的书 %s 作者是 %s ,出版社是 %s ,目前的总库存是 %d ,现库存是 %d 。\n",boo[i].num,boo[i].name,boo[i].auth,boo[i].pub,boo[i].TotNum,boo[i].NowNum);
printf("入库成功.\n");
}
}
void Delete(ook &boo,char DeleteNum[])
{//2、 清空库存:某一种书已无保留价值,将它从图书账目中注销。
if(BinarySearch(boo,DeleteNum)==false||total==0) //如果无此书
printf("书库中没有该书.\n");
if(BinarySearch(boo,DeleteNum))//若有
{
if(!boo[mid].next)
{
int j;
for( j=mid;j<total;j++)
boo[j]=boo[j+1];
strcpy(boo[j].num,boo[j+1].num);
strcpy(boo[j].name,boo[j+1].name);
strcpy(boo[j].auth,boo[j+1].auth);
strcpy(boo[j].pub,boo[j+1].pub);
boo[j].TotNum=boo[j+1].TotNum;
boo[j].NowNum=boo[j+1].NowNum;
printf("已成功删除该书.\n");
}
else printf("该书有借阅者,无法删除。\n");
}
}
void Borrow(ook &boo,lend &Lin,char BorrowNum[],char CaNum[])
{//3、 借阅:如果一种书的现库存量大于零,则借出一本书,将现库存量减1,
//并登记借阅者的图书证号和归还期限。
Bor *p,*q;
LinkList *m,*n;
if(!BinarySearch(boo,BorrowNum)||total==0) //如果没有找到此书
printf("书库里没这书。\n");//如果有这书
if(BinarySearch(boo,BorrowNum)) //书库里有
{
if(boo[mid].NowNum>0) //看现库存是否大于0
{
boo[mid].NowNum--;//借出一本,少1
if(boo[mid].next==NULL) //若该书信息下显示该种书还没被人借过
{
m=(LinkList *)malloc(sizeof(LNode));//分配
boo[mid].next=m;//该图书信息中的链表的第一个结点
strcpy(m->CardNum,CaNum);
m->next=NULL;//后一个结点为空
}
else //如果已经有人在借这书了
{
m=boo[mid].next;
while(m->next) //遍历到最后一个结点
m=m->next;
n=(LinkList *)malloc(sizeof(LNode));//分配空间,增加1个结点
m->next=n;
strcpy(n->CardNum,CaNum);//记录证号
n->next=NULL;
}
int i=0;
for(i=0;i<Retotal;i++)//
{
if(!strcmp(Lin[i].CNum,CaNum))//如果已经有该图书证的信息
{
p=Lin[i].next;
while(p->next)p=p->next;//遍历到最后一个结点
q=(Bor *)malloc(sizeof(Boro));//分配空间
p->next=q;
strcpy(q->BNum,BorrowNum); //记录书号
printf("输入归还日期:");
scanf("%s",&q->RetDate);
q->next=NULL;
printf("借阅成功.\n");
break; //找到证了就跳出循环
}
}
if(i==Retotal)//如果没有这张证的信息
{
strcpy(Lin[i].CNum,CaNum); //记录证号
p=(Bor *)malloc(sizeof(Boro)); //分配空间
Lin[i].next=p;
strcpy(p->BNum,BorrowNum);
printf("输入归还日期:");
scanf(" %s",&p->RetDate);
p->next=NULL;
Retotal++; //借阅证号信息总数加1
printf("借阅成功.\n");
}
}
else printf("借阅失败.该书现在库存为0.\n");
}
}
void Return(ook &boo,lend &Lin,char ReturnNum[],char BorrowerNum[])
{//4、 归还:注销对借阅者的登记,改变该书的现存量。
Bor *p,*q;
LinkList *m,*n;
int flag=0;//设置一个参数
if(!BinarySearch(boo,ReturnNum)||!total) //没书
printf("书库中无此书.\n");
if(BinarySearch(boo,ReturnNum)) //有书
{
m=boo[mid].next;
if(!strcmp(m->CardNum,BorrowerNum)) //如果是第一个借的人还的
{
boo[mid].NowNum++; //现库存加1
boo[mid].next=m->next; //删除结点
free(m); //释放该结点的空间空间
}
else
{
while(m->next) //查找归还者的借阅者结点
{
if(!strcmp(m->next->CardNum,BorrowerNum)) //如果找到
{
n=m->next; //n为归还者的借阅结点
m->next=n->next; //m指向归还者的借阅结点的下一结点
free(n); //释放空间
boo[mid].NowNum++; //现库存加1
break;
}
m=m->next;
}
}
}
//在借阅者表里查找借阅者信息
for(int i=0;i<Retotal;i++)
{
if(!strcmp(Lin[i].CNum,BorrowerNum)) //如果找到借阅者
{
p=Lin[i].next;
if(!strcmp(p->BNum,ReturnNum)) //如果是归还的是借的第一本书
{
Lin[i].next=p->next; //指向下一借书结点
free(p); //释放结点空间
printf("成功归还该书.\n");
flag=1;
break;
}
else //找不到
{
while(p->next) //找到归还书的借书结点
{
if(!strcmp(p->next->BNum,ReturnNum)) //如果找到
{
q=p->next; //q为归还书的借书结点
p->next=q->next; //p指向下一借书结点
free(q); //释放空间
printf("成功归还该书.\n");
flag=1;
break;
}
p=p->next;
}
}
}
}
for(int k=0;k<Retotal;k++)
if(!Lin[k].next)
{
int j;
for(j=k;j<Retotal;j++)
Lin[j]=Lin[j+1]; //其后都往前移一位,覆盖掉当前信息
strcpy(Lin[j].CNum," "); //删除图书证号
Retotal--; //图书证数减1
} //删除当前状态下没借书的图书证的信息,节省空间
if(flag==0) printf("无该证信息.\n");
}
//5、 查找:实现按三种查询条件之一查找:按书号查找、
//按书名查找、按作者查找。注:可不实现组合查找,即几个条件组合查找。
void SearchByNum(ook &boo,char SeaNum[])
{//BY NUM 根据书号查找
LinkList *p;
p=boo[mid].next;
if(BinarySearch(boo,SeaNum)==false)printf("对不起,未找到您想查找的书。\n");//二分查找 没找到
else//找到了的话
{
{
printf("┏━━━━━━━┳━━━━━━━┳━━━━━━━━┳━━━━━━━━┳━━━━━┳━━━━━┓\n");
printf("┃ 书号 ┃ 书名 ┃ 作者 ┃ 出版社 ┃ 现库存 ┃ 总库存 ┃\n");
printf("┣━━━━━━━╋━━━━━━━╋━━━━━━━━╋━━━━━━━━╋━━━━━╋━━━━━┫\n");
printf("┃%14s┃%14s┃%16s┃%16s┃%10d┃%10d┃\n",boo[mid].num,boo[mid].name,boo[mid].auth,boo[mid].pub,boo[mid].NowNum,boo[mid].TotNum);
printf("┗━━━━━━━┻━━━━━━━┻━━━━━━━━┻━━━━━━━━┻━━━━━┻━━━━━┛\n");
if(boo[mid].next!=NULL)
{
printf("┏━━━━━━━┓\n");
printf("┃ 已借该书的 ┃\n");
printf("┃ 图书证号 ┃\n");
while(p)
{
printf("┣━━━━━━━┫\n");
printf("┃%14s┃\n",p->CardNum);
p=p->next;
}
printf("┗━━━━━━━┛\n");
}
}
while(p)
{
printf(" %s ",p->CardNum);//在按书号查找的函数里也显示借了这本书的借阅者的证号
p=p->next;
}
printf(" \n");
}//显示查找的书籍的信息
}
void SearchByName(ook &boo)
{//BY NAME 根据书名查找
char SeaName[20];
printf("输入想查找的书的书名:\n");
scanf(" %s",&SeaName);
printf("找到符合该书名的书的详细信息如下:\n");
for(int i=0;i<total;i++)
{
if(strcmp(SeaName,boo[i].name)==0)//如果书名一样
{
printf("书号:%s\n书名:%s\n作者:%s\n出版社:%s\n总库存量:%d\n现库存量:%d\n\n",boo[i].num,boo[i].name,boo[i].auth,boo[i].pub,boo[i].TotNum,boo[i].NowNum);
}//显示符合信息的所有书籍的信息
}
}
void SearchByAuth(ook &boo)
{// BY AUTH 根据作者查找
char SeaAuth[20];
printf("输入想查找的书的作者:\n");
scanf(" %s",&SeaAuth);
printf("找到符合该作者的书的详细信息如下:\n");
for(int i=0;i<total;i++)
{
if(strcmp(SeaAuth,boo[i].auth)==0)//如果作者一样
{
printf("书号:%s\n书名:%s\n作者:%s\n出版社:%s\n总库存量:%d\n现库存量:%d\n\n",boo[i].num,boo[i].name,boo[i].auth,boo[i].pub,boo[i].TotNum,boo[i].NowNum);
}//显示符合信息的所有书籍的信息
}
}
//6、 查看:可查看某图书证号的借阅者借阅的全部图书,可查看全部超期未还的图书。
void ViewCard(ook &boo,lend &Lin)
{//查看某图书证号的借阅者借阅的全部图书
char Num[20];
printf("请输入您所想要查看的图书证号:\n");
scanf(" %s",&Num);
Bor *p;
int qqq=0;
for(int i=0;i<Retotal;i++)
{
if(strcmp(Lin[i].CNum,Num)==0) //找到该证
{
printf("这个证借的书有:\n");
p=Lin[i].next;
while(p)
{
printf(" %s ",p->BNum); //书号
p=p->next;
}
printf("\n");
qqq=1;
break;
}
}
if(qqq==0)
printf("该证不存在.\n");
}
void ViewBook(ook &boo,lend &Lin)
{//查看全部超期未还的图书
char date[8];
Bor *p;
printf("请输入日期(请按格式20060605输入):\n");
scanf(" %s",&date);
printf("所有超期未还的书有:\n");
for(int i=0;i<Retotal;i++)
{
p=Lin[i].next;
while(p)//当p不空时
{
if(strcmp(p->RetDate,date)<0) //超过日期
{
printf("书号为 %s 证号为 %s 应归还日期为 %s \n",p->BNum,Lin[i].CNum,p->RetDate);
}//显示所有超期未还的书的信息
p=p->next;
}
}
}
void Menu() //菜单
{
printf("┏—————————————————M E N U————————————————┓\n");
printf("│ │\n");
printf("│ 1. 采编入库:新购入一种书,如果该书在图书账目中已经存在, │\n");
printf("│ 则将其库存量增加(包括总库存量和现库存量)。 │\n");
printf("│ 如果该书不存在,则在图书账目中增加一种书, │\n");
printf("│ 总库存量和现库存量均为输入的数字。 │\n");
printf("│ 2. 清空库存:某一种书已无保留价值,将它从图书账目中注销。 │\n");
printf("│ 3. 借阅:如果一种书的现库存量大于零,则借出一本书,将现库存量减1, │\n");
printf("│ 并登记借阅者的图书证号和归还期限。 │\n");
printf("│ 4. 归还:注销对借阅者的登记,改变该书的现存量。 │\n");
printf("│ 5. 按书号查找。 │\n");
printf("│ 6. 按书名查找。 │\n");
printf("│ 7. 按作者查找。 │\n");
printf("│ 8. 查看某图书证号的借阅者借阅的全部图书。 │\n");
printf("│ 9. 查看全部超期未还的图书。 │\n");
printf("│ 0. 退出图书管理系统。 │\n");
printf("│ │\n");
printf("┗—————————————请 选 择 你 需 要 的 操 作————————————┛\n");
}
void main()
{
ook Bo;
lend Lin;
char BNum[20];
char CNum[20];
printf("-----------------------欢 迎 进 入 图 书 管 理 系 统!---------------------------\n\n");
int choice=10;
int SearchCho=10,ViewCho=10;
while(choice!=0)
{
Menu();//显示菜单
scanf(" %d",&choice);
switch(choice)
{
case 1://采编入库
printf("请输入入库的书的书号:");
scanf(" %s",BNum);
Buy(Bo,BNum);
break;
case 2://清空库存
printf("请输入想要清除的书的书号:");
scanf(" %s",BNum);
Delete(Bo,BNum);
break;
case 3://借阅
printf("请输入想要借阅的书的书号:\n");
scanf(" %s",&BNum);
printf("请输入图书证号:");
scanf(" %s",&CNum);
Borrow(Bo,Lin,BNum,CNum);
break;
case 4://归还
printf("请输入想要归还的书的书号:\n");
scanf(" %s",&BNum);
printf("请输入图书证号:");
scanf(" %s",&CNum);
Return(Bo,Lin,BNum,CNum);
break;
case 5://查找//根据书号查找
printf("请输入书号:");//输入书号查找
scanf(" %s",&BNum);
SearchByNum(Bo,BNum);
break;
case 6://根据书名查找
SearchByName(Bo);
break;
case 7://根据作者查找
SearchByAuth(Bo);
break;
case 8://查看某图书证所借的所有书
ViewCard(Bo,Lin);
break;
case 9: //查看全部超期未还的书
ViewBook(Bo,Lin);
break;
case 0://退出系统
exit(0);break;
default:printf("输入错误!\n");exit(0);break;
}
}
}
㈣ 数据结构课程设计(C语言)
我这个和你要的差不多吧,,我做实验用的..笔视收费
#include <iostream>
#include <string.h>
#include <string> //字符串操作
#include <iomanip>
using namespace std;
#define N 50 //学生数
#define M 10 //课程数
struct student
{ char name[20];
int number;
int score[8];
}stu[60];
string kechengming[M];
void changesort(struct student a[],int n,int j)
{int flag=1,i;
struct student temp;
while(flag)
{flag=0;
for(i=1;i<n-1;i+=2)
if(a[i].score[j]<a[i+1].score[j]) /*奇数项比较*/
{temp=a[i];
a[i]=a[i+1];
a[i+1]=temp;
flag=1;
}
for(i=0;i<n-1;i+=2)
if(a[i].score[j]<a[i+1].score[j]) /*偶数项比较*/
{temp=a[i];
a[i]=a[i+1];
a[i+1]=temp;
flag=1;
}
}
}
void print(struct student a[],int n,int j)
{
int i,k;
cout<<kechengming[j]<<"前5名数据如下:"<<endl;
cout<<setw(8)<<"名次"<<setw(8)<<"学号"<<setw(8)<<"姓名"<<setw(8)<<kechengming[j]<<endl;
k=1;
for(i=0;k<=5 && i<n;i++)
{if(i>0 && a[i].score[j]!=a[i-1].score[j])
k++;
cout<<setw(8)<<k;
cout<<setw(8)<<a[i].number;
cout<<setw(8)<<a[i].name;
cout<<setw(8)<<a[i].score[j];
cout<<endl;
}
}
int main()
{
int i,j,k,n,m;
struct student temp;
cout<<"请输入学生数(最多为"<<N<<"个):";
cin>>n;
cout<<"请输入课程数(最多为"<<M-2<<"个):";
cin>>m;
kechengming[m]="sum";kechengming[m+1]="avg";
for(i=0;i<m;i++)
{cout<<"请输入第"<<i+1<<"个课程名:";
cin>>kechengming[i]; //输入课程名
}
for(i=0;i<n;i++)
{cout<<"请输入第"<<i+1<<"个同学的姓名:";
cin>>stu[i].name;
cout<<"请输入第"<<i+1<<"个同学的学号:";
cin>>stu[i].number;
for(j=0;j<m;j++)
{cout<<"请输入"<<kechengming[j]<<"的成绩:";
cin>>stu[i].score[j];
}
}
for(i=0;i<n;i++)
{stu[i].score[m]=0;
for(j=0;j<m;j++)
stu[i].score[m]+=stu[i].score[j];
stu[i].score[m+1]=stu[i].score[m]/m;
}
changesort(stu,n,m);
cout<<"学生成绩如下:"<<endl;
cout<<setw(6)<<"名次";
cout<<setw(6)<<"姓名";
cout<<setw(6)<<"学号";
for(i=0;i<m+2;i++)
cout<<setw(6)<<kechengming[i];
cout<<endl;
k=1;
for(i=0;i<n;i++)
{if(i>0 && stu[i].score[m]!=stu[i-1].score[m])
k++;
cout<<setw(6)<<k;
cout<<setw(6)<<stu[i].name;
cout<<setw(6)<<stu[i].number;
for(j=0;j<m+2;j++)
cout<<setw(6)<<stu[i].score[j];
cout<<endl;
}
j=0;
cout<<"请输入您要对第几个成绩进行排序(1~"<<m<<"):";
cin>>i;
while(i>=0 && j==0)
{ if(i>0 && i<m+1)
{
changesort(stu,n,i-1);
print(stu,n,i-1);
cout<<"请输入您要对第几个成绩进行排序:(1~"<<m<<",输入0退出)";
cin>>i;
}
else if(i==0)
j=1;
else
{cout<<"输入有误,请重新输入:";
cin>>i;
}
}
return 0;
}
㈤ C语言与数据结构课程设计求指导
你可以用结构体数组,给你一个例子:
#include <stdio.h>
//定义结构体Student,学生姓名不超过10个字符
//三门课程成绩均为百分制,只取整数;平均分带小数
struct Student
{
char name[11];
int A;
int B;
int C;
float aver;
};
int main()
{
struct Student stud[3];//定义结构体数组stud[3]
//对input()、average()、print()三个函数进行声明
void input(Student s[], int n);
void average(Student s[], int n);
void print(Student s[], int n);
//调用input()、average()、print()三个函数
input(stud,3);
average(stud,3);
print(stud,3);
return 0;
}
//定义输入n名学生的姓名、三门课程成绩的函数
void input(Student s[], int n)
{
int i;
for(i=0;i<n;i++)
{
printf("请输入第 %d 名学生数据:\n",i+1);
printf("姓 名:"); scanf("%s",s[i].name);
printf("A课程成绩:"); scanf("%d",&(s[i].A));
printf("B课程成绩:"); scanf("%d",&(s[i].B));
printf("C课程成绩:"); scanf("%d",&(s[i].C));
printf("\n");
}
}
//定义计算n名学生三门课程总分的函数
void average(Student s[], int n)
{
int i;
for(i=0;i<n;i++)
s[i].aver=(s[i].A+s[i].B+s[i].C)/3.0f;
}
//定义输出n名学生的姓名、三门课程成绩、总分的函数
void print(Student s[], int n)
{
int i;
printf("\n学生成绩列表:\n");
for(i=0;i<n;i++)
{
printf("姓名:%s, ",s[i].name);
printf("A课程成绩:%d, ",s[i].A);
printf("B课程成绩:%d, ",s[i].B);
printf("C课程成绩:%d,",s[i].C);
printf("平均分:%f。\n",s[i].aver);
}
printf("\n");
}
㈥ 跪求数据结构课程设计(C语言版)代码,感激不尽
在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚合数据类型(aggregate data type)的一类。结构体可以被声明为变量、指针或数组等,用以实现较复杂的数据结构。结构体同时也是一些元素的集合,这些元素称为结构体的成员(member),且这些成员可以为不同的类型,成员一般用名字访问。[1]
定义与声明
结构体的定义如下所示,struct为结构体关键字,tag为结构体的标志,member-list为结构体成员列表,其必须列出其所有成员;variable-list为此结构体声明的变量。[1]
struct tag {
member-list
} variable-list ;
在一般情况下,tag、member-list、variable-list这3部分至少要出现2个。以下为示例:[1]
//此声明声明了拥有3个成员的结构体,分别为整型的a,字符型的b和双精度的c
//同时又声明了结构体变量s1
//这个结构体并没有标明其标签
struct {
int a;
char b;
double c;
} s1;
//同上声明了拥有3个成员的结构体,分别为整型的a,字符型的b和双精度的c
//结构体的标签被命名为SIMPLE,没有声明变量
struct SIMPLE{
int a;
char b;
double c;
};
//用SIMPLE标签的结构体,另外声明了变量t1、t2、t3
struct SIMPLE t1, t2[20], *t3;
//也可以用typedef创建新类型
typedef struct{
int a;
char b;
double c;
} Simple2;
//现在可以用Simple2作为类型声明新的结构体变量
Simple2 u1, u2[20], *u3;
在上面的声明中,第一个和第二声明被编译器当作两个完全不同的类型,即使他们的成员列表是一样的,如果令t3=&s1,则是非法的。[1]
结构体的成员可以包含其他结构体,也可以包含指向自己结构体类型的指针,而通常这种指针的应用是为了实现一些更高级的数据结构如链表和树等。[1]
//此结构体的声明包含了其他的结构体
struct COMPLEX{
char string[100];
struct SIMPLE a;
};
//此结构体的声明包含了指向自己类型的指针
struct NODE{
char string[100];
struct NODE *next_node;
};
如果两个结构体互相包含,则需要对其中一个结构体进行不完整声明,如下所示:[1]
struct B;
//对结构体B进行不完整声明
//结构体A中包含指向结构体B的指针
struct A{
struct B *partner;
//other members;
};
//结构体B中包含指向结构体A的指针,在A声明完后,B也随之进行声明
struct B{
struct A *partner;
//other members;};
结构体作用
结构体和其他类型基础数据类型一样,例如int类型,char类型 只不过结构体可以做成你想要的数据类型。以方便日后的使用。[1]
在实际项目中,结构体是大量存在的。研发人员常使用结构体来封装一些属性来组成新的类型。由于C语言内部程序比较简单,研发人员通常使用结构体创造新的“属性”,其目的是简化运算。[1]
结构体在函数中的作用不是简便,其最主要的作用就是封装。封装的好处就是可以再次利用。让使用者不必关心这个是什么,只要根据定义使用就可以了。[1]
结构体的大小与内存对齐
结构体的大小不是结构体元素单纯相加就行的,因为我们主流的计算机使用的都是32bit字长的CPU,对这类型的CPU取4个字节的数要比取一个字节要高效,也更方便。所以在结构体中每个成员的首地址都是4的整数倍的话,取数据元素时就会相对更高效,这就是内存对齐的由来。每个特定平台上的编译器都有自己的默认“对齐系数”(也叫对齐模数)。程序员可以通过预编译命令#pragma pack(n),n=1,2,4,8,16来改变这一系数,其中的n就是你要指定的“对齐系数”。[1]
规则:
1、数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员的对齐按照#pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进行。[1]
2、结构(或联合)的整体对齐规则:在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照#pragma pack指定的数值和结构(或联合)最大数据成员长度中,比较小的那个进行。[1]
3、结合1、2可推断:当#pragma pack的n值等于或超过所有数据成员长度的时候,这个n值的大小将不产生任何效果。
㈦ 数据结构c语言版的 课程设计
一、问题描述:
利用哈夫曼编码进行信息通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(复原)。对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。试为这样的信息收发站写一个哈夫曼码的编/译码系统。
二、基本要求:
1、I:初始化(Initialization),从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树,并将它存于文件hfmTree中。
2、E:编码(Encoding),利用已建好的哈夫曼树(如不在内存,则从文件hfmTree中读人),对文件ToBeTran中的正文进行编码,然后将结果存入文件CodeFile中。
3、D:译码(Decoding),利用已建好的哈夫曼树将文件CodeFile中的代码进行译码,结果存入文件TextFile中。
4、P:输出代码文件(Print),将文件CodeFile以紧凑格式显示在终端上,每行50个代码。同时将此字符形式的编码文件写入文件CodePrin中。
5、T:输出哈夫曼树(TreePrinting),将已在内存中的哈夫曼树以直观的方式(树或凹人表形式)显示在终端上,同时将此字符形式的哈夫曼树写入文件TreePrint中。
三、测试数据:]
用下表给出的字符集和频度的实际统计数据建立哈夫曼树,并实现以下报文的编码和译码:“THIS PROGRAM IS MY FAVORITE”。
字符 A B C D E F G H I J K L M
频度 186 64 13 22 32 103 21 15 47 1 5 32 20 20
字符 N O P Q R S T U V W X Y Z
频度 57 63 15 1 48 51 80 23 8 18 1 16 1
四、实现提示:
1、哈夫曼编码采用一个字符串数组存储。
2、用户界面可以设计为“菜单”方式:显示上述功能符号,再加上“Q”,表示退出运行Quit。请用户键入一个选择功能符。此功能执行完毕后再显示此菜单,直至某次用户选择了“Q”为止。
3、在程序的一次执行过程中,第一次执行I、D或C命令之后,哈夫曼树已经在内存了,不必再读入。每次执行中不一定执行I命令,因为文件hfmTree可能早已建好。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<ctype.h>
int n;
struct node{
int w;
int flag;
char c;
struct node *plink,*llink,*rlink;
char code[50];
}*num[100],*root;
FILE *fp;
char tmpcode[50];
int t=0;
void main(void)
{
int i;
void settree(void); //建立树
void code(void); //对文件编码
void decode(void); // 译码
void disp(void);
root=(struct node*)malloc(sizeof(struct node));
puts("*******************哈夫曼编/译码器演示******************************");
while(1){
start:
puts("1. 初始化 2. 编码 3. 译码 4.显示编码表 5. 退出");
while(scanf("%d",&i)!=1)
{
while(getchar()!='\n')
continue;
puts("输入错误!");
puts("请重新输入!");
puts("1. 初始化 2. 编码 3. 译码 4.显示编码表 5. 退出");
}
switch (i)
{
case 1:
settree();
break;
case 2:
code();
break;
case 3:
decode();
break;
case 4:
disp();
break;
case 5:
exit(0);
default:
puts("输入错误!");
puts("请重新输入!");
goto start;
}
}
}
void settree(void)
{
int i,j,k;
struct node *p1,*p2,*tmp,*p;
void go(struct node *);
void setcode(struct node *);//建立每一个字符的编码
void printtree(struct node *);
puts("输入字符集的大小:");
scanf("%d",&n);
while(getchar()!='\n')
continue;
for(i=0;i<n;i++)
{
p=(struct node *)malloc(sizeof(struct node));
puts("请输入一个字符");
scanf("%c",&p->c);
while(getchar()!='\n')
continue;
puts("请输入该字符的权值:");
scanf("%d",&p->w);
while(getchar()!='\n')
continue;
p->plink=NULL;
p->rlink=NULL;
p->llink=NULL;
num[i]=p;
}
for(i=0;i<n-1;i++) //(递增)排序
{
for(j=i+1;j<n;j++)
{
if(num[i]->w>num[j]->w)
{
tmp=num[i];
num[i]=num[j];
num[j]=tmp;
}
}
}
/*******************************开始建立树***********************/
num[n]=NULL; //结束标志
k=n;
while(num[1]!=NULL)
{
p=(struct node *)malloc(sizeof(struct node));
p1=num[0];
p2=num[1];
p->llink=p1;
p->rlink=p2;
p->plink=NULL;
p1->plink=p;
p2->plink=p;
p->w=p1->w+p2->w;
for(i=1;i<k;i++)
{
num[i]=num[i+1];
}
k--;
num[0]=p;
for(i=0;i<k-1;i++) //排序
{
for(j=i+1;j<k;j++)
{
if(num[i]->w>num[j]->w)
{
tmp=num[i];
num[i]=num[j];
num[j]=tmp;
}
}
}
}
root=num[0];
/*建立完毕*/
/*写入文件,前序*/
if((fp=fopen("c:\\hfmtree.wxl","wb"))==NULL)
{
puts("文件打开错误!");
getchar();
exit(0);
}
setcode(root);
go(root);
fclose(fp);
}
void setcode(struct node *p)
{
if(p->llink==NULL&&p->rlink==NULL)
{
tmpcode[t]='\0';
strcpy(p->code,tmpcode);
}
else
{
tmpcode[t++]='0';
setcode(p->llink);
t--;
tmpcode[t++]='1';
setcode(p->rlink);
t--;
}
}
void go(struct node *p)
{
if(p->llink==NULL&&p->rlink==NULL)
{
fputc('(',fp);
fputc(p->c,fp);
fputs(p->code,fp);
fputc(')',fp);
}
else
{
go(p->llink);
go(p->rlink);
}
}
void code(void)
{
FILE *fp1,*fp2,*fp3;
char ch1,ch2,c;
if((fp1=fopen("c:\\hfmtree.wxl","rb"))==NULL)
{
puts("文件打开错误!");
getchar();
exit(0);
}
if((fp2=fopen("c:\\tobetrans.txt","wb"))==NULL)
{
puts("文件打开错误!");
getchar();
exit(0);
}
if((fp3=fopen("c:\\codefile.wxl","wb"))==NULL)
{
puts("文件打开错误!");
getchar();
exit(0);
}
while((ch1=fgetc(fp2))!=EOF)
{
t=0;
while((ch2=fgetc(fp1))!=EOF)
{
if(ch1==ch2)
{
while((c=fgetc(fp1))!=')')
{
tmpcode[t++]=c;
}
tmpcode[t]='\0';
fputs(tmpcode,fp3);
fputc('@',fp3);
rewind(fp1);
break;
}
}
}
fclose(fp1);
fclose(fp2);
fclose(fp3);
}
void decode(void)
{
FILE *fp1,*fp2,*fp3;
char ch1,ch2,ch3;
char temp_3[20];
char temp_1[20];
int t1,t3;
if((fp1=fopen("c:\\hfmtree.wxl","rb"))==NULL)
{
puts("文件打开错误!");
getchar();
exit(0);
}
if((fp2=fopen("c:\\textfile.txt","wb"))==NULL)
{
puts("文件打开错误!");
getchar();
exit(0);
}
if((fp3=fopen("c:\\codefile.wxl","rb"))==NULL)
{
puts("文件打开错误!");
getchar();
exit(0);
}
while((ch3=fgetc(fp3))!=EOF)
{
t3=0;
while(ch3!='@')
{
temp_3[t3++]=ch3;
ch3=fgetc(fp3);
}
temp_3[t3]='\0';
while((ch1=fgetc(fp1))!=EOF)
{
if(isalpha(ch1))
{
ch2=ch1;
t1=0;
while((ch1=fgetc(fp1))!=')')
{
temp_1[t1++]=ch1;
}
temp_1[t1]='\0';
if(strcmp(temp_1,temp_3)==0)
{
fputc(ch2,fp2);
rewind(fp1);
break;
}
}
}
}
fclose(fp1);
fclose(fp2);
fclose(fp3);
}
void disp(void)
{
FILE *fp1,*fp2;
char ch1,ch2;
char tmp[20];
int t;
if((fp1=fopen("c:\\hfmtree.wxl","rb"))==NULL)
{
puts("文件打开错误!");
getchar();
exit(0);
}
if((fp2=fopen("c:\\hfmcode.txt","wb"))==NULL)
{
puts("文件打开错误!");
getchar();
exit(0);
}
while((ch1=fgetc(fp1))!=EOF)
{
if(ch1=='(')
{
t=0;
ch1=fgetc(fp1);
ch2=ch1;
while((ch1=fgetc(fp1))!=')')
{
tmp[t++]=ch1;
}
tmp[t]='\0';
printf("%c-----%s\n",ch2,tmp);
fputc(ch2,fp2);
fputc('-',fp2);
fputc('-',fp2);
fputc('-',fp2);
fputs(tmp,fp2);
fputc('\n',fp2);
}
}
fclose(fp1);
fclose(fp2);
}
㈧ 数据结构课程设计c/c++
图书使用链表管理,数据都保存到txt中,
每次都从txt中读取数据,对读取的数据进行修改、删除等操作。
很简单的,不懂的话,si信我~~~~
㈨ 数据结构课程设计(基于C) 图书管理系统
头文件:
============
#ifndef _DATA_STRUCT_H_
#define _DATA_STRUCT_H_
/*图书结构*/
struct Book
{
unsigned long BookID;/*图书编号*/
char BookName[512];/*书名*/
char Writer[512];/*作者*/
int CurrentNumber;/*现存量*/
Book *pNext;/*下一个图书信息*/
};
/*图书索引结构*/
struct Index
{
unsigned long BookID;/*图书编号*/
Index *pNext;/*下一个索引指针*/
};
/*借阅信息结构*/
struct Borrow
{
unsigned long BookID;/*借阅图书编号*/
char BookName[512];/*书名*/
unsigned long StuID;/*图书证号*/
char ReturnTime[512];/*归还日期*/
Borrow *pNext;/*下一个借阅信息*/
};
#endif/*_DATA_STRUCT_H_*/
实现文件:
===============
// BookManage.cpp : 定义控制台应用程序的入口点。
//
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "DataStruct.h"
/*
数据结构课程设计(基于C) 图书管理系统
悬赏分:100 - 离问题结束还有 14 天 23 小时
【问题描述】
图书管理基本业务活动包括,对一本书的采编入库、清楚库存、借阅和归还等等。试设计一个图书管理系统,将上述业务活动借助于计算机系统完成。
【基本要求】
(1) 每种书的登记至少包括书号书名作者现存量总库存量5项
(2)对书号建立索引表(线性表)以提高查找效率
(3) 系统要实现的操作及其功能定义如下:
1 采编入库:新购入一种书,经分类和确定数好之后登记到图书馆账目中去。如果这种书在账户中已有,则只将总库存量增加。
2借阅:如果一本书的现存量大于零,则借出一本,登出借阅者的图书证号和归还日期
3归还:注销对借阅者的登记,改变该书的现存量
*/
/*获取输入字符串*/
void GetInput(char *pInOutStr,int StrLen,bool OnlyGetNumber = false);
/*显示主菜单 并返回选择*/
int ShowMainMenu();
/*图书入库操作,传入参数为图书列表头指针的指针和索引信息的头指针的指针,因为在此函数内部可能会改变头指针的值*/
void PutBookInLib(Book **pHead,Index **pIndex);
/*查询图书馆库存,查询不改变数据,故传入指针即可*/
void QueryBookLib(Book *pHead);
/*借阅图书*/
void BorrowBook(Borrow **pBorrow,Book *pHead);
/*查询借阅*/
void QueryBorrow(Borrow *pBorrow);
/*归还图书*/
void ReturnBook(Borrow **pBorrow,Book *pHead);
/*释放图书链表及索引链表及借阅信息链表*/
void DeleteBookList(Book **pHead);
void DeleteIndexList(Index **pIndex);
void DeleteBorrowList(Borrow **pBorrow);
int main()
{
/*图书列表头指针*/
Book *pBookHead = NULL;
/*图书索引头指针*/
Index *pIndexHead = NULL;
/*借阅信息头指针*/
Borrow *pBorrowHead = NULL;
/*用来保存当前用户的输入*/
int ChoosedNum = -1;
while ( true )
{
ChoosedNum = ShowMainMenu();
switch(ChoosedNum)
{
case 0 :/*退出*/
{
return 0;
break;
}
case 1:/*图书入库*/
{
PutBookInLib(&pBookHead,&pIndexHead);
break;
}
case 2:/*查询库存*/
{
QueryBookLib(pBookHead);
printf("按回车键继续...");
fflush(stdin);
getchar();
system("cls");
break;
}
case 3:/*借阅图书*/
{
QueryBookLib(pBookHead);
BorrowBook(&pBorrowHead,pBookHead);
break;
}
case 4:/*查询借阅*/
{
QueryBorrow(pBorrowHead);
printf("按回车键继续...");
fflush(stdin);
getchar();
system("cls");
break;
}
case 5:/*归还图书*/
{
QueryBorrow(pBorrowHead);
ReturnBook(&pBorrowHead,pBookHead);
break;
}
}
}
DeleteBookList(&pBookHead);
DeleteIndexList(&pIndexHead);
DeleteBorrowList(&pBorrowHead);
fflush(stdin);
getchar();
return 0;
}
/*获取输入字符串*/
void GetInput(char *pInOutStr,int StrLen,bool OnlyGetNumber)
{
memset(pInOutStr,0x0,StrLen);
fflush(stdin);
int Count = 0;
while ( true )
{
char TmpC = 0;
fread(&TmpC,1,1,stdin);
if ( 10 == TmpC )
{
break;
}
if ( OnlyGetNumber && TmpC >= '0' && TmpC <= '9' )
{
pInOutStr[Count] = TmpC;
Count++;
}
else
{
pInOutStr[Count] = TmpC;
Count++;
}
}
}
/*显示主菜单 并返回选择*/
int ShowMainMenu()
{
char InPutStr[1024];
NO_INPUT:
printf("\n\n\n");
printf("******************************************************************\n");
printf("* 图书管理系统 *\n");
printf("******************************************************************\n");
printf("\n");
printf("请选择:\n");
printf("\t1.图书入库\n");
printf("\t2.查询库存\n");
printf("\t3.借阅图书\n");
printf("\t4.查询借阅\n");
printf("\t5.归还图书\n");
printf("\t0.退出\n");
printf("\n");
printf("\t输入 : ");
GetInput(InPutStr,1024,true);
if ( strlen(InPutStr) < 1 )
{
system("cls");
goto NO_INPUT;
}
return atoi(InPutStr);
}
/*图书入库操作*/
void PutBookInLib(Book **pHead,Index **pIndex)
{
Book *pWork = *pHead;
unsigned long BookID = 1;
char InPutStr[1024];
/*先计算处当前入库图书的ID号*/
if ( NULL == pWork )
{
BookID = 1;
}
else
{
while ( pWork->pNext != NULL )
{
pWork = pWork->pNext;
}
BookID = pWork->BookID + 1;
}
Book *pTmpNewBook = (Book *)(malloc(sizeof(Book)));
memset(pTmpNewBook,0x0,sizeof(Book));
Index *pTmpIndex = (Index *)(malloc(sizeof(Index)));
memset(pTmpIndex,0x0,sizeof(Index));
pTmpNewBook->BookID = BookID;
pTmpIndex->BookID = BookID;
system("cls");
printf("输入图书名称 : ");
GetInput(InPutStr,1024);
strcpy(pTmpNewBook->BookName,InPutStr);
system("cls");
printf("<<%s>>\n",pTmpNewBook->BookName);
printf("图书作者 : ");
GetInput(InPutStr,1024);
strcpy(pTmpNewBook->Writer,InPutStr);
system("cls");
printf("<<%s>>\n",pTmpNewBook->BookName);
printf("作者:%s\n",pTmpNewBook->Writer);
printf("入库数量 : ");
GetInput(InPutStr,1024,true);
pTmpNewBook->CurrentNumber = atoi(InPutStr);
if ( pTmpNewBook->CurrentNumber < 1 )
{
system("cls");
printf("入库数量错误!(按回车键继续...)");
fflush(stdin);
getchar();
system("cls");
return;
}
if ( NULL == *pHead )
{
*pHead = pTmpNewBook;
*pIndex = pTmpIndex;
}
else
{
Book *pWork = *pHead;
while ( pWork != NULL )
{
if ( strcmp(pWork->BookName,pTmpNewBook->BookName) == 0 && strcmp(pWork->Writer,pTmpNewBook->Writer) == 0 )
{
pWork->CurrentNumber += pTmpNewBook->CurrentNumber;
return;
}
pWork = pWork->pNext;
}
pWork = *pHead;
while ( pWork->pNext != NULL )
{
pWork = pWork->pNext;
}
pWork->pNext = pTmpNewBook;
Index *pWork2 = *pIndex;
while ( pWork2->pNext != NULL )
{
pWork2 = pWork2->pNext;
}
pWork2->pNext = pTmpIndex;
}
system("cls");
printf("图书:<<%s>>\n作者:%s\n入库数:%d\n\n入库操作成功!(按回车键继续...)",pTmpNewBook->BookName,pTmpNewBook->Writer,pTmpNewBook->CurrentNumber);
fflush(stdin);
getchar();
system("cls");
}
/*释放图书链表及索引链表*/
void DeleteBookList(Book **pHead)
{
Book *pWork = *pHead;
Book *pNext = pWork;
while ( NULL != pWork )
{
pNext = pWork->pNext;
free(pWork);
pWork = pNext;
}
}
void DeleteIndexList(Index **pIndex)
{
Index *pWork = *pIndex;
Index *pNext = pWork;
while ( NULL != pWork )
{
pNext = pWork->pNext;
free(pWork);
pWork = pNext;
}
}
void DeleteBorrowList(Borrow **pBorrow)
{
Borrow *pWork = *pBorrow;
Borrow *pNext = pWork;
while ( NULL != pWork )
{
pNext = pWork->pNext;
free(pWork);
pWork = pNext;
}
}
/*查询图书馆库存,查询不改变数据,故传入指针即可*/
void QueryBookLib(Book *pHead)
{
Book *pWork = pHead;
int TotalCount = 0;
while ( NULL != pWork )
{
TotalCount++;
pWork = pWork->pNext;
}
system("cls");
printf("当前库存共%d种图书,列表如下:\n=====================================================\n",TotalCount);
pWork = pHead;
while ( NULL != pWork )
{
printf("编号:[%d] 书名:<<%s>> 作者:%s 当前库存:%d\n",pWork->BookID,pWork->BookName,pWork->Writer,pWork->CurrentNumber);
pWork = pWork->pNext;
}
printf("=====================================================\n",TotalCount);
}
/*借阅图书*/
void BorrowBook(Borrow **pBorrow,Book *pHead)
{
char InPutStr[1024];
bool HadTheBook = false;
Borrow *pTmpBorrow = (Borrow *)(malloc(sizeof(Borrow)));
memset(pTmpBorrow,0x0,sizeof(Borrow));
printf("请输入你想借书的编号 : ");
GetInput(InPutStr,1024,true);
pTmpBorrow->BookID = atoi(InPutStr);
Book *pWorkBook = pHead;
while ( pWorkBook != NULL )
{
if ( pWorkBook->BookID == pTmpBorrow->BookID )
{
HadTheBook = true;
break;
}
pWorkBook = pWorkBook->pNext;
}
if ( HadTheBook )
{
if ( pWorkBook->CurrentNumber < 1 )
{
system("cls");
printf("图书<<%s>>当前无库存,无法借阅!\n(按回车键继续...)",pWorkBook->BookName);
fflush(stdin);
getchar();
system("cls");
free(pTmpBorrow);
return;
}
}
else
{
system("cls");
printf("图书编号%d不存在!\n(按回车键继续...)",pTmpBorrow->BookID);
fflush(stdin);
getchar();
system("cls");
free(pTmpBorrow);
return;
}
strcpy(pTmpBorrow->BookName,pWorkBook->BookName);
printf("请输入借书证号 : ");
GetInput(InPutStr,1024,true);
pTmpBorrow->StuID = atoi(InPutStr);
if ( 0 == pTmpBorrow->StuID )
{
system("cls");
printf("借书证号不存在(借书证号输入整数)!\n(按回车键继续...)");
fflush(stdin);
getchar();
system("cls");
free(pTmpBorrow);
return;
}
time_t ltime;
struct tm *today;
time(<ime);
ltime += 60 * 60 * 24 * 30;
today = localtime(<ime);
sprintf(pTmpBorrow->ReturnTime,"%d年%d月%d日", today->tm_year+1900,
today->tm_mon+1,
today->tm_mday);
if ( *pBorrow == NULL )
{
*pBorrow = pTmpBorrow;
}
else
{
Borrow *pWork = *pBorrow;
while ( NULL != pWork->pNext )
{
pWork = pWork->pNext;
}
pWork->pNext = pTmpBorrow;
}
pWorkBook->CurrentNumber--;
system("cls");
printf("借书证号:%d\n借阅图书:<<%s>>\n\n操作成功!(按回车键继续...)",pTmpBorrow->StuID,pTmpBorrow->BookName);
fflush(stdin);
getchar();
system("cls");
}
/*查询借阅*/
void QueryBorrow(Borrow *pBorrow)
{
Borrow *pWork = pBorrow;
int TotalCount = 0;
while ( NULL != pWork )
{
TotalCount++;
pWork = pWork->pNext;
}
system("cls");
printf("当前借阅信息共%d条,列表如下:\n=====================================================\n",TotalCount);
pWork = pBorrow;
while ( NULL != pWork )
{
printf("借数证号:[%d] 借书名:<<%s>> 图书编号:%d 归还日期:%s\n",pWork->StuID,pWork->BookName,pWork->BookID,pWork->ReturnTime);
pWork = pWork->pNext;
}
printf("=====================================================\n",TotalCount);
}
/*归还图书*/
void ReturnBook(Borrow **pBorrow,Book *pHead)
{
char InPutStr[1024];
Borrow TmpBorrow;
bool HasFindBorrwo = false;
memset(&TmpBorrow,0x0,sizeof(TmpBorrow));
printf("请输入借书证号 : ");
GetInput(InPutStr,1024,true);
TmpBorrow.StuID = atoi(InPutStr);
printf("请输入所还图书编号 : ");
GetInput(InPutStr,1024,true);
TmpBorrow.BookID = atoi(InPutStr);
Borrow *pWorkBorrow = *pBorrow;
Borrow *pDeletePre = NULL;
while ( NULL != pWorkBorrow )
{
if ( pWorkBorrow->BookID == TmpBorrow.BookID && pWorkBorrow->StuID == TmpBorrow.StuID )
{
HasFindBorrwo = true;
break;
}
pDeletePre = pWorkBorrow;
pWorkBorrow = pWorkBorrow->pNext;
}
if ( ! HasFindBorrwo )
{
system("cls");
printf("你输入的借书信息不存在!\n(按回车键继续...)");
fflush(stdin);
getchar();
system("cls");
return;
}
if ( NULL == pDeletePre )
{
*pBorrow = pWorkBorrow->pNext;
}
else
{
pDeletePre->pNext = pWorkBorrow->pNext;
}
Book *pWorkBook = pHead;
while ( NULL != pWorkBook )
{
if ( pWorkBook->BookID == pWorkBorrow->BookID )
{
pWorkBook->CurrentNumber ++;
}
pWorkBook = pWorkBook->pNext;
}
system("cls");
printf("借书证号:%d\n归还图书:<<%s>>\n\n操作成功!(按回车键继续...)",pWorkBorrow->StuID,pWorkBorrow->BookName);
fflush(stdin);
getchar();
system("cls");
free(pWorkBorrow);
}