#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
struct book
{
int id;//书的编码//
char name[100];//书名//
char publish[100];//出版社//
char author[100];//作者//
int store;//目前可借阅多少本
int total;//馆藏多少本
int user;//借走的人数
int day;//借的天数//
};
//链表的节点类型//
struct Node
{
struct book data;//链表节点存储的数据//
struct Node* pNext; //保存下一个节点的地址//
};
//准备一个创建链表节点的函数//
struct Node* creatNode(struct book* pData);
//添加一个节点到链表末尾
void appendNode(struct Node** root,struct book* pData);
//遍历链表并输出
void travel(struct Node* root);
//返回root链表中第n个节点的地址
struct Node* findNodeByPos(struct Node* root,int n);
//删除root链表中第n个节点
void deleteNode(struct Node** root,int n);
//删除整个链表
void deleteList(struct Node** root);
void menu();
void show_book();
void add_book();
void delete_book();
void change_bookinfor();
void cheek_book();
void borrow_book();
void return_book();
int main()
{
//从文件中读取数据到链表中//
FILE *fp;
fp=fopen("D:/书籍.txt","r");
if(fp==NULL)
{
printf("打开文件失败!\n");
exit(0);
}
struct Node** root;
struct Node* creatNode(struct book* pData);
struct book pData;
char s[100];
fscanf(fp,"%d %s %s %s %d %d",&pData.id,pData.name,pData.author,pData.publish,&pData.total,&pData.user);
fscanf(fp,"%d",&pData.id);
printf("%d\n",pData.id);
appendNode(root,&pData);
//根据用户的输入来改变数据//
menu();
//把链表中的数据写入到文件中(覆盖掉了文件中之前的数据)//
while(1);
return 0;
}
//创建一个链表节点//
struct Node* creatNode(struct book* pData)
{
struct Node* pNew;
pNew=(struct Node*)malloc(sizeof(struct Node));//分配内存//
if(NULL==pNew)
return NULL;//说明创建链表节点失败//
pNew->pNext=NULL;//pNew是一个指针
//将数据拷贝到新节点里面//
strcpy(pNew->data.name,pData->name);
strcpy(pNew->data.publish,pData->publish);
strcpy(pNew->data.author,pData->author);
pNew->data.day=pData->day;
pNew->data.id=pData->id;
pNew->data.store=pData->store;
pNew->data.total=pData->total;
pNew->data.user=pData->user;
return pNew;
}
void menu()
{
int n;
while(1)
{
//system("cls");//清屏
printf("----------浙大宁波理工大学图书管理系统----------\n");
printf("1-增加图书信息\n");
printf("2-删除图书信息\n");
printf("3-修改图书信息\n");
printf("4-查找图书\n");
printf("5-借阅书籍\n");
printf("6-还书\n");
printf("7-退出\n");
printf("请选择:");
scanf("%d",&n); //输入其他数字,需要来一个错误的检查
switch(n)
{
case1:show_book(); break;
case2:add_book(); break;
case3:delete_book(); break;
case4:change_bookinfor(); break;
case5:cheek_book(); break;
case6:borrow_book(); break;
case7:return_book(); break;
case8:exit(1); break;
default:break;
}
}
}
void show_book()
{
//打开文件//
FILE* fp;//定义文件指针 //
if((fp=fopen("D:\\书籍.txt","rb"))==NULL)
{
printf("打开文件失败!\n");
Sleep(3000);//让输出的话停留三秒钟在清屏
exit(0);
}
else
{
// 读取文件内容并存放到链表或数组中
struct Node* pList=NULL;//一开始有一个链表里面为空
int r;
struct book temp;//临时存储一个书籍的数据
while(1)
{
r=fread(&temp,1,sizeof(struct book),fp);
if(r<=0)//没读到
{
break;
}
else//读到了一本书的信息
{
//创建一个链表节点
struct Node* creatNode(struct book* pData);
//把链表节点添加到链表中
appendNode(&pList,&temp);
}
}
//关闭文件
fclose(fp);
//遍历链表或者数组并输出
travel(pList);
//删除整个链表
deleteList(&pList);
}
}
void add_book()
{
//打开文件//
FILE* fp;//定义文件指针 //
struct book temp;//临时存储一个书籍的数据
struct Node* pList=NULL;//一开始有一个链表里面为空
int r;
if((fp=fopen("D:\\书籍.txt","rb"))==NULL)
{
printf("系统中没有书籍!\n");
Sleep(3000);//让输出的话停留三秒钟在清屏
exit(0);
}
else
{
// 读取文件内容并存放到链表或数组中
while(1)
{
r=fread(&temp,1,sizeof(struct book),fp);
if(r<=0)//没读到
{
break;
}
else//读到了一本书的信息
{
//创建一个链表节点
struct Node* creatNode(struct book* pData);
//把链表节点添加到链表中
appendNode(&pList,&temp);
}
}
//关闭文件
fclose(fp);
}
printf("请输入要增加的图书的id:");
scanf("%d",temp.id);
printf("请输入要增加的图书的名字:");
scanf("%s",temp.name);
printf("请输入要增加的图书的作者:");
scanf("%s",temp.author);
printf("请输入要增加的图书的出版社:");
scanf("%s",temp.publish);
printf("请输入要增加的图书的可借阅数量:");
scanf("%d",temp.store);
printf("请输入要增加的图书的馆藏:");
scanf("%d",temp.total);
printf("请输入要增加的图书的可借阅天数:");
scanf("%d",temp.day);
appendNode(&pList,&temp);
//打开文件//
if((fp=fopen("D:\\c语言大作业\\书籍.txt","wb"))==NULL)
{
printf("打开文件失败!\n");
Sleep(3000);//让输出的话停留三秒钟在清屏
exit(0);
}
else//循环把链表中的东西写到文件里
{
struct Node* pTemp=pList;
while(pTemp)
{
fwrite(&(pTemp->data),1,sizeof(struct book),fp);
pTemp=pTemp->pNext;
}
}
fclose(fp);
deleteList(&pList);
}
void delete_book()
{
}
void change_bookinfor()
{
}
void cheek_book()
{
}
void borrow_book()
{
}
void return_book()
{
}
//添加一个节点到链表末尾
void appendNode(struct Node** root,struct book* pData)
{
if(root==NULL) return;
if(*root==NULL)//传进来一个空链表
{
*root=creatNode(pData);//新的节点
return;
}
struct Node* pTemp=*root;
//让pTemp指向链表最后一个节点
while(pTemp->pNext)
{
pTemp=pTemp->pNext;
}
//把新节点添加到pTemp后面
pTemp->pNext=creatNode(pData);
}
//遍历链表并输出
void travel(struct Node* root)
{
if(root==NULL) return;
while(root)
{
printf("id:%d",root->data.id);
printf("书名:%s",root->data.name);
printf("作者:%s",root->data.author);
printf("出版社:%s",root->data.publish);
printf("可借阅:%d",root->data.store);
printf("馆藏:%d",root->data.total);
printf("借走人数:%d",root->data.user);
printf("可借天数:%d",root->data.day);
root=root->pNext;
}
printf("------------------------------------------\n");
}
//返回root链表中第n个节点的地址
struct Node* findNodeByPos(struct Node* root,int n)
{
int i;
if(n<0) return NULL;
if(root==NULL) return NULL;
if(n==0) return root;//删掉第一个
for(i=0;i<n;i++)
{
if(root==NULL) return NULL;
root=root->pNext;
}
return root;
}
//删除root链表中第n个节点 n从0开始
void deleteNode(struct Node** root,int n)
{
if(root==NULL) return;
if(*root==NULL) return;
if(n<0) return;
struct Node* pDel=*root;
struct Node* pDelPret=NULL;//要删的节点的前一个节点
if(n==0)
{
*root= pDel->pNext;
free(pDel);//释放内存
return;//删掉第一个
}
pDel=findNodeByPos(*root,n);//删第n个
pDelPret=findNodeByPos(*root,n-1);
pDel=pDelPret->pNext;//这个是要山的节点
if(pDel==NULL) return;
pDelPret->pNext=pDel->pNext;//pDel的前一个的next指针指向pDel的下一个节点
free(pDel);//释放内存
return;
}
//删除整个链表
void deleteList(struct Node** root)
{
while(1)
{
if(NULL==*root) return;
deleteNode(root,0);
}
}