输入第一个数据后无法查询第一个数据,要插入第二个数据才能查第一个数据,但第二个数据又不能查找了,插入三个数据也是只有一个数据可以完成查询

这个代码的问题在于我输入第一个数据后无法查询第一个数据,要插入第二个数据才能查第一个数据,但第二个数据又不能查找了,插入三个数据也是只有一个数据可以完成查询,知识有限,无法改正,如果能帮忙,多谢!

#include "stdio.h"    
#include "string.h"
#include "ctype.h"      
#include "stdlib.h"   

/*结构体定义Book,将名字、作者、出版社、ISBN号、价格定义成数组并储存进去 */
typedef struct Book {
    char name[50];
    char author[20];
    char press[30];
    char ISBN[20];
    float price;
    struct Book* next;/*定义下一本书的后继结点,用于构建单链表*/

}Book;/*结构体变量*/

Book* head = NULL;/*头结点,全局变量*/


/*1实现插入函数*/
void   insert()
{
    /*动态分配内存*/
    Book* p = (Book*)malloc(sizeof(Book));

    /*记录插入书籍的信息*/
    printf("请输入书名:\n");       scanf_s("%s", p->name, 50);
    printf("请输入作者名:\n");   scanf_s("%s", p->author, 20);
    printf("请输入出版社:\n");   scanf_s("%s", p->press, 30);
    printf("请输入ISBN号:\n");  scanf_s("%s", p->ISBN, 20);
    printf("请输入价格:");           scanf_s("%f", &p->price);
    /*插入后续结点*/
    p->next = head;
    head = p;
}

/*2实现查询函数*/
void search()
{
    char word[50];
    printf("请输入关键字:");
    scanf_s("%s", word, 50);
    Book* p = head->next;
    while (p != NULL)
    {
        /*查询关键步骤,运用程序strcmp比较实现查找*/
        if (strcmp(p->name, word) == 0 || strcmp(p->author, word) == 0 || strcmp(p->ISBN, word) == 0)
        {
            printf("%s  %s  %s  %s  %f\n", p->name, p->author, p->press, p->ISBN, p->price);
        }
        p = p->next;/*及时填空,终止while语句*/
        return 0;
    }
    printf("未找到此图书\n");
}

/*3实现删除函数*/
void delete()
{
    char ISBN[20];
    printf("请输入ISBN号:");     scanf_s("%s", ISBN, 20);
    Book* p = head->next;         Book* previous = head;/*记录前一个结点,便于删除*/
    while (p != NULL)
    {
        if (strcmp(p->ISBN, ISBN) == 0)/*一个为结构体中的ISBN,一个是该函数定义的数组*/
        {
            head->next = p->next;
            free(p);
            printf("删除成功!\n");
            return  0;
        }
        previous = p;
        p = p->next;
    }
    printf("未找到对应图书信息!\n");
}

/*4实现修改函数*/
void modify()
{
    char ISBN[20];
    printf("请输入ISBN号:");   scanf_s("%s", ISBN, 20);
    Book* p = head->next;
    while (p != NULL)
    {
        if (strcmp(p->ISBN, ISBN) == 0)
        {
            printf("请输入书名:");      scanf_s("%s", p->name, 50);
            printf("请输入作者名:");  scanf_s("%s", p->author, 20);
            printf("请输入出版社:");  scanf_s("%s", p->press, 30);
            printf("请输入价格:");      scanf_s("%f", &p->price);
            printf("修改成功!\n");
            return 0;
        }
        p = p->next;
    }
    printf("未找到对应图书信息!\n");
}

/*主函数*/
int main()
{
    head = (Book*)malloc(sizeof(Book));/*创建头结点*/
    head->next = NULL;
    int choice;
    do
    {
        printf("====图书管理系统====\n");
        printf("1.插入新的图书信息\n");
        printf("2.查询图书信息\n");
        printf("3.删除图书信息\n");
        printf("4.修改图书信息\n");
        printf("0.退出系统\n");
        printf("请输入您的选择:\n");
        scanf_s("%d", &choice);
        /*操作系统程序*/
        switch (choice)
        {
        case 1:insert(); break;
        case 2:search(); break;
        case 3:delete(); break;
        case 4:modify(); break;
        case 0:printf("欢迎再次使用!\n");
            break;
        default:printf("输入有误,请重新输入!\n"); break;
        }
    } while (choice != 0);
    return 0;
}

main()里面head是一个空book,第一个节点没具体内容
insert()里面,新book放链首,即链表最后一个节点没具体内容
search()里面,初始p=head->next,即从得二个节点开始查。如果找到一本就结束,return放if里面;如果找出所有的,就加一个布尔变量,找到后设置为true,循环结束布尔为false才输出没找到

  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7809739
  • 这篇博客也不错, 你可以看下输入一个三位以内正整数,判断是几位数并分离出每一位数
  • 除此之外, 这篇博客: 拆分一个链表为偶数链表和奇数链表中的 设计一个算法,将一个结点值为自然数的单链表拆分为两个单链表,原表中保留值为偶数的结点,而值为奇数的结点按他们在原表中的相对次数组成一个新的单链表 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • #include <stdio.h>
    #include <stdlib.h>
    #include <malloc.h>
    #define FLAG -1    //停止输入的标志
    typedef struct Node
    {
        int data;
        struct Node * next;
    }LNode,*LinkList;
    
    void CreateLinkList(LinkList L);
    void show_List(LinkList L);
    LNode *Breakupthelist(LinkList La,int *A,int *B);
    
    void main()
    {
        LinkList La,Lb;
        int A = 0,B = 0;
        La = (LinkList)malloc(sizeof(LNode));//创建头结点
        printf("创建单链表:\n");
        CreateLinkList(La);
        printf("遍历单链表:\n");
        show_List(La);
        printf("拆分链表:\n");
        Lb = Breakupthelist(La,&A,&B);//A,B用来判断全是奇数或全是偶数的情况
        if(A == 0)//全是偶数
        {
            printf("偶数链:\n");
            show_List(La);
            printf("奇数链为空!\n");
        }
        else if(B == 0)//全是奇数
        {
            printf("奇数链:\n");
            show_List(Lb);
            printf("偶数链为空!\n");
        }
        else
        {
            printf("偶数链:\n");
            show_List(La);
            printf("奇数链:\n");
            show_List(Lb);
        }
    
    
    }
    
    void CreateLinkList(LinkList L)  //尾插法  输出是输入的正序
    {
        LinkList s,r;
        int x;
        scanf("%d",&x);
        r = L;
        while(x != FLAG)
        {
            s = (LNode *)malloc(sizeof(LNode));
            s->data = x;
            r->next = s;
            r = s;
            scanf("%d",&x);
        }
        r->next = NULL;
    }
    
    void show_List(LinkList L)
    {
        LinkList p = L->next;
        printf("%d",p->data);
        p = p ->next;
        while(p != NULL)
        {
            printf("->%d",p->data);
            p = p->next;
        }
        printf("\n");
    }
    
    LNode *Breakupthelist(LinkList La,int *A,int *B) //返回奇数链表的头结点
    {
        LinkList p,q,r;//r始终指向偶数链的尾部
        LinkList Lb = (LinkList)malloc(sizeof(LNode));
        p = La;
        q = Lb;
        r = La;
        p = p->next;
        while(p)
        {
            if(p->data % 2 != 0) //奇数
            {
                q->next = p;
                p = p->next;
                r->next = p;
                q = q->next;
                *A = 1;
            }
            else
            {
                p = p->next;
                r = r->next;
                *B = 1;
            }
        }
        q->next = NULL;
        return Lb;
    }
    
  • 您还可以看一下 李月喜老师的企业微信开发自建内部应用开发篇课程中的 开发文档如何阅读,如何寻求帮助,如何找到同行小节, 巩固相关知识点