| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 575 人关注过本帖
标题:求解,为什么删除的功能实现不了?
取消只看楼主 加入收藏
qq471402415
Rank: 2
等 级:论坛游民
帖 子:88
专家分:45
注 册:2013-12-3
结帖率:82.35%
收藏
已结贴  问题点数:20 回复次数:3 
求解,为什么删除的功能实现不了?
#include<string.h>
#include<stdio.h>
#include<malloc.h>
#define ERROR 0
#define OK 1
#define FALSE 0
#define MAXSIZE 10000000

typedef struct LNode
{
    //定义记录书籍的结构体
    char ISBN[20];//定义图书的ISBN码
    char  name[20];//定义图书的名字
    char auth[20];//定义图书的作者
    char output[20];//定义图书的出版社
    char outday[20];//定义图书的出版日期
    char  money[20];//定义图书的价格
    int   num;//定义图书的册数
    struct  LNode *next;
} LNode,*LinkList;
typedef struct Book
{
    //定义记录书籍信息的结构体数组
    char ISBN[20];//定义图书的ISBN码
    char  name[20];//定义图书的名字
    char auth[20];//定义图书的作者
    char output[20];//定义图书的出版社
    char outday[20];//定义图书的出版日期
    char  money[20];//定义图书的价格
    int   num;//定义图书的册数
} book[MAXSIZE];
book ook;
int Write_To_File(LinkList &L)
{
    //将链表中的数据输入文本中储存
    FILE *fp;//定义文件指针
    LinkList p=L;
    if((fp=fopen("book.txt","w"))==NULL) //以写的方式打开
    {
        printf("打开文件失败\n");
        return FALSE;
    }
    p=p->next;
    while( p!=NULL)//判断链表是否读到末尾了
    {

        fprintf(fp,"%s\t%s\t%s\t%s\t%s\t%s\t%d\n",p->ISBN,p->name,p->auth,p->output,p->outday,p->money,p->num);//把数据输入到文本中
        p= p->next;//指针后移
    }
    if(fclose(fp))//关闭文件
    {
        printf("关闭文件失败\n");
        exit(0);
    }
    return OK;
}
int Read_From_File(LinkList &L)//从文本中把数据读到链表中
{
    FILE *fp;
//    char ch;
    LinkList s,p=L;//定义指针p指向头结点
    if((fp = fopen("book.txt","r"))==NULL) //以读的方式打开
    {
        printf("打开文件失败\n");
        return FALSE;
    }
    p->next=NULL;
    while(!feof(fp)) //判断文件是否读到文件末尾
    {
        s=(LinkList)malloc(sizeof(LNode));//生成新结点
        fscanf(fp,"%s%s%s%s%s%s%d",s->ISBN,s->name,s->auth,s->output,s->outday,s->money,&s->num);//从文件中读取数据放到链表中
        if(feof(fp)) break;
        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= L;//定义一个指针指向头结点
    return OK;
}
int Seek_Book_ISBN(LinkList &L)//查找图书
{
    LinkList p=L;
    char isbn[20];
    printf("请输入你要增加的图书的ISBN码,以回车结束:\n");
    scanf("%s",isbn);
    while (p!=NULL)  //当指针不为空的时候继续向后查找
    {

        if(strcmp(isbn,p->ISBN)==0) break;
        p=p->next;
    }
    if(p==NULL) return OK;
}

int List_Book_Delete_L(LinkList &L, char ISBN[20])   //在带头结点的单链线性表L中,删除相应ISBN码的图书。
{
    LinkList p,q;
    p = L;
    int e=0;
    char isbn[20];
    printf("请输入你要删除图书的ISBN码,以回车键结束\n");
    scanf("%s",isbn);
    while (p!=NULL)  //当指针不为空的时候继续向后查找
    {

        if(strcmp(isbn,p->ISBN)==0) //判断该ISBN码是否存在,如果存在删除它
        {
            if(p->next==NULL) free(p);//判断P是不是最后一个结点
            else{
            q=p->next;
            p->next=q->next;
            free(q);}
            e=1;
            break;
        }
        p=p->next;

    }

    if(e==0)
    {
        printf("此图书不存在\n");
        exit(0);
    }
    return OK;
}


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);//把数据从链表中储存到文本中
}

int main()
{
  Detele_Book();
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   while (p!=NULL)  //当指针不为空的时候继续向后查找
    {

        if(strcmp(isbn,p->ISBN)==0) //判断该ISBN码是否存在,如果存在删除它
        {
//            if(p->next==NULL) free(p);//判断P是不是最后一个结点
//            else
            q=p->next;
            p->next=q->next;
            free(q);
            e=1;
            break;
     }
        p=p->next;

    }
~~~~~~~~~~~~~~~~~~这个样子的话,有多个结点时,可以正常删除,但是只有一个结点时就会报错;~~~~~~
   if(strcmp(isbn,p->ISBN)==0) //判断该ISBN码是否存在,如果存在删除它
        {
            if(p->next==NULL) free(p);//判断P是不是最后一个结点
            else{
            q=p->next;
            p->next=q->next;
            free(q);}
            e=1;
            break;
        }
        p=p->next;

    }
~~~~~~~~~~~~~~~~~~~~~~~~~~~加了特判,可是错得更加严重了~~~求大神教导
搜索更多相关主题的帖子: include 出版社 结构体 money 
2014-04-14 13:45
qq471402415
Rank: 2
等 级:论坛游民
帖 子:88
专家分:45
注 册:2013-12-3
收藏
得分:0 
回复 2楼 ying8501
#include<string.h>
#include<stdio.h>
#include<malloc.h>
#define ERROR 0
#define OK 1
#define FALSE 0
#define MAXSIZE 10000000
typedef struct LNode
{
    //定义记录书籍的结构体
    char ISBN[20];//定义图书的ISBN码
    char  name[20];//定义图书的名字
    char auth[20];//定义图书的作者
    char output[20];//定义图书的出版社
    char outday[20];//定义图书的出版日期
    char  money[20];//定义图书的价格
    int   num;//定义图书的册数
    struct  LNode *next;
} LNode,*LinkList;
typedef struct Book
{
    //定义记录书籍信息的结构体数组
    char ISBN[20];//定义图书的ISBN码
    char  name[20];//定义图书的名字
    char auth[20];//定义图书的作者
    char output[20];//定义图书的出版社
    char outday[20];//定义图书的出版日期
    char  money[20];//定义图书的价格
    int   num;//定义图书的册数
} book[MAXSIZE];
book ook;
int Seek_Book_Publish(book &ook )//把文件中的数据载入数组中,查找该出版社的所有图书
{
    FILE *fp;
    int i=0,j=0,e=0,count=1;
    char output[20];
    if((fp = fopen("book.txt","r"))==NULL) //以读的方式打开
    {
        printf("打开文件失败\n");
        return FALSE;
    }
    while(!feof(fp)) //判断文件是否读到文件末尾
    {
        fscanf(fp,"%s%s%s%s%s%s%d",ook[i].ISBN,ook[i].name,ook[i].auth,ook[i].output,ook[i].outday,ook[i].money,&ook[i].num);//从文件中读取数据放到链表中

        i++;
        j++;
    }
    if(fclose(fp))//关闭文件
    {
        printf("关闭文件失败\n");
        return FALSE;
    }
    printf("请输入你要找的出版社名称:");
    scanf("%s",output);
    for(i=0; i<=j; i++)//查找该出版社所有图书的算法
        if(strcmp(output,ook[i].output)==0)
        {
            printf("第%d本:\n",count);
            printf("该书的ISBN码是:");
            printf("%s\n",ook[i].ISBN);
            printf("该书的名字是  :");
            printf("%s\n",ook[i].name);
            printf("该书的作者是  :");
            printf("%s\n",ook[i].auth);
            printf("该书的出版社  :");
            printf("%s\n",ook[i].output);
            printf("该书出版日期是:");
            printf("%s\n",ook[i].outday);
            printf("该书的售价是  :");
            printf("%s\n",ook[i].money);
            printf("该图书的册数是:");
            printf("%d\n",ook[i].num);
            e=1;
            count++;
            printf("\n");
        }
    if(e==0) printf("不存在该出版社的图书:\n");
    return OK;
}
int Seek_Book_auth(book ook )//把文件中的数据载入数组中,查找该作者的所有图书
{
    FILE *fp;
    int i=0,j=0,e=0,count=1;
    char auth[20];
    if((fp = fopen("book.txt","r"))==NULL) //以读的方式打开
    {
        printf("打开文件失败\n");
        return FALSE;
    }
    while(!feof(fp)) //判断文件是否读到文件末尾
    {
        fscanf(fp,"%s%s%s%s%s%s%d",ook[i].ISBN,ook[i].name,ook[i].auth,ook[i].output,ook[i].outday,ook[i].money,&ook[i].num);//从文件中读取数据放到链表中

        i++;
        j++;
    }
    if(fclose(fp))//关闭文件
    {
        printf("关闭文件失败\n");
        return FALSE;
    }
    printf("请输入你要找的作者名称:");
    scanf("%s",auth);
    for(i=0; i<=j; i++)//查找该出版社所有图书的算法
        if(strcmp(auth,ook[i].auth)==0)
        {
            printf("第%d本:\n",count);
            printf("该书的ISBN码是:");
            printf("%s\n",ook[i].ISBN);
            printf("该书的名字是  :");
            printf("%s\n",ook[i].name);
            printf("该书的作者是  :");
            printf("%s\n",ook[i].auth);
            printf("该书的出版社  :");
            printf("%s\n",ook[i].output);
            printf("该书出版日期是:");
            printf("%s\n",ook[i].outday);
            printf("该书的售价是  :");
            printf("%s\n",ook[i].money);
            printf("该图书的册数是:");
            printf("%d\n",ook[i].num);
            e=1;
            count++;
            printf("\n");
        }
    if(e==0) printf("不存在该作者的图书:\n");
    return OK;
}
int Seek_Book_name(book ook )//把文件中的数据载入数组中,按照图书名称查找
{
    FILE *fp;
    int i=0,j=0,e=0,count=1;
    char name[20];
    if((fp = fopen("book.txt","r"))==NULL) //以读的方式打开
    {
        printf("打开文件失败\n");
        return FALSE;
    }
    while(!feof(fp)) //判断文件是否读到文件末尾
    {
        fscanf(fp,"%s%s%s%s%s%s%d",ook[i].ISBN,ook[i].name,ook[i].auth,ook[i].output,ook[i].outday,ook[i].money,&ook[i].num);//从文件中读取数据放到链表中

        i++;
        j++;
    }
    if(fclose(fp))//关闭文件
    {
        printf("关闭文件失败\n");
        return FALSE;
    }
    printf("请输入你要找的图书名称:");
    scanf("%s",name);
    for(i=0; i<=j; i++)//查找该出版社所有图书的算法
        if(strcmp(name,ook[i].name)==0)
        {
            printf("第%d本:\n",count);
            printf("该书的ISBN码是:");
            printf("%s\n",ook[i].ISBN);
            printf("该书的名字是  :");
            printf("%s\n",ook[i].name);
            printf("该书的作者是  :");
            printf("%s\n",ook[i].auth);
            printf("该书的出版社  :");
            printf("%s\n",ook[i].output);
            printf("该书出版日期是:");
            printf("%s\n",ook[i].outday);
            printf("该书的售价是  :");
            printf("%s\n",ook[i].money);
            printf("该图书的册数是:");
            printf("%d\n",ook[i].num);
            e=1;
            count++;
            printf("\n");
        }
    if(e==0) printf("不存在该你要找的图书:\n");
    return OK;
}

int Seek_Book_isbn (book ook )//把文件中的数据载入数组中,按照图书isbn码查找
{
    FILE *fp;
    int i=0,j=0,e=0;
    char isbn[20];
    if((fp = fopen("book.txt","r"))==NULL) //以读的方式打开
    {
        printf("打开文件失败\n");
        return FALSE;
    }
    while(!feof(fp)) //判断文件是否读到文件末尾
    {
        fscanf(fp,"%s%s%s%s%s%s%d",ook[i].ISBN,ook[i].name,ook[i].auth,ook[i].output,ook[i].outday,ook[i].money,&ook[i].num);//从文件中读取数据放到链表中

        i++;
        j++;
    }
    if(fclose(fp))//关闭文件
    {
        printf("关闭文件失败\n");
        return FALSE;
    }
    printf("请输入你要找的图书的ISBN:");
    scanf("%s",isbn);
    for(i=0; i<=j; i++)//查找该出版社所有图书的算法
        if(strcmp(isbn,ook[i].ISBN)==0)
        {
            printf("\n");
            printf("该书的名字是  :");
            printf("%s\n",ook[i].name);
            printf("该书的作者是  :");
            printf("%s\n",ook[i].auth);
            printf("该书的出版社  :");
            printf("%s\n",ook[i].output);
            printf("该书出版日期是:");
            printf("%s\n",ook[i].outday);
            printf("该书的售价是  :");
            printf("%s\n",ook[i].money);
            printf("该图书的册数是:");
            printf("%d\n",ook[i].num);
            e=1;
            printf("\n");
        }
    if(e==0) printf("不存在该你要找的图书:\n");
    return OK;
}

int Write_To_File(LinkList &L)
{
    //将链表中的数据输入文本中储存
    FILE *fp;//定义文件指针
    LinkList p=L;
    if((fp=fopen("book.txt","w"))==NULL) //以写的方式打开
    {
        printf("打开文件失败\n");
        return FALSE;
    }
    p=p->next;
    while( p!=NULL)//判断链表是否读到末尾了
    {

        fprintf(fp,"%s\t%s\t%s\t%s\t%s\t%s\t%d\n",p->ISBN,p->name,p->auth,p->output,p->outday,p->money,p->num);//把数据输入到文本中
        p= p->next;//指针后移
    }
    if(fclose(fp))//关闭文件
    {
        printf("关闭文件失败\n");
        exit(0);
    }
    return OK;
}
int Read_From_File(LinkList &L)//从文本中把数据读到链表中
{
    FILE *fp;
//    char ch;
    LinkList s,p=L;//定义指针p指向头结点
    if((fp = fopen("book.txt","r"))==NULL) //以读的方式打开
    {
        printf("打开文件失败\n");
        return FALSE;
    }
    p->next=NULL;
    while(!feof(fp)) //判断文件是否读到文件末尾
    {
        s=(LinkList)malloc(sizeof(LNode));//生成新结点
        fscanf(fp,"%s%s%s%s%s%s%d",s->ISBN,s->name,s->auth,s->output,s->outday,s->money,&s->num);//从文件中读取数据放到链表中
        if(feof(fp)) break;
        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 Seek_Book_ISBN(LinkList &L)//查找图书
{
    LinkList p=L;
    char isbn[20];
    printf("请输入你要增加的图书的ISBN码,以回车结束:\n");
    scanf("%s",isbn);
    while (p!=NULL)  //当指针不为空的时候继续向后查找
    {

        if(strcmp(isbn,p->ISBN)==0) break;
        p=p->next;
    }
    if(p==NULL) return OK;
}
int Link_Book_Insert_L(LinkList &L)
{
    // 在带头结点的单链线性表L中末尾之前插入新增加的图书信息
    LinkList p=L,s;
    s=(LinkList)malloc(sizeof(LNode));
    printf("请输入该书的ISBN码  :");
    scanf("%s",s->ISBN);
    printf("请输入该书的名字是  :");
    scanf("%s",s->name);
    printf("请输入该书的作者是  :");
    scanf("%s",s->auth);
    printf("请输入该书的出版社  :");
    scanf("%s",s->output);
    printf("请输入该书出版日期  :");
    scanf("%s",s->outday);
    printf("请输入该书的售价是  :");
    scanf("%s",s->money);
    printf("请输入该图书的册数 :");
    scanf("%d",&s->num);//从键盘录入图书信息
    printf("\n");
    s->next=p->next;
    p->next=s;
    p=p->next;
    return OK;
}//LinkInsert_L

int LoadLink_L(LinkList &L)
{
    // 单链表遍历
    LinkList p=L;
    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;
    int e=0;
    char isbn[20];
    printf("请输入你要删除图书的ISBN码,以回车键结束\n");
    scanf("%s",isbn);
    while (p!=NULL)  //当指针不为空的时候继续向后查找
    {

        if(strcmp(isbn,p->ISBN)==0) //判断该ISBN码是否存在,如果存在删除它
        {
            if(p->next==NULL) free(p);//当只有一个节点时
            else{
            q=p->next;
            p->next=q->next;
            free(q);}
            e=1;
            break;
        }
        p=p->next;

    }

    if(e==0)
    {
        printf("此图书不存在\n");
        exit(0);
    }
    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];
    int num1;
    LinkList p=L;
    printf("请输入你要修改图书的ISBN码,以回车键结束\n");
    scanf("%s",isbn);
    while (p!=NULL)  //当指针不为空的时候继续向后查找
    {

        if(strcmp(isbn,p->ISBN)==0)  //判断该ISBN码是否存在
        {
            printf("要修改图书的ISBN码: %s\n",p->ISBN);
            printf("要修改图书的名字是: %s\n",p->name);
            printf("要修改图书的作者是: %s\n",p->auth);
            printf("要修改图书的出版社: %s\n",p->output);
            printf("要修改图书出版日期: %s\n",p->outday);
            printf("要修改图书的售价是: %s\n",p->money);
            printf("要修改图书的册数是: %d\n",p->num);
            break;
        }
        p=p->next;
    }
    if(p==NULL)
    {
        printf("此图书不存在\n");
        exit(0);
    }
    else
        printf("\n");
    printf("请输入该书的ISBN码  :");
    scanf("%s",isbn);
    printf("请输入该书的名字是  :");
    scanf("%s",name1);
    printf("请输入该书的作者是  :");
    scanf("%s",auth1);
    printf("请输入该书的出版社  :");
    scanf("%s",output1);
    printf("请输入该书出版日期  :");
    scanf("%s",outday1);
    printf("请输入该书的售价是  :");
    scanf("%s",money1);
    printf("请输入该图书的册数 :");
    scanf("%d",&num1);//从键盘输入修改的图书信息
    strcpy(p->ISBN,isbn);
    strcpy( p->name,name1);
    strcpy(p->auth,auth1) ;
    strcpy(p->output,output1);
    strcpy(p->outday,outday1);
    strcpy(p->money,money1);
    p->num=num1;
    printf("\n");
    printf("修改后该书的ISBN码:%s\n",p->ISBN);
    printf("修改后该书的名字是:%s\n",p->name);
    printf("修改后该书的作者是:%s\n",p->auth);
    printf("修改后该书的出版社:%s\n",p->output);
    printf("修改后该书出版日期:%s\n",p->outday);
    printf("修改后该书的售价是:%s\n",p->money);
    printf("要修改图书的册数是:%d\n",p->num);

    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);//从文本中把数据读到链表中
    if(Seek_Book_ISBN(T)==1)
    {
        printf("此图书未存在:\n");
        Link_Book_Insert_L(T);//新增图书新
        Write_To_File(T);//把数据从链表中储存到文本中
    }
    else
        printf("此图书已存在:\n");

}
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);//把数据从链表中储存到文本中
}
void search_Book()//查找图书
{
    int i;
    printf("1:按出版社查找\t2:按作者名称查找\t3:按图书名称查找\t4:按照图书的ISBN码查找\t请选择:\n");
    scanf("%d",&i);
    switch(i)
    {
    case 1:
        Seek_Book_Publish(ook );
        break;
    case 2:
        Seek_Book_auth(ook );
        break;
    case 3:
        Seek_Book_name( ook );
        break;
    case 4:
        Seek_Book_isbn( ook );
        break;
    default:
        printf("你是输入有误:\n");
    }
}
int main()
{
    int i;
    printf("1:增加图书\t2:修改图书信息\t3:删除图书\t4:查找图书\t请选择\n");
    scanf("%d",&i);
    switch(i)
    {
    case 1:
        Insert_Book_xinx();
        break;
    case 2:
        Change_Book_xinxi();
        break;
    case 3:
        Detele_Book();
        break;
    case 4:
        search_Book();
        break;
    default:
        printf("~~~~~~~");
    }
    return OK;


}
~~~~~~~~~~~~能不能帮我调试一下~~~搞死我了~·其他的都没问题,就删除有问题~~
2014-04-14 21:08
qq471402415
Rank: 2
等 级:论坛游民
帖 子:88
专家分:45
注 册:2013-12-3
收藏
得分:0 
谢谢了~~大一的渣渣搞了这个问题好久,从你们的代码学到了好多~~
2014-04-15 00:08
qq471402415
Rank: 2
等 级:论坛游民
帖 子:88
专家分:45
注 册:2013-12-3
收藏
得分:0 
谢谢了~~大一的渣渣搞了这个问题好久,从你们的代码学到了好多~~
2014-04-15 00:08
快速回复:求解,为什么删除的功能实现不了?
数据加载中...
 
   



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

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