自己写了一个程序,但是达不到预期功能,求大神优化~~求解
设计一个图书登记管理程序,该程序具有以下功能:(1)录入某本图书的信息(图书信息包括的内容:ISBN号、书名、作者、出版社、出版日期、价格)
(2)给定图书ISBN编号,显示该图书信息;
(3)给定图书ISBN编号,修改该图书 信息;
(4)给定图书ISBN编号,删除该图书信息;
要求:记录添加删除操作时,先从文件载入数据,用链表存放,批量操作完后,数据从链表写入文件。
#include<string.h>
#include<stdio.h>
#include<malloc.h>
#define ERROR 0
#define OK 1
#define FALSE 0
typedef struct LNode
{
//定义记录书籍的结构体
char ISBN[20];//定义图书的ISBN码
char name[20];//定义图书的名字
char auth[20];//定义图书的作者
char output[20];//定义图书的出版社
char outday[20];//定义图书的出版日期
char money[20];//定义图书的价格
struct LNode *next;
} LNode,*LinkList;
int Write_To_File(LinkList &L)
{
//将链表中的数据输入文本中储存
FILE *fp;//定义文件指针
LinkList q,p=L;
if((fp=fopen("book.txt","w"))==NULL) //以写的方式打开
{
printf("打开文件失败\n");
return FALSE;
}
while( p!=NULL)//判断链表是否读到末尾了
{
fprintf(fp,"%s\t%s\t%s\t%s\t%s\t%s\t\n",p->ISBN,p->name,p->auth,p->output,p->outday,p->money);//把数据输入到文本中
p= p->next;//指针后移
}
if(fclose(fp))//关闭文件
{
printf("关闭文件失败\n");
exit(0);
}
return OK;
}
int Read_From_File(LinkList &L)//从文本中把数据读到链表中
{
FILE *fp;
LinkList s,p=L;//定义指针p指向头结点
if((fp = fopen("book.txt","r"))==NULL) //以读的方式打开
{
printf("打开文件失败\n");
return FALSE;
}
while(!feof(fp)) //判断文件是否读到文件末尾
{
s=(LinkList)malloc(sizeof(LNode));//生成新结点
fscanf(fp,"%s%s%s%s%s%s",s->ISBN,s->name,s->auth,s->output,s->outday,s->money);//从文件中读取数据放到链表中
s->next=p->next;
p->next=s;
p=p->next;
}
if(fclose(fp))//关闭文件
{
printf("关闭文件失败\n");
exit(0);
}
return OK;
}
int CreateLink_L(LinkList &L)
{
// 创建单链表
LinkList p,q;
L= (LinkList)malloc(sizeof(LNode));
L->next = NULL; // 先建立一个带头结点的单链表
q = (LinkList)malloc(sizeof(LNode));
q = L;//新生成的一个结点指针指向头结点
return OK;
}
int Link_Book_Insert_L(LinkList &L)
{
// 在带头结点的单链线性表L中末尾之前插入新增加的图书信息
LinkList p=L,s;
s=(LinkList)malloc(sizeof(LNode));
printf("请依次输入图书的ISBN号、书名、作者、出版社、出版日期、价格,以空格相隔\n");
scanf("%s%s%s%s%s%s",s->ISBN,s->name,s->auth,s->output,s->outday,s->money);//从键盘输入新增加的图书信息
s->next=p->next;
p->next=s;
p=p->next;
return OK;
}//LinkInsert_L
int LoadLink_L(LinkList &L)
{
// 单链表遍历
LinkList p=L->next;
if(!p) printf("链表为空");
else
{
printf("链表是:");
while(p)
{
printf("%s\t%s\t%s\t%s\t%s\t%s\t\n",p->ISBN,p->name,p->auth,p->output,p->outday,p->money);
p=p->next;
}
}
printf("\n");
return OK;
}
int List_Book_Delete_L(LinkList &L, char ISBN[20]) //在带头结点的单链线性表L中,删除相应ISBN码的图书。
{
LinkList p,q;
p = L;
char isbn[20];
printf("请输入你要删除图书的ISBN码,以回车键结束\n");
scanf("%s",isbn);
while (!p) //当指针不为空的时候继续向后查找
{
p= p->next;
if(strcmp(isbn,p->ISBN)!=0) continue;//判断该ISBN码是否存在,如果存在删除它
q=p->next;
p->next=q->next;
free(p);
break;
}
if(p==NULL)
printf("此图书不存在\n");
return OK;
}
int Change_Book(LinkList &L, char ISBN[20])
{
char isbn[20];
char name1[20];
char auth1[20];
char output1[20];
char outday1[20];
char money1[20];
LinkList p,q;
p = L;
printf("请输入你要修改图书的ISBN码,以回车键结束\n");
scanf("%s",isbn);
while (!p) //当指针不为空的时候继续向后查找
{
p= p->next;
if(strcmp(isbn,p->ISBN)!=0) continue;//判断该ISBN码是否存在
printf("要修该的图书信息是:\n");
printf("%s\t%s\t%s\t%s\t%s\t%s\t\n",p->ISBN,p->name,p->auth,p->output,p->outday,p->money);
break;
}
if(p==NULL) printf("此图书不存在\n");
else
printf("请依次输入要修改图书的ISBN号、书名、作者、出版社、出版日期、价格,以空格相隔\n");
scanf("%s%s%s%s%s%s",isbn,name1,auth1,output1,outday1,money1);//从键盘输入修改的图书信息
strcpy(p->ISBN,isbn);
strcpy( p->name,name1);
strcpy(p->auth,auth1) ;
strcpy(p->output,output1);
strcpy(p->outday,outday1);
strcpy(p->money,money1);
printf("修改后的图书信息是:\n");
printf("%s\t%s\t%s\t%s\t%s\t%s\t\n",p->ISBN,p->name,p->auth,p->output,p->outday,p->money);
return OK;
}
void Insert_Book_xinx()//增加图书信息函数
{
/*int Write_To_File(LinkList &L);
int Read_From_File(LinkList &L);
int CreateLink_L(LinkList &L);
int Link_Book_Insert_L(LinkList &L);
函数声明 */
LinkList T;//定义一个图书结构体类型
CreateLink_L(T);//创建链表
Read_From_File(T);//从文本中把数据读到链表中
Link_Book_Insert_L(T);//新增图书新
Write_To_File(T);//把数据从链表中储存到文本中
}
void Detele_Book()//图书删除函数
{
LinkList T;
char ISBN[20];//\定义记录ISBN码的数组
CreateLink_L(T);//创建链表
Read_From_File(T);//从文本中把数据读到链表中
List_Book_Delete_L(T,ISBN);//删除对应ISBN码的图书
Write_To_File(T);//把数据从链表中储存到文本中
}
void Change_Book_xinxi()//修改图事故信息的函数
{
LinkList T;
char ISBN[20];
CreateLink_L(T);//创建链表
Read_From_File(T);//从文本中把数据读到链表中
Change_Book(T, ISBN);//|更改相应的ISBN码的图书信息
Write_To_File(T);//把数据从链表中储存到文本中
}
int main()
{
int i;
printf("1:增加图书\t\t2:修改图书信息\t\t3:删除图书\n请选择\n");
scanf("%d",&i);
switch(i)
{
case 1:
Insert_Book_xinx();
break;
case 2:
Change_Book_xinxi();
break;
case 3:
Detele_Book();
break;
default:
printf("~~~~~~~");
}
return OK;
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
为什么这个地方判断不起作用?
while (!p) //当指针不为空的时候继续向后查找
{
p= p->next;
if(strcmp(isbn,p->ISBN)!=0) continue;//判断该ISBN码是否存在
printf("要修该的图书信息是:\n");
printf("%s\t%s\t%s\t%s\t%s\t%s\t\n",p->ISBN,p->name,p->auth,p->output,p->outday,p->money);
break;
}
if(p==NULL) printf("此图书不存在\n");
else
[ 本帖最后由 qq471402415 于 2014-4-10 20:44 编辑 ]