标题:自己写了一个程序,但是达不到预期功能,求大神优化~~求解
只看楼主
qq471402415
Rank: 2
等 级:论坛游民
帖 子:88
专家分:45
注 册:2013-12-3
结帖率:82.35%
已结贴  问题点数:20 回复次数:2 
自己写了一个程序,但是达不到预期功能,求大神优化~~求解
设计一个图书登记管理程序,该程序具有以下功能:

   (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 编辑 ]
搜索更多相关主题的帖子: 记录 出版社 include 管理程序 
2014-04-10 20:43
ying8501
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:6
帖 子:1092
专家分:1446
注 册:2008-11-24
得分:20 
while ( p!=NULL)  //当指针不为空的时候继续向后查找
2014-04-10 21:55
qq471402415
Rank: 2
等 级:论坛游民
帖 子:88
专家分:45
注 册:2013-12-3
得分:0 
回复 2楼 ying8501
改成这个样子就行了  
while (p!=NULL)  //当指针不为空的时候继续向后查找
    {

        if(strcmp(isbn,p->ISBN)==0) {//判断该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;}
        p= p->next;
    }
    if(p==NULL) {printf("此图书不存在\n"); exit(0);}
    else
~~~~~~~~~~~~~~~~~~
   while (!p)  //当指针不为空的时候继续向后查找
    {
         p= p->next;
         if(strcmp(isbn,p->ISBN)!=0)  continue;//判断该ISBN码是否存在,如果存在删除它
        q=p->next;
         p->next=q->next;
         free(p);
         break;

     }
你说那个是一个问题,还有一个问题;就是p只有一个节点的时候,p->next=null;
引用了非法内存~~~~~现在又有一个新问题,文本中怎么会出现问号“?”


2014-04-10 22:49



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-429928-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.028882 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved