#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include <stdlib.h>
#include<string.h>
#include <algorithm>
using namespace std;//排序函数
#define TURE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define LIST_MAXSIZE 1000//定义图表的最大长度
//定义图书表的顺序储存结构
//定义图书信息
typedef struct {
char no[20];//ISBN
char name[50];//书名
float price;//价格
} Book;
typedef struct node//用于链表去重
{
long long int no;
char name[50];
double price;
struct node* next;
} Book1, * BookList;
//定义顺序储存结构类型
typedef struct {
Book* elem;//储存空间基地址
int length;//当前图书个数
} SqList;
typedef int ElemType;
//初始化一个顺序表
ElemType InitList_SqList(SqList& L) {
L.elem = (Book*)malloc(LIST_MAXSIZE * sizeof(Book));//分配空间
if (!L.elem)//分配失败
{
exit(OVERFLOW);
}
L.length = 0;//空表长度为0
return OK;
}
//顺序表输入
ElemType ListInsert(SqList& L) {
int i = 1;
while (1) {
if (i > LIST_MAXSIZE)//输入图书信息数超过最大值,退出
{
exit(OVERFLOW);
}
scanf("%s %s %f", L.elem[i].no, L.elem[i].name, &L.elem[i].price);//输入图书数据
if (!strcmp(L.elem[i].no, "0") && !strcmp(L.elem[i].name, "0") && L.elem[i].price == 0) {
break;//输入结束标志0 0 0,表示停止输入
}
i++;
}
L.length = i - 1;
return i - 1;
}
//顺序表输出
ElemType ListOutput(SqList& L) {
for (int i = 1; i <= L.length; i++) {
printf("%s %s %.2f\n", L.elem[i].no, L.elem[i].name, L.elem[i].price);//输出图书信息表
}
return OK;
}
//顺序表排序
bool cmp(Book L1, Book L2) {//按照价格降序排序
if (L1.price > L2.price)
return true;
else
return false;
}
ElemType SqSort(SqList& L) {//排序(顺序存储)
sort(&(L.elem[1]), &(L.elem[L.length + 1]), cmp);
return OK;
}
//顺序表修改价格
ElemType SqList_Price(SqList& L) {
float avg = 0;//平均价格
for (int i = 1; i <= L.length; i++) {
avg += L.elem[i].price;//计算所有书的总价格
}
avg /= L.length;//所有书的平均价格=总价/书本数量
for (int i = 1; i <= L.length; i++) {
if (L.elem[i].price >= avg)//高于或等于平均价格的图书价格提高 10%
{
L.elem[i].price *= 1.1;
}
else if (L.elem[i].price < avg)//低于平均价格的图书价格提高20%
{
L.elem[i].price *= 1.2;
}
}
printf("%.2f\n", avg);//输出平均价格
return OK;
}
//顺序表找最贵的书
ElemType SqList_Max(SqList& L) {
int n;//图书数目
printf("请输入数据:\n");
scanf("%d", &n);//输入图书数目
InitList_SqList(L); //初始化线性表
L.length = n;//给线性表中的图书数目赋值
if (n < 1 || n > LIST_MAXSIZE)
return OK;
int i = 1;
while (i <= n) {
scanf("%s %s %f", L.elem[i].no, L.elem[i].name, &L.elem[i].price);//输入图书信息表
i++;
}
int maxprice[LIST_MAXSIZE];//最贵图书在线性表中的编号
int len = 0, max = 0;//len:最贵图书的数目 max:最贵图书价格
printf("\n");
printf("--------------------------------------------\n");
printf("\n");
printf("输出的结果为:\n");
for (int i = 1; i <= n; i++)//查找最贵图书并记录其在线性表中的编号
{
if (L.elem[i].price > max)//找到更贵的图书
{
len = 1;//更贵图书的数目记为1
maxprice[len] = i;//记录更贵图书在线性表中的编号
max = L.elem[i].price;//修改最贵图书价格
}
else if (max == L.elem[i].price)//找到下一本最贵图书
{
len++;//最贵图书的数目加1
maxprice[len] = i;//记录更贵图书在线性表中的编号
}
}
printf("%d\n", len);//输出最贵图书的数目
for (int i = 1; i <= len; i++)//输出最贵图书的信息
{
int j;
j = maxprice[i];
printf("%s %s %.2f\n", L.elem[j].no, L.elem[j].name, L.elem[j].price);//根据编号输出最贵图书的信息
}
return OK;
//也可以采用顺序表删除
}
//顺序表图书位置查找
ElemType SqList_Place(SqList& L) {
int n;//图书数量
int i, j;
Book b[LIST_MAXSIZE];
printf("请输入数据\n");
scanf("%d", &n);
for (i = 1; i <= n; i++) {
scanf("%s %s %f", &b[i].no, &b[i].name, &b[i].price);
}
int m;//查找m次
scanf("%d", &m);
int b_1[LIST_MAXSIZE];
for (int k = 0; k < m; k++) {
scanf("%d", &b_1[k]);
}
printf("\n");
printf("--------------------------------------------\n");
printf("\n");
printf("输出的结果为:\n");
for (int k = 0; k < m; k++) {
for (j = 1; j <= n; j++) {
if (b_1[k] == j)//对应位置并输出
{
printf("%s %s %.2f\n", b[j].no, b[j].name, b[j].price);
}
}
if (b_1[k] > i || b_1[k] < 1)//位置不存在
{
printf("抱歉,最佳位置上的图书不存在!\n");
}
}
return OK;
}
//顺序表新书入库
ElemType SqList_Enter(SqList& L) {
int n, j, i;
Book in_b;
printf("请输入数据\n");
scanf("%d", &n);
for (j = 1; j <= n; j++) {
scanf("%s %s %f", L.elem[j].no, L.elem[j].name, &L.elem[j].price);
}
L.length = n;
scanf("%d", &i);
if ((i < 1) || (i > L.length + 1) || (i == LIST_MAXSIZE)) {
printf("\n");
printf("--------------------------------------------\n");
printf("\n");
printf("抱歉,入库位置非法!\n");//i值不合法
return ERROR;
}
else {
scanf("%s %s %f", &in_b.no, &in_b.name, &in_b.price);
printf("\n");
printf("--------------------------------------------\n");
printf("\n");
printf("输出的结果为:\n");
for (j = L.length; j >= i; j--) {
L.elem[j + 1] = L.elem[j];//插入位置及之后的元素右移
}
L.elem[i] = in_b;//将新元素e放入第i个位置
++L.length;//表长加1
for (j = 1; j <= L.length; j++) {
printf("%s %s %.2f\n", L.elem[j].no, L.elem[j].name, L.elem[j].price);//输出图书信息表
}
return OK;
}
}
//顺序表旧书出库
ElemType SqList_Output(SqList& L) {
int n, j, i;
printf("请输入数据\n");
scanf("%d", &n);
for (j = 1; j <= n; j++) {
scanf("%s %s %f", L.elem[j].no, L.elem[j].name, &L.elem[j].price);
}
L.length = n;
scanf("%d", &i);
if ((i < 1) || (i > L.length)) {
printf("\n");
printf("--------------------------------------------\n");
printf("\n");
printf("抱歉,出库位置非法!\n");//i值不合法
return ERROR;
}
else {
printf("\n");
printf("--------------------------------------------\n");
printf("\n");
printf("输出的结果为:\n");
for (j = i + 1; j <= n; j++) {
L.elem[j - 1] = L.elem[j];//删除位置及之后的元素左移
}
--L.length;//表长减1
for (j = 1; j <= L.length; j++) {
printf("%s %s %.2f\n", L.elem[j].no, L.elem[j].name, L.elem[j].price);//输出图书信息表
}
return OK;
}
}
//顺序表去重
ElemType SqList_Repeat(SqList& L) {
int n, j, i, t;
printf("请输入数据\n");
scanf("%d", &n);
for (j = 1; j <= n; j++)//输入
{
scanf("%s %s %f", L.elem[j].no, L.elem[j].name, &L.elem[j].price);
}
L.length = n;
for (i = 1; i <= n; i++)//书号循环对比
{
for (j = i + 1; j <= n; j++) {
if (!strcmp(L.elem[i].no, L.elem[j].no))//重复删除
{
for (t = j + 1; t <= n; t++) {
L.elem[t - 1] = L.elem[t];//删除位置及之后的元素左移
}
--n;//表长减1
--j;
}
}
}
printf("\n");
printf("--------------------------------------------\n");
printf("\n");
printf("输出的结果为:\n");
printf("%d\n", n);
for (j = 1; j <= n; j++) {
printf("%s %s %.2f\n", L.elem[j].no, L.elem[j].name, L.elem[j].price);//输出图书信息表
}
return OK;
}
int main() {
int a;
printf("问题如下:\n");
printf("1、基于顺序表存储结构的图书信息表的创建和输出?\n");
printf("2、基于顺序表存储结构的图书信息表的修改?\n");
printf("3、基于顺序表存储结构的图书信息表的最贵图书的查找?\n");
printf("4、基于顺序表存储结构的图书信息表的新图书的入库?\n");
printf("5、基于顺序表存储结构的图书信息表的旧图书的出库?\n");
printf("6、基于顺序表存储结构的图书信息表的图书去重?\n");
printf("请输入你想查看的问题(输入数字):\n");
scanf("%d", &a);
if (a > 0 && a < 11) {//顺序表
switch (a) {
case 1: {//顺序表的创建和输出
SqList L;
InitList_SqList(L);
printf("请输入数据:\n");
int i;
i = ListInsert(L);
printf("\n");
printf("--------------------------------------------\n");
printf("\n");
printf("输出的结果为:\n");
printf("%d\n", i);
ListOutput(L);
break;
}
case 2: {//顺序表修改价格
SqList L;
InitList_SqList(L);
printf("请输入数据:\n");
ListInsert(L);
printf("\n");
printf("--------------------------------------------\n");
printf("\n");
printf("输出的结果为:\n");
SqList_Price(L);
ListOutput(L);
break;
}
case 3: {//找出最贵的书
SqList L;
SqList_Max(L);
break;
}
case 4: {//新图书的入库
SqList L;
InitList_SqList(L);
SqList_Enter(L);
break;
}
case 5: {//旧书出库
SqList L;
InitList_SqList(L);
SqList_Output(L);
break;
}
case 6: {//去重
SqList L;
InitList_SqList(L);
SqList_Repeat(L);
break;
}
}
}
system("pause");
return 0;
}
基于线性表的图书信息管理
一、实验目的
1.
掌握线性表的顺序存储表示和链式存储表示。
2.
掌握顺序表和链表的基本操作,包括创建、查找、插入和删除等算法。
3.
明确线性表两种不同存储结构的特点及其适用场合,明确它们各自的优缺
点。
二、实验内容
选用顺序表或链表实现下述线性表的的基本操作。
1.
基于顺序(链式)存储结构的图书信息表的创建和输出
问题描述
定义一个包含图书信息
(
书号、书名、价格
)
的顺序表(链表),读入相应的
图书数据来完成图书信息表的创建。然后,统计图书表中的图书个数,同时逐行
输出每本图书的信息。
输入要求
输入
n+1
行,其中前
n
行是
n
本图书的信息
(
书号、书名、价格
)
,每本图书
信息占一行,书号、书名、价格用空格分隔,价格之后没有空格。最后第
n+1
行是输入结束标志
:0 0 0(
空格分隔的三个
0)
。其中,书号和书名为字符串类型,
价格为浮点数类型。
输出要求
总计
n+1
行,第
1
行是所创建的图书信息表中的图书个数,后
n
行是
n
本图
书的信息
(
书号、书名、价格
)
,每本图书信息占一行,书号、书名、价格用空格
分隔。其中,价格输出保留两位小数。