写点什么

开源一夏 | 数据结构课设:图书信息管理 -- 顺序存储和链式存储

作者:是Dream呀
  • 2022 年 8 月 02 日
  • 本文字数:3915 字

    阅读完需:约 13 分钟


@TOC

一、Chapter One【实验题目】

在本实验中,我选择了两种存储结构(顺序存储和链式存储)来对图书信息表的修改问题进行描述,即:3.基于顺序存储结构的图书信息表的修改问题描述 和 13.基于链式存储结构的图书信息表的修改问题描述。

1.基于顺序存储结构的图书信息表的修改问题描述

3.基于顺序存储结构的图书信息表的修改问题描述首先,定义一个包含图书信息(书号、书名、价格)的顺序表,读入相应的图书数据完成图书信息表的创建。然后,计算所有图书的平均价格,将所有低于平均价格的图书价格提高 20%,所有高于或等于平均价格的图书价格提高 10%。最后,逐行输出价格修改后的图书信息。


输入要求输入 n+1 行,前 n 行是 n 本图书的信息(书号、书名、价格),每本图书信息占一行,书号、书名、价格用空格分隔,价格之后没有空格。最后,第 n+1 行是输入结束标志:000(空格分隔的三个 0)。其中书号和书名为字符串类型,价格为浮点数类型。输出要求总计 n+l 行,第 1 行是修改前所有图书的平均价格,后 n 行是价格修改后 n 本图书的信息(书号、书名、价格),每本图书信息占一行,书号、书名、价格用空格分隔。其中,价格输出保留两位小数。


输入样例


9787302257646程序设计基础 25.009787302164340程序设计基础(第2版) 20.009787302219972单片机技术及应用 32.009787302203513单片机原理与应用技术 26.009787810827430工业计算机控制技术——原理与应用 29.009787811234923 汇编语言程序设计教程 21.000 0 0
复制代码


输出样例


25.509787302257646程序设计基础  30.009787302164340程序设计基础(第2版)  24.00  9787302219972单片机技术及应用  35.209787302203513 单片机原理与应用技术  28.609787810827430工业计算机控制技术——原理与应用  31.909787811234923汇编语言程序设计教程  25.20
复制代码

2.基于链式存储结构的图书信息表的修改问题描述

13.基于链式存储结构的图书信息表的修改问题描述首先,定义一个包含图书信息(书号、书名、价格)的链表,读入相应的图书数据完成图书信息表的创建。然后,计算所有图书的平均价格,将所有低于平均价格的图书价格提高 20%,所有高于或等于平均价格的图书价格提高 10%。最后,逐行输出价格修改后的图书信息。


输入要求输入 n+1 行,前 n 行是 n 本图书的信息(书号、书名、价格),每本图书信息占一行,书号、书名、价格用空格分隔,价格之后没有空格。最后第 nt1 行是输人结束标志:000(空格分隔的三个 0)。其中,书号和书名为字符串类型,价格为浮点数类型。输出要求总计 n+1 行,第 1 行是修改前所有图书的平均价格,后 n 行是价格修改后 n 本图书的信息,每本图书信息占一行,书号、书名、价格用空格分隔。其中,价格输出保留两位小数。


输入样例


9787302257646程序设计基础  25.009787302164340程序设计基础(第2版)  20.009787302219972单片机技术及应用  32.009787302203513 单片机原理与应用技术  26.009787810827430工业计算机控制技术——原理与应用29.009787811234923 汇编语言程序设计教程  21.000 0 0
复制代码


输出样例


25.509787302257646程序设计基础30.009787302164340程序设计基础(第2版)24.009787302219972单片机技术及应用35.209787302203513单片机原理与应用技术28.609787810827430工业计算机控制技术——原理与应用31.909787811234923 汇编语言程序设计教程25.20
复制代码

二、Chapter Two【实验分析】

1.实验整体思路:

分别用顺序存储和链式存储建立线性表,即图书信息表,通过函数创建线性表,初始化线性表,进行线性表的输入和输出。此时的图书平均价格就是我们创建所有图书价格相加再除以图书本数。接下来我们遍历两遍线性表,第一遍求出图书平均价格,第二次每本书的价格和平均价格逐个进行对比,大于等于平均价格的将图书价格乘以 1.1,小于则乘以 1.2,最后通过输入输出便可得到我们修改之后的数据。

2.实验详细步骤:

1.首先,我们利用 #include 和 #define 表明我们需要的头文件和宏,然后定义出一本书的信息;2.对于顺序存储结构,我们首先创建出顺序存储的图书信息表,然后定义 Init()函数初始化线性表,通过定义 Insert()函数输入图书数据,再通过 Output()函数输出图书信息表;最后通过 Upprice()函数实现对图书价格的修改;3.同理对于链式存储结构,我们首先创建出链式存储图书信息表的结点,然后定义 Linit()函数初始化线性表,通过定义 lInsert()函数利用头插法输入图书数据,再通过 LinkOutput()函数输出图书信息表;最后通过 LinkUpprice()函数实现对图书价格的修改;4.最后,因为我们选择的是两种存储结构进行图书修改表的描述,我们在程序最后使用 if 语句进行两种存储结构的选择:1.顺序存储 2.链式存储;再通过对函数的调用来完成我们对图书价格的修改。

三、Chapter Three【运行截图】

1.顺序存储结构:

2.链式存储结构:

四、Chapter Four【源码详析】

#include <stdio.h>//头文件 #include <malloc.h>#include <string.h>#include <algorithm> typedef int status;//函数状态#define ERRER 0//错误#define OVERFLOW -2//溢出#define OK 1//完成 typedef struct //一本书的信息 {  char ID[20];//书号的长度  char Name[50];//书名的长度,  float price;//价格  }BOOK;typedef struct //图书信息表 (顺序存储){  BOOK *elem;//一本书  int length;//线性表的长度}BOOKlist;status Init(BOOKlist &L)//初始化线性表(顺序存储){  L.elem=(BOOK *)malloc(sizeof(BOOK)*20);//分配线性表空间, 线性表的长度是20   if (!L.elem) exit(OVERFLOW);//空间分配失败,退出   L.length=0;//线性表长度初始化为0  return OK;//空间分配完成 }status Insert(BOOKlist &L)//输入图书数据(顺序存储) {  int i=1;  while(1)  {    if (i>20) exit(OVERFLOW);//输入图书信息数超过最大值,退出      scanf ("%s %s %f",L.elem[i].ID,L.elem[i].Name,&L.elem[i].price);//输入图书数据         if (!strcmp(L.elem[i].ID,"0")&&!strcmp(L.elem[i].Name,"0"),L.elem[i].price==0) break;//输入0 0 0则停止输入      i++;  }  L.length=i-1;  return OK;}status Output(BOOKlist &L)//输出图书信息表(顺序存储) {  for (int i=1;i<=L.length;i++)  {    printf ("%s %s %.2f\n",L.elem[i].ID,L.elem[i].Name,L.elem[i].price);//输出图书信息表       }  return OK;}
status Upprice(BOOKlist &L)//提高图书价格(顺序存储) { float Average=0;//平均价格 for (int i=1;i<=L.length;i++) { Average+=L.elem[i].price;//计算所有书的总价格 } Average/=L.length;//所有书的平均价格=总价/书本数量 for (int i=1;i<=L.length;i++) { if (L.elem[i].price>=Average) L.elem[i].price*=1.1;//高于或等于平均价格的图书价格提高 10% else if (L.elem[i].price<Average) L.elem[i].price*=1.2;//低于平均价格的图书价格提高20% } printf ("%.2f\n",Average);//输出平均价格 return OK;}
typedef struct LinkBOOKlist//图书信息表的一个结点(链式存储){ BOOK elem;//数据域:存一本书的信息 LinkBOOKlist *next;//指针域:指向下一本书的地址 }LinkBOOKlist,*link;status Linit (link &L)//初始化线性表(链式存储){ L=(link)malloc(sizeof(LinkBOOKlist));//分配结点空间 if (!L) exit(OVERFLOW);//空间分配失败,退出 L->next=NULL;//下一本书的地址为空 return OK;//空间分配完成 }status lInsert (link L)//头插法输入图书数据(链式存储){ while (1) { link p =(link) malloc(sizeof(LinkBOOKlist));//新建结点并分配空间 if (!p) exit(OVERFLOW);//空间分配失败,退出 scanf ("%s %s %f",p->elem.ID,p->elem.Name,&p->elem.price);//输入一本图书的信息 if (!strcmp(p->elem.ID,"0")&&!strcmp(p->elem.Name,"0")&&p->elem.price==0) break;//输入0 0 0则停止输入 p->next=L->next;//将新建结点插入线性表 L->next=p; } return OK;}status LinkOutput (link L)//输出图书信息表 (链式存储){ link p=L->next; while (p!=NULL) { printf ("%s %s %.2f\n",p->elem.ID,p->elem.Name,p->elem.price);//输出图书信息表 p=p->next; } return OK;}
status LinkUpprice(link &L)//提高图书价格(链式存储) { int num=0;//图书数量 float Average=0;//图书平均价格 link p=L->next; while (p!=NULL)//遍历线性表 { Average+=p->elem.price;//计算图书总价 num++;//统计图书数量 p=p->next; } Average/=num;//图书均价=总价/图书数量 p=L->next; while (p!=NULL) { if (p->elem.price>=Average) p->elem.price*=1.1;//所有高于或等于平均价格的图书价格提高10% else if (p->elem.price<Average) p->elem.price*=1.2;//所有低于平均价格的图书价格提高20% p=p->next; } printf ("%.2f\n",Average);//输出图书均价 return OK;}int main(){ int i; // 此处设置一个选择函数 选择顺序存储方式或者链式存储方式。 printf ("选择存储方式:1.顺序存储 2.链式存储\n"); scanf("%d",&i); if (i==1) { //分别调用四个函数,完成图书价格的修改 BOOKlist L; Init(L); Insert(L); Upprice(L); Output(L); } else if (i==2) { //分别调用四个函数,完成图书价格的修改 link L; Linit(L); lInsert(L); LinkUpprice(L); LinkOutput(L); } return 0;}
复制代码


用户头像

是Dream呀

关注

Python领域优质创作者 2021.03.30 加入

2021年度博客之星TOP100,2021年度领域TOP5 Python领域优质创作者,交流、合作、学习,欢迎私信我VX+++ 一万次悲伤,依然会有Dream,我一直在最温暖的地方等你!

评论

发布
暂无评论
开源一夏 | 数据结构课设:图书信息管理--顺序存储和链式存储_开源_是Dream呀_InfoQ写作社区