注:该程序为大二的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"); } }