基于链式存储的图书管理系统

基于链式存储的图书管理系统
6和7无法出现正确的结果
不知道哪里出错了

#include
#include
#include
#include
void menu()
{
    printf("|====================================|\n");
    printf("|======欢迎使用图书管理系统==========|\n");
    printf("|======1.创建并输出图书信息==========|\n");
    printf("|======2.降序排序图书信息============|\n");
    printf("|======3.计算平均值==================|\n");
    printf("|======4.图书的逆序存储==============|\n");
    printf("|======5.图书的最贵查找==============|\n");
    printf("|======6.图书的最爱查找==============|\n");
    printf("|======7.图书的按位置查找============|\n");
    printf("|======8.新图书入库==================|\n");
    printf("|======9.旧图书出库==================|\n");
    printf("\n");
}
typedef struct
{
    char no[20];
    char name[50];
    float price;
}book;
typedef struct Book
{
    book data;
    struct Book *next;
}Book;
typedef struct
{
    Book* head;
    Book* tail;
    int length;
}SqList;
//初始化
int InitList_Sq(SqList *L)
{
    L->head=(Book*)malloc(sizeof(Book));
    L->head->next=NULL;
    L->tail=L->head;
    L->length=0;
    return 0;
}
//图书信息的输入
int Input_Sq(SqList *L)
{
    Book* p;
    while(1)
    {
        p=(Book*)malloc(sizeof(Book));
        if(!p)exit(-1);
        scanf("%s",p->data.no);
        scanf("%s",p->data.name);
        scanf("%f",&p->data.price);
        if(!strcmp(p->data.no,"0")&&!strcmp(p->data.name,"0")&&p->data.price==0)
        {
            break;
        }
        L->tail->next=p;
        L->tail=p;
        L->length++;
    }
    L->tail->next=NULL;
    return 0;
}
//图书信息的输出
int Output_Sq(SqList *L)
{
    Book* p;
    if(L->length==0)
    {
        printf("库中没有图书\n");
        return -1;
    }
    p=L->head->next;
    printf("%d\n",L->length);
    while(p!=NULL)
    {
        printf("%s ",p->data.no);
        printf("%s ",p->data.name);
        printf("%.02f\n",p->data.price);
        p=p->next;
    }
    return 0;
}
//按价格降序
int Sort_Sq(SqList *L)
{
    Book *p;
    for(int i=0;ilength;i++)
    {
        p=L->head->next;
        int j=0;
        while(p&&jlength-1-i)
        {
            if(p->data.pricenext->data.price)
            {
                book t=p->data;
                p->data=p->next->data;
                p->next->data=t;
            }
            p=p->next;
            j++;
        }
    }
    return 0;
}
//图书信息的修改
int RevisePrice_Sq(SqList *L)
{
    int num=0;
    float Avg_price=0;
    Book *p,*q;
    p=L->head->next;
    q=L->head->next;
    while(p)
    {
        Avg_price+=p->data.price;
        num++;
        p=p->next;
    }
    Avg_price/=num;
    while(q)
    {
        if(q->data.price>=Avg_price)
        {
            q->data.price*=1.2;
        }
        else
        {
            q->data.price*=1.1;
        }
        q=q->next;
    }
    return 0;
}
//图书的逆序存储
int Reversed_Sq(SqList *L)
{
    Book* p;
    p=L->head->next;
    L->head->next=NULL;
    while(p)
    {
        Book* q;
        q=p->next;
        p->next=L->head->next;
        L->head->next=p;
        p=q;
    }
    return 0;
}
//查找最贵图书
int Expensive_Sq(SqList *L)
{
    Book *p;
    p=L->head->next;
    Book* max=p;
    Book* maxs[3];
    while(p)
    {
        if(p->data.price>max->data.price)
        {
            max=p;
        }
        p=p->next;
    }
    p=L->head->next;
    int k=0;
    while(p)
    {
        if(p->data.price==max->data.price)
        {
            maxs[k]=p;
            k++;
        }
        p=p->next;
    }
    printf("%d\n",k);
    int i=0;
    while(maxs[i]&&iprintf("%s ",maxs[i]->data.no);
        printf("%s ",maxs[i]->data.name);
        printf("%.02f\n",maxs[i]->data.price);
        i++;
    }
    return 0;
}
//查找最爱图书
int Favour_Sq(SqList *L)
{
    Book* Fbook[5];
    int n;
    scanf("%d",&n);
    book Fbookname[n];
    for(int i=0;i"%s",Fbookname[i].name);
    }
    Book* p;
    int k=0;
    for(int j=0;j0;
        p=L->head->next;
        while(p)
        {
            if(p->data.name==Fbookname[j].name)
            {
                Fbook[k]=p;
                k++;
            }
            p=p->next;
        }
        if(k==0)
        {
            printf("抱歉,没有找到您要的书!\n");
        }
        else
        {
            printf("%d\n",k);
            for(int i=0;iprintf("%s ",Fbook[i]->data.no);
                printf("%s ",Fbook[i]->data.name);
                printf("%.02f\n",Fbook[i]->data.price);
            }
        }
    }
    return 0;
}
//图书的按位置查找
int Select_Sq(SqList *L)
{
    int num;
    scanf("%d",&num);
    int add[num];
    int flag=0;
    Book *p,*Found;
    for(int i=0;i"%d",add+i);
    }
    for(int i=0;i0;
        p=L->head->next;
        while(p)
        {
            if(add[i]>0&&add[i]length)
            {
                Found=p;
                flag=1;
            }
            p=p->next;
        }
        if(flag==0)
        {
            printf("查无此书!\n");
        }
        else
        {
            printf("%s ",Found->data.no);
            printf("%s ",Found->data.name);
            printf("%.02f\n",Found->data.price);
        }
    }
    return 0;
}
//新图书入库
int Insert_Sq(SqList *L)
{
    int n;
    scanf("%d",&n);
    book Ibook;
    scanf("%s",Ibook.no);
    scanf("%s",Ibook.name);
    scanf("%f",&Ibook.price);
    if(n<1||n>L->length)
    {
        printf("插入位置错误,请重新输入:\n");
    }
    else
    {
        Book *p;
        p=L->head;
        int j=0;
        while(p&&(j1))
        {
            p=p->next;
            j++;
        }
        Book *s;
        s=(Book *)malloc(sizeof(Book));
        s->data=Ibook;
        s->next=p->next;
        p->next=s;
        L->length++;
    }
    return 0;
}
//旧图书出库
int Delete_Sq(SqList *L)
{
    int num;
    scanf("%d",&num);
    if(num>L->length||num<1)
    {
        printf("输入位置错误,请重新输入:\n");
    }
    else
    {
        Book* p;
        p=L->head;
        Book* q;
        int j=0;
        while(p&&(j1))
        {
            p=p->next;
            j++;
        }
        q=p->next;
        p->next=q->next;
        free(q);
        L->length--;
    }
    return 0;
}
int main()
{
    menu();
    SqList *L;
    L=(SqList*)malloc(sizeof(SqList));
    InitList_Sq(L);
    int choice;
    scanf("%d",&choice);
    switch(choice)
    {
        case 1:Input_Sq(L);
        Output_Sq(L);
        break;
        case 2:Input_Sq(L);
        Sort_Sq(L);
        Output_Sq(L);
        break;
        case 3:Input_Sq(L);
        RevisePrice_Sq(L);
        Output_Sq(L);
        break;
        case 4:Input_Sq(L);
        Reversed_Sq(L);
        Output_Sq(L);
        break;
        case 5:Input_Sq(L);
        Expensive_Sq(L);
        break;
        case 6:Input_Sq(L);
        Favour_Sq(L);
        break;
        case 7:Input_Sq(L);
        Select_Sq(L);
        break;
        case 8:Input_Sq(L);
        Insert_Sq(L);
        Output_Sq(L);
        break;
        case 9:Input_Sq(L);
        Delete_Sq(L);
        Output_Sq(L);
        break;
        default:printf("输入有误,请重新输入\n");
    }
    return 0;
}

写了这么多才想起来找错误啊。
要记住,写一点调试对了,再接着写。因为这样错误的范围就局限在你刚写的那些里面。

  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/698904
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:关于函数调用返回引用错误并且每次调用不一致的分析与解决
  • 除此之外, 这篇博客: 6 数据的表现形式常量以及常量的几种类型中的 数据的表现形式常量以及常量的几种类型 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 摘要:数据的表现形式常量以及常量的几种类型,结合常量类型编写程序求长方形的面积;

    一、常量
    (基础教材第24页)

    常量:在程序运行过程中,其值不能被改变的量。
    整型常量就是整常数,可以是十进制、八进制或十六进制三种。
    前缀指定基数:0x 或 0X 表示十六进制,0 表示八进制,不带前缀则默认表示十进制。
    (1)十进制整常数:十进制整常数没有前缀,其数码为0~9;
    例如:以下都是合法的十进制整常数:
    2020,529, 724, -97,922,1024
    以下各数不是合法的十进制整常数:
    097(不能有前缀0),97H(含有非十进制数码H)

    (2)八进制整常数:八进制整常数必须以0开头,即前缀为0,数码取值为0~7,八进制数通常是无符合数。
    例如:以下都是合法的八进制数:
    015(转成十进制后为13)、0101(转成十进制后为65)、0177777(转成十进制后为65535);
    以下各数不是合法的八进制数:
    256(无前缀),03A2(包含了非八进制数码),-0127(出现了负号)

    (3)十六进制整常数:前缀为0X或0x,数码取值0~9, A~F或a~f。
    例如:以下各数都是合法的十六进制整常数:
    0X2A(转成十进制为42),0XA0(转成十进制为160),0xffff(转成十进制为65535)
    以下各数不是合法的十六进制整常数:
    5a(无前缀),0x3H(含有非十六进制数码)

    十进制无符号整常数范围0~65535,有符号数范围-32768~+32767;
    八进制无符号数表示范围0~0177777;
    十六进制无符号数表示范围0X0~0XFFFF.

    整数常量也可以带一个后缀,后缀是 U 和 L 的组合,U 表示无符号整数(unsigned),L 表示长整数(long)。后缀可以是大写,也可以是小写,U 和 L 的顺序任意。

    下面列举几个整数常量的实例:

    212         /* 合法的 */
    215u        /* 合法的 */
    0xFeeL      /* 合法的 */
    078         /* 非法的:8 不是八进制的数字 */
    032UU       /* 非法的:不能重复后缀 */
    

    以下是各种类型的整数常量的实例:

    85         /* 十进制 */
    0213       /* 八进制 */
    0x4b       /* 十六进制 */
    30         /* 整数 */
    30u        /* 无符号整数 */
    30l        /* 长整数 */
    30ul       /* 无符号长整数 */
    

    二、实型常量
    实型也称为浮点型。实型常量也称为实数或浮点数。实数在c语言中有两种形式:十进制小数形式、指数形式;
    (1)十进制小数形式:由0~9和小数点组成(必须有小数点):
    例如:0.0、25.0、3.14、0.13、5.0、300. 、-267.8230
    (2)指数形式:由十进制数和阶码标志“e”或“E”以及阶码组成:
    一般形式: a e n(a为十进制数,n为十进制整数) 其值为a*10^n(a乘以10的n次方)
    例如:2.1e5
    3.7E-2
    0.5E7
    -2.8E-12
    以下不是合法的实数:
    345
    E7
    -5
    53.-E3
    2.7e

    在c语言中有时候会看到例如356f这个数,他和356. (注意356后有个小数点)是等价的

    三、字符常量
    用单引号括起来的一个字符
    例如‘a’、‘b’、‘=’、‘+’、‘?’ 都是合法的字符常量。

    注意:

    1. 字符常量只能用单引号,不能用其他括号;
    2. 字符常量只能是单个字符,不能是字符串;
    3. 字符可以是字符集中的任意字符,但是当数字被定义为字符后表示的是这个数字对应的ASCII码值。例如‘5’和5是不同的,‘5’是字符常量,表示53(其对应的ASCII码值为53)。

    转义字符:
    是一种特殊的字符常量,以反斜线\开头,后跟一个或几个字符(书上p26)。转义字符具有特定的含义,例如,Printf()输出函数中的\n就是一个转义字符,代表换行;

    在这里插入图片描述
    举例:
    在这里插入图片描述
    输出:
    在这里插入图片描述
    四、字符串常量
    用双引号括起来的若干的字符,例如 “hyh”、“lovely”;
    字符串的字符个数称为字符串的长度。例如“hyh”长度为3,长度为零的字符串称为空串。

    五、符号常量
    例如:

    #define PI 3.14

    程序举例:
    例题:使用define定义符号常量,求长方形面积;
    在这里插入图片描述
    编译、连接、执行:
    在这里插入图片描述
    程序分析:
    1、使用define函数在开头定义长方形长(LENGTH)和宽(WIDTH),注意结尾不用打分号;
    2、因为该题目中长和宽分别为10和5,都是整数,其乘积也是整数,故定义一个整型常量area,表示长乘以宽的值;
    3、结合长方形面积公式,表示area、length和width的关系,赋值给area;
    4、输出长方形面积。

    注意:
    define定义符号常量,结尾不需要分号“;”,而C语句要以分号“;”结尾。

  • 您还可以看一下 王西猛老师的商超收银软件排队挂单取单编程思路教程课程中的 点餐软件开发过程中的挂单取单编程概述小节, 巩固相关知识点