图书馆里系统开发源代码

先统揽一下

#define HEADER4 "************************************MEMBER********************************\n"
#define HEADER5 "*number              |     name     |         telephone      *\n "
#define HEADER6 "*******************************************************************\n"
#define HEADER7 "*      mnumber        |member name          |      bnumber           |         book name    *\n"
#define HEADER8 "*****************************************************************************************************************\n"
#define HEADER9 "******************************borrow book***********************************************\n"
#define FORMAT "*%-10s|%-15s|5d|%-15s|%-20s|%5d *\n"
#define FORMAT1 " *%-10s|%-15s|%-15s *\n"
#define FORMAT2 "*%-10s|%-15s|%-10s|%-15s*\n"
#define DATA p->data.num, p->data.name, p->data.price, p->data.author, p->data.pub,p->data.number
#define END "**************************************************************************************************************************\n"
#define Key_Up 0x4800
#define Key_Enter Ox1c0d
#define Key_Down 0x5000

typedef struct book
{
	    char num[10];
		char name[15];
		int price;
		char author[15];
		char pub[20];
		int number;
};
typedef struct Member
{
	char mnum[10];
	char mname[15];
	char tel[15];
};

typedef struct borrow
{
	char mnum[10];//会员号
	char mname[15];//会员姓名
	char num[10];//书号
	char name[15];//书名
};

typedef struct node//定义图书信息链表的结点结构
{
	struct book data;//数据域
	struct node *next;//指针域
} Node, *Link;//定义node类型的结构变量和指针变量

typedef struct mnode//定义会员信息链表的结点结构
{
	struct Member inf;//数据域
	struct mnode *next;//指针域
}Mnode, *Mlink;

typedef struct bnode//定义借书信息链表的结点结构
{
	struct borrow binf;//数据域
	struct bnode *next;//指针域
}Bnode, *Blink;

void MainMenu();
int Ide, Key;
Link l;
Mlink m;
Blink b;

void DrawMenu(int j)//选项菜单显示的函数
{
	int n;
		char *s[10] =
		{
		"Add book", "Delete book", "Search book", "Modify book"
		,"Add member","Borrow book", "Return book","Save book","Save member",
		"Quit system"
		};
		setcolor(RED);//此时输出字体颜色红色
		settextstyle(0, 0, 4);
		outtextxy(60, 50, "BOOK MANAGEMENT");//在这个表坐标位置输出book managment
		settextstyle(0, 0, 1);//设置字的字体,大小,样式
		setcolor(GREEN);
		for (n = 0; n < 10; n++)
			outtextxy(250, 110 + n * 20, s[n]);//每隔20输出字符串数组的元素,为了美观
		setcolor(RED);
		outtextxy(250, 110 + j * 20, s[j]);//j是函数中的参数,选中哪个菜单,哪个菜单就会变成红色,其他用绿色
}

void MainMenu()//主菜单函数
{
	int gdriver, gmode;
	void JudgeIde();//这个是后面定义的
		gdriver = DETECT;
	initgraph(&gdriver, &gmode, "");
	setbkcolor(WHITE);//设置背景颜色为白色
	cleardevice();//清屏
	Ide = 0, Key = 0
		DrawMenu(Ide);//因为Ide=0,此时我们进入drawmenu函数,第一项addbook就应该是红色的;默认状态
	do
	{
		If(bioskey(1)//判断是否有按键
		{
			Key = bioskey(0);//将按键信息赋给Key,
			switch (Key)
			{
			case Key_Down:
			{
				Ide++;
				Ide = Ide % 10;//因为我们这个菜单有10项,当我们加到第11项时,必须要仍能回到这个菜单上来才行,从头选
				DrawMenu(Ide);//调用drawmenu函数,使对应项变成红色
				break;
			}
			case Key_Up:
			{
				Ide--;
				Ide = (Ide + 10) % 10;//Ide是0的时候,会变成负值,需要加10
				DrawMenu(Ide);//重新画一下,使对应项变成红色
				Break;
			}
			}
		}
	} while (Key != Key_Enter);//判断是否是回车键
	JudgeIde();//调用judgeide函数
}
void JudgeIde() //判断Ide的这个函数
{
	switch (Ide)
	{
	case 0:
	{
		closegraph();//关闭功能菜单
		Add(l);//调用add函数,实现图书的添加
		break;
	}
	case 1:
	{
		closegraph();//关闭功能菜单
		Del(l);//调用del函数,实现图书信息的删除
		break;
	}
	case 2:
	{
		closegraph();//关闭功能菜单
		search(1);//调用search 函数,实现图书信息的查找
		break;
	}
	case 3:
	{
		closegraph();
		Modify(l);//调用modify函数,实现图书信息的修改
		break;
	}
	case(4):
	{
		closegraph();
		Addmember(l);//添加会员信息
		break;
	}
	case 5:
	{
		closegraph();
		borrow(l, m, b);//实现借书
		break;
	}
	case 6:
	{
		closegraph();
		ret(l,b);//实现还书
		break;
	}
	case 7:
	{
		closegraph();
		Save(1);//实现信息保存;保存图书信息
		break;
	}
	case 8:
	{
		closegraph();
		Savemember(m);//会员信息保存
		break;
	}
	case 9://离开系统
	{
		cleardevice();
		settextstyle(0, 0, 4);
		outtextsy(150, 200, "goodbye!!!");
		sleep(1);
		exit(0);
	}

	}
}



void Add(Link l)//增加图书记录
{
	Node *p, *r, *s;
	char ch, flag = 0, num[10];
	r = l;
	s = l->next;
	system("cls");//清屏
	Disp(1);//此函数在后面有定义,输出已有的图书的信息
	while (r->next != NULL)//这两句意思是,如果r的next不为空,还要继续往后指
		r = r->next;//会将指针移动到链表最末尾,准备添加记录
	while (l)//可以输入多条记录,输入的如果是0,退出添加操作
	{
		stringinput(num, 10, "input number(press '0'return menu):");//后面的函数,规定长度为10,输入的是书号
		flag = 0;
		if (strcmp(num, "0") == 0)
		{
			MainMenu();
		}
		s = l->next;
		while (s)//当s不为空的时候,会一直执行
		{
			if (strcmp(s->data.num, num) == 0)//查询输入的书号是否已经存在。
			{
				flag = 1;//如果存在,flag就会变为1
				break;
			}
			s = s->next;//如果不相同,在查找下一个
		}
		if (flag == 1)//提示用户是否需要重新输入
		{
			getchar();
			printf("======>the number %s is existing,try again?(y/n):", num);
			scanf("%c", &ch);
			if (ch == 'y' || ch == 'Y')//如果输入小写y或者大写Y,则就证明要继续进行
				continue;
			else
				MainMenu();//若不是,则就会返回到功能菜单选择页面
		}
		else
		{
			break;
		}
	}
	p = (Node*)malloc(sizeof(Node));//申请内存空间
	if (!p)//说明申请内存空间没有成功
	{
		printf("\n allocate memory failure");
		MainMenu();
	}
	strcpy(p->data.num, num);//申请成功,就将字符串copy到p->data.num中
	stringinput(p->data.name, 15, "Name:");//输入图书名称到p->data.name中
	p->data.price = numberinput("price");//将定价输入到p->data.price中
	stringinput(p->data.pub, 20, "publishing company:");//输入图书出版社名称到
	p->data.number = numberinput("number:");//输入图书的数量
	p->next = NULL;//也很关键
	r->next = p;//将新节点插入链表之中
	r = p;//很关键,r永远指向链表的最后一个节点
}
void Disp(Link l)//显示单链表l中存储的图书记录
{
	Node *p;
	p = l->next;
	if (p!)//如果p为空,说明没有记录;
	{
		printf("\n====>No record!\n");
		getchar();
		return;
	}
	printf("\n\n");//为了美观好看
	printf(HEADER1);
	printf(HEADER2);
	printf(HEADER3);
	while (p)//逐条输出链表中存储的图书信息
	{
		printf(FORMAT, DATA);//按照format和data的指定格式输出
		p = p->next;
		printf(HEADER3);//输出一排星号,为了分开彼此
	}
}
void Save(Link l)//将数据保存,通过都写入磁盘文件中,实现了保存
{
	FILE *fp;
	Node *p;//p是图书信息链表的指针
	int count = o;
	fp = fopen("f:\\book", "wb");//以只写的方式打开二进制文件
	if (fp = NULL)//说明二进制文件没有打开,打开文件失败
	{
		printf("n====>open file error!\n");
		getchar();
		MainMenu();
	}
	p = l->next;//l是头节点,p指向l的下一个
	while (p)//当p不为空时
	{
		if (fwrite(p, sizeof(Node), l, fp) == 1)//如果p不是空,就将相应信息写入fp指向的磁盘文件
		{
			p = p->next;//指针后移
			count++;//记录图书信息的条数
		}
		else
		{
			break;
		}
	}
	if (count > 0)
	{
		getchar();
		printf("\n\n\n\tsave file complete,total saved'srecord number is:%d\n", count);//提示一下保存了多少记录
		getchar();
		MainMenu();
	}
	else
	{
		system("cls");//清屏
		printf("the current link is empty,no student record is saved!\n");//没有学生记录保存,链表是空的
		getchar();
		MainMenu();
	}
	fclose(fp);//关闭磁盘文件
}

void Del(Link l)//删除指定的图书记录
{
	int sel;
	Node *p, *r;
	char findmess[20];
	if (!l->next)//看看这个链表是不是空链表
	{
		system("cls");
		printf("\n====no record!\n");
		getchar();
		MainMenu();
	}
	system("cls");
	Disp(l);//如果链表不是空的,就调用disp函数,显示链表l中的图书存储记录
	printf("\n            ====> 1.Delete by number         ====>2.Delete bu name  \n");//两种删除方式
	printf("please choice[1,2]:");
	scanf("%d", &sel);
	if (sel == 1)//依据书号删除
	{
		stringinput(findmess, 10, "input the existing student number:");//让你输入书号
		p = Locate(l, findmess, "num");
		if (p)//p的返回值不为0,说明依据书号查询找到了,接下来就要寻找p这个节点的位置
		{
			r = 1;//仍然让r指向表头
			while (r->next != p)//执行这个语句的时候,r在p的前面,p这个节点就是我们要删除的节点
				r = r->next;//r跳过p直接指向了p的下一个节点,相当于在这一步,实现了对p节点的删除
			r->next = p->next;//删除节点要承前启后,承接p后面的节点
			free(p);//p这个节点现在没用了,我们要将其释放出去
			printf("\n=======>delete success!\n");
			getchar();
			MainMenu();
		}
		else//p的返回值为0,说明我们压根没有找到书名为输入书名的这个节点
			Nofind();//调用函数
		getchar();
		MainMenu();
	}
	else if (sel == 2)//选择按书名查找
	{
		stringinput(findmess, 15, "input the existing book name");
		p = Locate(l, findmess, "name");
		if (p)
		{
			r = 1;
			while (r->next != p)//r指向节点的下一个节点就是我们要寻找的p节点
				r = r->next;//直接跳过p节点
			r->next = p->next;//继承p后面的其他节点
			free(p);//释放p节点,很好的习惯
			printf("\n=======>delete success!\n");
			getchar();
			MainMenu();
		}
		else
			Nofind();
		getchar();
		MainMenu();
	}
	else
		Wrong();
	getchar();
	MainMenu();
}

void stringinput(char *t, int lens, char *notice)//输入字符串,进行长度验证,lens就是规定的长度,notice也是字符串
{
	char n[50];
	do 
	{
		printf(notice);//显示提示信息
		scanf("%s", n);//输入字符串
		if (strlen(n) > lens)//如果输入的字符串大于规定的长度
			printf("\n exeed the required length!  \n");	
	} while (strlen(n) > lens);
	strcpy(t, n);//如果输入的字符串符合要求,就将输入的字符串拷贝到字符串t中
}

Node *Locate(Link l, char findmess[], char nameornum[])//链表节点的定位模式,书名或者书号
{
	Node *r;
	if (strcmp(nameornum, "num") == 0)//name or num 两种删除方式,如果和num匹配了,说明就是用书号来删除
	{
		r = l->next;//r是新定义的链表指针,我们要让他指向链表l的表头节点
		while (r)//r不为空
		{
			if (strcmp(r->data.num, findmess) == 0)//要用链表中的当前节点的书号与输入的书号进行比较,如果一致
				return r;//返回与输入内容相匹配的节点
			r = r->next;//否则,节点下移
		}
	}
	else if (strcmp(nameornum, "name") == 0)//如果是按书名来删除
	{
		r = l->next;//指针指向链表l表头节点
		while (r)//当链表不为空时,执行此循环
		{
			if (strcmp(r->data.name, findmess) == 0)//如果找到了与输入的书名匹配的节点
				return r;//返回当前节点的位置
			r = r->next;//否则就继续向下移
		}
	}
	return 0;//从始至终久未找到,凡是能查到的,都不会执行到return 0这一步
}
void Wrong()//输出按键错误信息
{
	printf("\n\n\n\n\n***********ERROR:input has wrong!press any key to continue**************\n");
	getchar();
}

void search(Link l)//实现图书的查找
{
	int select;
	char searchinput[20];
	Node *p;
	if (!l->next)//判断链表是否为空,如果为空,输出如下语句
	{
		system("cls");
		printf("\n======no record!\n");
		getchar();
		MainMenu();
	}
	system("cls");
	printf("\n            ====> 1.Search by number         ====>2.Search bu name  \n");//选择查找方式
	printf("          please choice[1,2]:");
	scanf("%d", &select);
	if (select == 1)//书名查找
	{
		stringinput(searchinput, 10, "input the existing book number:");//将输入的书号付给了searchinput
		p = Locate(l, searchinput, "num");//按书号查找,将查找到的结果赋给p
		if (p)//如果p不为空,说明查找到了
		{
			printheader();
			printdata(p);
			printf(END);
			printf("press any key to return\n");
		}
		else
			Nofind();
		getchar();
	}
	else if (select == 2)//如果按署名查找
	{
		stringinput(searchinput, 15, "input the existing book name:");
		p = Locate(l, searchinput, "name");
		if (p)
		{
			printheader();
			printdata(p);
			printf(END);
			printf("press any key to return\n");
		}
		else
			Nofind();
		getchar();
	}
	else
		Wrong();
	getchar();
	MainMenu();
}
void printheader()//格式化的一个输出函数
{
	printf(HEADER1);
	printf(HEADER2);
	printf(HEADER3);
}
void printdata(Node *pp)//格式化的输出表中数据
{
	Node *p;
	p = pp;
	printf(FORMAT, DATA);//将节点中的内容输出
}


void Nofind()//输出未查找到此书的信息
{
	printf("\n=====>not find this record!\n");
}


void Modify(Link l)//图书信息修改
{
	Node *p;
	char findmess[20];
	if (!l->next)//链表是否为空
	{
		system("cls");
		printf("\n=====>No book record! \n");
		getchar();
		MainMenu();
	}
	system("cls");
	printf("modify book recorder");
	Disp(l);//将整个图书链表中的信息显示出来
	stringinput(findmess, 10, "input the existing book number: ");
	p = Locate(l, findmess, "num");
	if (p)//p不为空就是找到了那个节点
	{
		printf("Number: %s, \n", p->data.num);
		printf("Name: %s,", p->data.name);//以上两条是输入原有的信息
		stringinput(p->data.name, 15, "input book name: ");/*调用函数,输入新的信息*/
		printf("price: %d,", p->data.price);
		p->data.price = numberinput("the price of book: ");
		printf("Author: %s,", p->data.author);
		stringinput(p->data.author, 15, " Author: ");
		printf("publishing company: %s,", p->data.pub);
		stringinput(p->data.pub, 15, "Publishing company: ");
		printf("number: %d, ", p->data.number);
		p->data.number = numberinput("the number of book: ");
		printf("\n=====>modify success! \n");
		Disp(1);//将整个图书链表的信息再输出一次
	}
	else
		Nofind();
	getchar();
	MainMenu();
}

void Mdisp(Mlink m)//显示单链表m之中存在的会员信息,注意使用的是会员信息链表m,不再是图书信息链表l
{
	Mnode *p;//会员信息链表指针
		p = m->next;
	if (!p)//会员信息链表为空
	{
		printf("\n=====>Not record! \n");
		getchar();
		return;
	}
	printf("n\n");
	printf(HEADER4);
	printf(HEADER5);
	printf(HEADER6);
	while (p)//逐条输出储存的会员链表的信息
	{
		printf(FORMAT1, p->inf.mnum, p->inf.mname, p->inf.tel);
		p = p->next;
		printf(HEADER6);
	}
	getchar();
}

int numberinput(char *notice)
{
	int t = 0;
	do
	{
		printf(notice);
		scanf("%d", &t);
		if (t < 0)
			printf("\n price must >0! \n");
	}while (t < 0);
	return t;
	MainMenu();
}

void Addmember(Mlink m)
{
	FILE *fp;
	Mnode *p, *r, *s, *q;//对应会员信息的结构体类型
	char ch, qu, flag = 0, num[10];
	r = m;
	s = m->next;
	system("cls");
	Mdisp(m);
	while (r->next != NULL)/*将原有记录输出*//*将指针移至链表最末尾,准备添加记录*/
		r = r->next;
	while (1)
	{/*可输入多条记录,输入0时退出添加操作*/
		stringinput(num, 10, "input the number of the member(press '0'return menu) :");/*输入会员号*/
			flag = 0/*输入为0,则退出添加操作,返回功能选择界面*/
			if (strcmp(num, "0") == 0)
			{
				MainMenu();
			}
		s = m->next;/*查询该会员号是否已经存在*/
		while (s)
		{
			if (strcmp(s - inf.mnum, num) == 0)
			{
				flag = 1;
				break;
			}
			s = s->next;/*提示用户是否重新输入*/
			if (flag == 1)
			{
				getchar();
				printf("=====>The number %s is existing, try again?(y/n): " num);
				scanf("%c", &ch);
				if (ch == 'y' || ch == ' Y')
					continue;
				else
					MainMenu();
			else
			{
				break;
			}
			}
			/*申请内存空间*/
			p = (Mnode *)malloc(sizeof(Mnode));
			if (!p)
			{
				/*如没有申请到,输出提示信*/
				printf("\n allocate memory failure ");
				MainMenu();
			}
			/*返回主界面*/
			strcpy(p->inf.mnum, num);
			/*将会员号复制到p->data*/
			stringinput(p->inf.mname, 15, "Name:");
			stringinput(p->inf.tel, 15, "Telephone: ");
			p->next = NULL;
			r->next = p;
			/ 将新结点插入链表中 *
				r = p;
		}
		MainMenu();
	}
}

void Savemember(Mlink m)//保存会员信息
{
	FILE *fp;
	Node *p;
	int count = 0;
	fp = fopen("f:\\member", "wb");/*以只写方式打开*/
	if (fp == NULL)
	{
		printf("n=====>open file error!\n");/*打开文件失败*/
		getchar();
		MainMenu();
	}
	p = m->next;
	while (p)
	{
		if (fwrite(p, sizeof(Mnode), 1, fp) == 1)/*写记录到磁盘文件中*/
		{
			p = p->next;
			count++;
		else
			break;
	
		}
		if (count > 0)
		{
			getchar();
			printf("\n\n\n\tsave file complete, total saved's record number is: %d\n",count);
			getchar();
			MainMenu();
		}
		else
		{
			system("cls");
			getchar();
			MainMenu();
		}
		fclose(fp);
	}
}

void borrow(Link 1, M1ink m, B1ink b)/*借书第一个是图书信息链表,第二个是会员信息链表,第三个是借书信息链表*/
{
	Mnode * p;
	Node *q;
	Bnode *t, *s, *k;
	char number[10], booknum[10];
	system("cls");
	t = b->next;
	if (!t)//说明借书信息链表时空的
	{
		printf("\n=====>Not record! \n");
		printf("\n\n");//不空的话就输出这些
		printf(HEADER9);
		printf(HEADER7);
		printf(HEADER8);
		while (t)
		{
			printf(FORMAT2, t->binf.mnum, t->binf.mname, t->binf.num, t->binf.name);//以这个格式输出第一个节点信息
			t = t->next;//指向下一个节点
			printf(HEADER8);
			while (1)
			{
				s = b;//s指向借书信息链表
				p = m->next;//p指向会员信息链表
				q = l->next;//q指向图书信息链表
				while (s->next != NULL)
					s = s->next;//用这两个语句直到s指向借书链表的最后一个节点
				stringinput(number, 10, "please input the number of member: ");/*输入会员号*/
				if (strcmp(number, "0") == 0)//看一下会员号是否为0,如果是0跳出循环
					break;
				do
				{
					if (strcmp(p->inf.mnum, number) == 0)/*查看该会员号是否存在*/
						break;//如果会员存在就跳出这个循环
					else
						p = p->next;//和这个节点的会员信息不匹配,p就会指向下一个节点
				} while (p != NULL);//直到p为空
				stringinput(booknum, 10, " please input the number of book:");/*输入书号*/
				do
				{
					if (strcmp(q->data.num, booknum) == 0)/*查看书号是否存在*/
						break;
					else
						q = q->next;
				} while (q != NULL);//与上面一致
				if (p == NULL)//你不是会员
				{
					printf("you are not a member!");
					MainMenu();
				}
				else if (q == NULL)//书不存在
				{
					printf("the book is not exist! ");
					MainMenu();
				}
				else
				{
					if (q->data.number != 0)//如果现在图书还有
					{
						q->data.number--;//相当于图书现在要借出去一本
						k = (Bnode*)malloc(sizeof(Bnode));/*申请内存空间*/
						if (!k)
						{
							printf("\n allocate memory failure");/*如没有申请到,输出提示*/
							MainMenu();/*返回功能选择界面,这个时候借书信息还没有保存,也就是书还没有接触去*/
						}
						strcpy(k->binf.num, q->data.num);
						strcpy(k->binf.name, q->data.name);
						strcpy(k->binf.mnum, p->inf.mnum);
						strcpy(k->binf.mname, p->inf.mname);
						k->next = NULL;
						s->next = k;//把这个节点加到借书信息链表,因为s经过一顿才做之后指向的是最后一个节点
						s = k;
					}
					else
						preintf("no book!");
				}
			}
			Saveoi(b);//保存借书信息
			getchar();
			MainMenu();
		}
	}
}

void Saveoi(Blink b)
{
	FILE *fp;
	Bnode *p;
	int count = 0;
	fp = fopen("f: \\borrow", "wb");/*以只写方式打开二进制文件或者说新建一个文件*/
	if (fp == NULL)/*打开文件失败*/
	{
		printf("\n=====>open file error!\n");
		getchar();
		MainMenu();
	}
	p = b->next;//b是借书链表
	while (p)
	{
		if (fwrite(p, sizeof(Bnode), 1, fp) == 1)/*每次写一条记录或一个结点信息至文件*/
		{
			p = p->next;
			count++;
		}
		else
		{
			break;
		}
	}
	if (count > 0)
	{
		getchar();
		printf("\n\n\n\n\n=====>save file complete, total saved's record number is: %d\n", count);
		getchar();
		MainMenu();
	}
	else
	{
		system("cls");
		getchar();
		MainMenu();
	}
	fclose(fp);
}

void ret(Link 1, Blink b)//第一个指向图书信息,第二个指向借书信息
{
	Bnode *p, *q;
	Node *t;
	char memnum[10], booknum[10];
	q = b;//借书链表
	p = q->next;//p指向还书信息链表的首节点
	t = l->next;
	stringinput(memnum, 10, "please input the number of member: ");
	if (strcmp(memnum, " 0") == 0)
		MainMenu();
	stringinput(booknum, 10, "please input the number of book: ");
	while (p != NULL)
	{
		if (strcmp(p->binf.num, booknum) == 0 && strcmp(p->binf.mnum, memnum) == 0)/* 如果书号与会员号都存在则可以还*/
		{
			q->next = p->next;//此举相当于要释放p节点
			do
			{
				if (strcmp(t->data.num, booknum) == 0)//要再图书信息链表之中找到那一本书,将其数量加一
					break;
				else
					t = t->next;
			} while (t != NULL);
				t->data.number++;//图书数量加1,还书成功
			free(p);//释放p节点
		}
		else//就是信息不吻合,那就移到下一个节点再进行比较
		{
			q = p;
			p = q->next;
		}
	}
	if (p == NULL)//说明整个链表都走了一遍
	{
		printf("input error");
		MainMenu();
	}
	Saveoi(b);
	getchar();
	MainMenu();
}

main()
{
	FILE *fp;//注意fp是文件的指针
	int select;
	char ch;
	int count = 0;
	Node *p, *r;//指向图书信息链表
	Mnode *q, *t;//指向会员信息链表
	Bnode *s, *k;//指向借书信息链表
	b = (Bnode *)malloc(sizeof(Bnode));
	if (!b)
	{
		printf("\n allocate memory failure ");
		MainMenu();
	}
	b->next = NULL;
	k = b;
	fp = fopen("f:\\borrow,""ab++");//打开借书文件
	if (fp == NULL)
	{
		printf("\n====>can not open file!!!\n");
		exit(0);
	}
	while (!feof(fp))
	{
		s = (Bnode *)malloc(sizeof(Bnode));//申请一个借书节点
		if (!s)
		{
			printf("memory malloc failure!\n");
			exit(0);
		}
		if (fread(s, sizeof(Bnode), l, fp) == 1)//从文件中读取借书记录
		{
			s->next = NULL;//保证新节点s是一个孤节点
			k->next = s;//新节点加入链表
			k = s;//保证k永远指向链表的最后一个节点
		}
	}
	fclose(fp);//关闭借书文件
	m = (Mnode*)malloc(sizeof(Mnode));//申请一个会员信息节点
	if (!m)
	{
		printf("\n allocate memory failure ");/*如没有申请到, 打印提示信息*/
		MainMenu();/*返回功能选择界面*/
	}
	m->next = NULL;
	t = m;
	fp = fopen("f:\\menber", "ab++");//打开会员信息文件
	if (fp == NULL)
	{
		printf("\n=====>can not open file!\n");
		exit(0);
	}
	while (!feof(fp))
	{
		q = (Mnode*)malloc(sizeof(Mnode));
		if (!q)
		{
			printf("memory malloc failure!\n");
			exit(0);
		}
		if (fread(q, sizeof(Mnode), l, fp) == 1)
		{
			q->next = NULL;//保证要新加进来的节点q是一个孤节点
			t->next = q;//让新节点q加入到链表中
			t = q;//t永远指向链表中的最后一个节点
		}
	}
	fclose(fp);/* 关闭文件*/
	l=(Node *)malloc(sizeof(Node));
	if (!l)
	{
		printf("\n allocate memory failure ");/*如没有申请到, 打印提示信息*/
		MainMenu();/*返回功能选择界面*/
	}
	l->next = NULL;
	r = 1;
	fp = fopen("f:\\book", "ab+");
	if (fp == NULL)
	{
		printf("\n=====>can not open file! n");
		exit(0);
	}
	while (!feof(fp))
	{
		p = (Node*)malloc(sizeof(Node));
		if (!p)
		{
			printf(" memory malloc failure! \n");/*没有申请成功*/
			exit(0); /* 大退出 */
		}
		if (fread(p, sizeof(Node), 1, fp) == 1)/*从文件中读取图书信息记录*/
		{
			p->next = NULL;
				r->next = p;
				r = p;
				count++;
		}
	}
	fclose(fp);
		printf("\n=====>open file sucess, the total records number is :%d\n",count);
		MainMenu();
}

希望能对你有所帮助!!!

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值