基于线性表的图书信息管理实验

简介: 基于线性表的图书信息管理实验

注:该程序为大二的c语言的结构设计课程的实验设计

【实验内容】

图书信息表包括以下几项常用的基本操作:图书信息表的创建和输出、排序、修改、删除信息。实验要求分别利用顺序表和链表实现上述操作,因此,实验内容总计包括8道题目,其中前4道要求基于顺序表实现相应的功能,后4道要求基于链表实现相应的功能。

问题描述

定义一个包含图书信息(书号、书名、价格)的顺序表,读入相应的图书数据来完成图书信息表的创建。然后,统计图书表中的图书个数,同时逐行输出每本图书的信息。

输入要求

1、图书信息表的创建和输出

输人n+l行,其中前n行是n本图书的信息(书号、书名、价格),每本图书信息占一行,书号、书名、价格用空格分隔,价格之后没有空格。最后第n+1行是输入结束标志:0 0 0(空格分隔的3个0)。其中,书号和书名为字符串类型,价格为浮点数类型。

输出要求

总计输出n+1行,第1行是所创建的图书信息表中的图书本数,后n行是n本图书的信息(书号、书名、价格),每本图书信息占一行,书号、书名、价格用空格分隔。其中,价格输出保留两位小数。

2.按价格降序或升序排列;

3.方案一:按书号修改;方案二:按书名修改

4.方案一:按书号删除;方案二:按书名删除;方案三:按位置删除;

【实验提示】

图书信息结构体描述

struct      //图书信息定义
{ 
   char no[20];     //图书ISBN
   char name[50];   //图书名字
   float price;       //图书价格
}Book; 

顺序存储结构体定义:

typedef struct
{ 
   Book *elem;               //存储空间的基地址 
   int length;    //图书表中当前图书个数 
}SqList;    //图书表的顺序存储结构类型为SqList

链式存储结构体定义:

typedef struct Lnode
{
     Book   data;       //数据域
     struct LNode  *next;   //指针域
}LNode,*LinkList; 

实验操作步骤及核心代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义图书信息结构体
typedef struct {
    int bookNumber;
    char bookTitle[100];
    float price;
} BookInfo;
// 函数声明
void createBookTable(BookInfo **table, int *size);
void printBookTable(const BookInfo *table, int size);
void sortBookTable(BookInfo *table, int size, int ascending);
void modifyBookInfo(BookInfo *table, int size);
void deleteBookInfo(BookInfo **table, int *size);
int main() {
    int size = 0;
    BookInfo *table = NULL;
    int choice, ascending;
    while (1) {
        printf("\n图书信息管理系统\n");
        printf("1. 创建图书信息表\n");
        printf("2. 输出图书信息表\n");
        printf("3. 排序图书信息表\n");
        printf("4. 修改图书信息\n");
        printf("5. 删除图书信息\n");
        printf("6. 退出\n");
        printf("请选择操作: ");
        scanf("%d", &choice);
        switch (choice) {
            case 1:
                createBookTable(&table, &size);
                break;
            case 2:
                printBookTable(table, size);
                break;
            case 3:
                printf("请选择排序方式(1升序,0降序): ");
                scanf("%d", &ascending);
                sortBookTable(table, size, ascending);
                break;
            case 4:
                modifyBookInfo(table, size);
                break;
            case 5:
                deleteBookInfo(&table, &size);
                break;
            case 6:
                free(table); // 释放内存
                return 0;
            default:
                printf("无效的选择,请重新选择。\n");
        }
    }
    return 0;
}
// 创建图书信息表
void createBookTable(BookInfo **table, int *size) {
    int capacity = 10; // 初始容量
    int currentSize = 0;
    // 为图书信息表分配内存
    *table = (BookInfo *)malloc(capacity * sizeof(BookInfo));
    if (*table == NULL) {
        printf("内存分配失败\n");
        return;
    }
    printf("请输入图书信息(书号 书名 价格,输入0 0 0结束输入)\n");
    while (1) {
        int bookNumber;
        char bookTitle[100];
        float price;
        scanf("%d %s %f", &bookNumber, bookTitle, &price);
        if (bookNumber == 0 && price == 0) {
            break;
        }
        // 检查是否需要扩展内存
        if (currentSize == capacity) {
            capacity *= 2;
            *table = (BookInfo *)realloc(*table, capacity * sizeof(BookInfo));
            if (*table == NULL) {
                printf("内存分配失败\n");
                return;
            }
        }
        (*table)[currentSize].bookNumber = bookNumber;
        strcpy((*table)[currentSize].bookTitle, bookTitle);
        (*table)[currentSize].price = price;
        currentSize++;
    }
    *size = currentSize;
    printf("图书信息表创建完成\n");
}
// 输出图书信息表
void printBookTable(const BookInfo *table, int size) {
    printf("图书信息表(共%d本书):\n", size);
    for (int i = 0; i < size; i++) {
        printf("%d %s %.2f\n", table[i].bookNumber, table[i].bookTitle, table[i].price);
    }
}
// 排序图书信息表
void sortBookTable(BookInfo *table, int size, int ascending) {
    // 使用冒泡排序,也可以使用其他排序算法
    for (int i = 0; i < size - 1; i++) {
        for (int j = 0; j < size - i - 1; j++) {
            if ((ascending && table[j].price > table[j + 1].price) ||
                (!ascending && table[j].price < table[j + 1].price)) {
                // 交换两个元素
                BookInfo temp = table[j];
                table[j] = table[j + 1];
                table[j + 1] = temp;
            }
        }
    }
    printf("图书信息表已排序\n");
}
// 修改图书信息
void modifyBookInfo(BookInfo *table, int size) {
    int choice;
    printf("请选择修改方式(1按书号修改,2按书名修改): ");
    scanf("%d", &choice);
    if (choice == 1) {
        int bookNumber;
        printf("请输入要修改的图书的书号: ");
        scanf("%d", &bookNumber);
        for (int i = 0; i < size; i++) {
            if (table[i].bookNumber == bookNumber) {
                printf("请输入新的书号 书名 价格: ");
                scanf("%d %s %f", &table[i].bookNumber, table[i].bookTitle, &table[i].price);
                printf("图书信息已修改\n");
                return;
            }
        }
        printf("未找到指定书号的图书\n");
    } else if (choice == 2) {
        char bookTitle[100];
        printf("请输入要修改的图书的书名: ");
        scanf("%s", bookTitle);
        for (int i = 0; i < size; i++) {
            if (strcmp(table[i].bookTitle, bookTitle) == 0) {
                printf("请输入新的书号 书名 价格: ");
                scanf("%d %s %f", &table[i].bookNumber, table[i].bookTitle, &table[i].price);
                printf("图书信息已修改\n");
                return;
            }
        }
        printf("未找到指定书名的图书\n");
    } else {
        printf("无效的选择\n");
    }
}
// 删除图书信息
void deleteBookInfo(BookInfo **table, int *size) {
    int choice;
    printf("请选择删除方式(1按书号删除,2按书名删除): ");
    scanf("%d", &choice);
    if (choice == 1) {
        int bookNumber;
                printf("请输入要删除的图书的书号: ");
        scanf("%d", &bookNumber);
        int found = 0;
        for (int i = 0; i < *size; i++) {
            if ((*table)[i].bookNumber == bookNumber) {
                // 将找到的图书删除,将最后一本图书覆盖到当前位置
                (*table)[i] = (*table)[(*size) - 1];
                (*size)--;
                found = 1;
                printf("图书信息已删除\n");
                break;
            }
        }
        if (!found) {
            printf("未找到指定书号的图书\n");
        }
    } else if (choice == 2) {
        char bookTitle[100];
        printf("请输入要删除的图书的书名: ");
        scanf("%s", bookTitle);
        int found = 0;
        for (int i = 0; i < *size; i++) {
            if (strcmp((*table)[i].bookTitle, bookTitle) == 0) {
                // 将找到的图书删除,将最后一本图书覆盖到当前位置
                (*table)[i] = (*table)[(*size) - 1];
                (*size)--;
                found = 1;
                printf("图书信息已删除\n");
                break;
            }
        }
        if (!found) {
            printf("未找到指定书名的图书\n");
        }
    } else {
        printf("无效的选择\n");
    }
}
目录
相关文章
|
6月前
|
开发框架 关系型数据库 MySQL
0030Java程序设计-积分管理系统论文
0030Java程序设计-积分管理系统论文
28 0
|
4天前
|
SQL 前端开发 测试技术
图书馆信息管理系统(总)(下)
图书馆信息管理系统(总)(下)
18 3
|
4天前
|
存储 编解码 Java
图书馆信息管理系统(总)(中)
图书馆信息管理系统(总)(中)
25 2
|
4天前
|
安全 测试技术 数据库
图书馆信息管理系统(总)(上)
图书馆信息管理系统(总)(上)
19 3
|
9月前
|
C#
图书借阅管理系统(C#课程设计)
图书借阅管理系统(C#课程设计)
85 0
|
10月前
|
Windows
学生信息管理信息系统--添加窗体(学籍,课程,班级,成绩)问题汇总
学生信息管理信息系统--添加窗体(学籍,课程,班级,成绩)问题汇总
|
存储 算法 Java
图的操作和应用之景区信息管理系统(数据结构课程设计)
0001:图的操作和应用之景区信息管理系统(C++版数据结构课程设计) 现有一个景区,景区里面有若干个景点,景点之间满足以下条件: (1) 某些景点之间铺设了道路(相邻) (2) 这些道路都是可以双向行驶的(无向图) (3) 从任意一个景点出发都可以游览整个景区(连通图) 开发景区信息管理系统,对景区的信息进行管理。使用图的数据结构来保存景区景点信息,为用户提供创建图、查询景点信息、旅游景点导航、搜索最短路径、铺设电路规划等功能。 文章目录0001:图的操作和应用之景区信息管理系统(C++版数据结构课程设
图的操作和应用之景区信息管理系统(数据结构课程设计)
|
C语言
队列实现图书信息管理(C语言)
队列实现图书信息管理(C语言)
31 0
|
前端开发 数据库
【学生管理系统】班级管理
【学生管理系统】班级管理
187 0
【学生管理系统】班级管理
|
SQL 前端开发 Java
图书模板之按分类查询图书 | 学习笔记
快速学习图书模板之按分类查询图书
图书模板之按分类查询图书 | 学习笔记