文章目录
- 实验一 基于线性表的图书信息管理
-
- 一、实验目的
- 二、实验内容
-
- 1. 基于顺序(链式)存储结构的图书信息表的创建和输出
- 2.基于顺序(链式)存储结构的图书信息表的修改
- 3.基于顺序(链式)存储结构的图书信息表的最贵图书的查找
- 4.基于顺序(链式)存储结构的图书信息表的新图书的入库
- 5.基于顺序(链式)存储结构的图书信息表的旧图书的出库
- 6.基于顺序(链式)存储结构的图书信息表的图书去重(选做)
- 三、实验提示
- 代码
实验一 基于线性表的图书信息管理
一、实验目的
1.掌握线性表的顺序存储表示和链式存储表示。
2.掌握顺序表和链表的基本操作,包括创建、查找、插入和删除等算法。
3.明确线性表两种不同存储结构的特点及其适用场合,明确它们各自的优缺
点。
二、实验内容
选用顺序表或链表实现下述线性表的的基本操作。
1. 基于顺序(链式)存储结构的图书信息表的创建和输出
问题描述:
定义一个包含图书信息(书号、书名、价格)的顺序表(链表),读入相应的
图书数据来完成图书信息表的创建。然后,统计图书表中的图书个数,同时逐行
输出每本图书的信息。
输入要求:
输入 n+1 行,其中前n行是n本图书的信息(书号、书名、价格),每本图书
信息占一行,书号、书名、价格用空格分隔,价格之后没有空格。最后第n+1
行是输入结束标志:000(空格分隔的三个0)。其中,书号和书名为字符串类型,
价格为浮点数类型。
输出要求:
总计n+1行,第1行是所创建的图书信息表中的图书个数,后n行是n本图
书的信息(书号、书名、价格),每本图书信息占一行,书号、书名、价格用空格
分隔。其中,价格输出保留两位小数。
输入样例:
9787302257646 程序设计基础 25.00
9787302164340 程序设计基础(第2版)20.00
2
9787302219972 单片机技术及应用 32.00
9787302203513 单片机原理与应用技术 26.00
9787810827430 工业计算机控制技术–原理与应用 29.00
9787811234923 汇编语言程序设计教程 21.00
0 0 0
输出样例:
6
9787302257646 程序设计基础 25.00
9787302164340 程序设计基础(第2版)20.00
9787302219972 单片机技术及应用 32.00
9787302203513 单片机原理与应用技术 26.00
9787810827430 工业计算机控制技术–原理与应用 29.00
9787811234923 汇编语言程序设计教程 21.00
2.基于顺序(链式)存储结构的图书信息表的修改
问题描述:
首先,定义一个包含图书信息(书号、书名、价格)的顺序表(链表),读入
相应的图书数据完成图信息表的创建。然后,计算所有图书的平均价格,将所有
低于平均价格的图书价格提高20%,所有高于或等于平均价格的图书价格提高
10%。最后,逐行输出价格修改后的图书信息。
输入要求:
输入 n+1 行,其中前n行是n本图书的信息(书号、书名、价格),每本图书
信息占一行,书号、书名、价格用空格分隔,价格之后没有空格。最后第n+1
行是输入结束标志:000(空格分隔的三个0)。其中,书号和书名为字符串类型,
价格为浮点数类型。
输出要求:
总计n+2行,第1行是修改前所有图书的平均价格,第2行是所创建的图书信
息表中的图书个数,后n行是价格修改后n本图书的信息(书号、书名、价格)、
每本图书信息占一行,书号、书名、价格用空格分隔。其中,价格输出保留两位
小数。
输入样例:
9787302257646 程序设计基础 25.00
9787302164340 程序设计基础(第2版)20.00
9787302219972 单片机技术及应用 32.00
9787302203513 单片机原理与应用技术 26.00
9787810827430 工业计算机控制技术–原理与应用 29.00
9787811234923 汇编语言程序设计教程 21.00
0 0 0
输出样例:
25.50
6
9787302257646 程序设计基础 30.00
9787302164340 程序设计基础(第2版)24.00
9787302219972 单片机技术及应用 35.20
9787302203513 单片机原理与应用技术 28.60
9787810827430 工业计算机控制技术–原理与应用 31.90
9787811234923 汇编语言程序设计教程 25.20
3.基于顺序(链式)存储结构的图书信息表的最贵图书的查找
问题描述:
定义一个包含图书信息(书号、书名、价格)的顺序表(链表),读入相应的
图书数据来完成图书信息表的创建。然后,查找价格最高的图书,输出相应图书
的信息。
输入要求:
输入 n+1 行,其中前n行是n本图书的信息(书号、书名、价格),每本图书
信息占一行,书号、书名、价格用空格分隔,价格之后没有空格。最后第n+1
行是输入结束标志:000(空格分隔的三个0)。其中,书号和书名为字符串类型,
价格为浮点数类型。
输出要求:
总计输出m+1行,其中,第1行是最贵图书的数目m(价格最高的图书可能
有多本)。后m行是最贵图书的信息,每本图书信息占一行,书号、书名、价格
用空格分隔。其中,价格输出保留两位小数。
输入样例:
9787302257646 程序设计基础 25.00
9787302164340 程序设计基础(第2版)20.00
9787302219972 单片机技术及应用 32.00
9787302203513 单片机原理与应用技术 26.00
9787810827430 工业计算机控制技术–原理与应用 29.00
9787811230710 C#程序设计易懂易会教程 32.00
0 0 0
输出样例:
2
9787302219972 单片机技术及应用32.00
9787811230710 C#程序设计易懂易会教程 32.00
4.基于顺序(链式)存储结构的图书信息表的新图书的入库
问题描述:
首先,定义一个包含图书信息(书号、书名、价格)的顺序表(链表),读入
相应的图书数据来完成图书信息表的创建。然后,根据指定的待入库的新图书的
位置和信息,将新图书插入到图书表中指定的位置上。最后,输出新图书入库后
所有图书的信息。
输入要求:
输入 n+3 行,其中前n行是n本图书的信息(书号、书名、价格),每本图书
信息占一行,书号、书名、价格用空格分隔,价格之后没有空格。第n+1行是图
书输入结束标志:000(空格分隔的三个0)。其中,书号和书名为字符串类型,价
格为浮点数类型。之后输入第n+2行,内容仅为一个整数,代表待入库的新图书
的位置序号。最后,输入第n+3行,内容为新图书的信息,书号、书名、价格用
空格分隔。
输出要求:
若插入成功:
输出新图书入库后所有图书的信息(书号、书名、价格),总计n+2行,第1
行是入库后的图书数目,后n+1行每行是一本图书的信息,书号、书名、价格用
空格分隔。其中,价格输出保留两位小数。
若插入失败:
只输出以下提示:抱歉,入库位置非法!
输入样例:
9787302257646 程序设计基础 25.00
9787302164340 程序设计基础(第2版)20.00
9787302219972 单片机技术及应用 32.00
9787302203513 单片机原理与应用技术 26.00
9787810827430 工业计算机制技术原理与应用 29.00
9787811234923 汇编语言程序设计教程 21.00
0 0 0
2
9787302265436 计算机导论实验指导 18.00
6
输出样例:
7
9787302257646 程序设计基础 25.00
9787302265436 计算机导论实验指导 18.00
9787302164340 程序设计基础(第2版)20.00
9787302219972 单片机技术及应用 32.00
9787302203513 单片机原理与应用技术 26.00
9787810827430 工业计算机控制技术–原理与应用 29.00
9787811234923 汇编语言程序设计教程 21.00
5.基于顺序(链式)存储结构的图书信息表的旧图书的出库
问题描述:
定义一个包含图书信息(书号、书名、价格)的顺序表(链表),读入相应的
图书数据来完成图书信息表的创建。然后根据指定的待出库的旧图书的位置,将
该图书从图书表中删除。最后输出该图书出库后的所有图书的信息。
输入要求:
输入 n+2 行,其中前n行是n本图书的信息(书号、书名、价格),每本图书
信息占一行,书号、书名、价格用空格分隔,价格之后没有空格。第n+1行是图
书输入结束标志:000(空格分隔的三个0)。其中,书号和书名为字符串类型,价
格为浮点数类型。然后,输入第 n+2 行,内容仅为一个整数,代表待删除的旧
图书的位置序号。
输出要求
若删除成功:
输出旧图书出库后所有图书的信息(书号、书名、价格),总计n行,第1行
是出库后的图书数目,后n-1行是一本图书的信息,书号、书名、价格用空格分
隔。其中,价格输出保留两位小数。
若删除失败:
只输出以下提示:抱歉,出库位置非法!
输入样例:
9787302257646 程序设计基础 25.00
9787302164340 程序设计基础(第2版)20.00
9787302219972 单片机技术及应用 32.00
9787302203513 单片机原理与应用技术 26.00
9787810827430 工业计算机控制技术–原理与应用 29.00
9787811234923 汇编语言程序设计教程 21.00
0 0 0
2
输出样例:
5
9787302257646 程序设计基础 25.00
9787302219972 单片机技术及应用 32.00
9787302203513 单片机原理与应用技术 26.00
9787810827430 工业计算机控制技术–原理与应用 29.00
9787811234923 汇编语言程序设计教程 21.00
6.基于顺序(链式)存储结构的图书信息表的图书去重(选做)
问题描述:
出版社出版的任何一本图书的书号(ISBN)都是唯一的,即图书表中不允许包
含书号重复的图书。定义一个包含图书信息(书号、书名、价格)的顺序表(链表),
读入相应的图书数据来完成图书信息表的创建(书号可能重复)。然后进行图书的
去重,即删除书号重复的图书(只保留第一本)。最后输出去重后所有图书的信息。
输入要求
输入 n+1 行,其中前n行是n本图书的信息(书号、书名、价格),每本图书
信息占一行,书号、书名、价格用空格分隔,价格之后没有空格。最后第n+1
行是输入结束标志:000(空格分隔的三个0)。其中,书号和书名为字符串类型,
价格为浮点数类型。
输出要求:
总计输出 m+1行(m≤n),其中,第1行是去重后的图书数目。后m行是去重
后图书的信息(书号、书名、价格),每本图书信息占一行,书号、书名、价格
用空格分隔。其中,价格输出保留两位小数。
输入样例:
9787302257646 程序设计基础 25.00
9787302164340 程序设计基础(第2版)20.00
9787302219972 单片机技术及应用 32.00
9787302257646 程序设计基础 25.00
9787810827430 工业计算机控制技术–原理与应用 29.00
9787302219972 单片机技术及应用 32.00
0 0 0
输出样例:
4
9787302257646 程序设计基础 25.00
9787302164340 程序设计基础(第2版)20.00
9787302219972 单片机技术及应用32.00
9787810827430 工业计算机控制技术–原理与应用 29.00
三、实验提示
不同的存储结构对应的算法实现不同,下面分别给出图书信息表的顺序存储
结构和链式存储结构的定义。
根据图书所包含的基本信息,可以对图书信息的结构体描述如下:
#define MAXSIZE 10000 //图书表可能达到的最大长度
typedef 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; //LinkList 为指向结构体 LNode 的指针类型
代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXNUMS 20
#define MAXNAME 50
typedef struct Book //存储单本书信息的结构体
{
char nums[MAXNUMS]; //书号
char name[MAXNAME]; //书名
float price; //价格;
}Book;
typedef struct List
{
Book node;
struct List *next;
}BookList;
//创建一个头结点,方便后续操作
BookList *init()
{
BookList *head = (BookList *)malloc(sizeof(BookList));
head->next = NULL;
head->node.price = 0; //存储书的本数
return head;
}
//1. 基于链式存储结构的图书信息表的创建和输出
void insert(BookList **head)
{
BookList *pr = *head;
if(pr==NULL)
{
*head = init();
}
printf("请输入图书的信息(输入结束标志:0 0 0)\n");
while(1)
{
BookList * newbook = (BookList *)malloc(sizeof(BookList));
newbook->next = NULL;
scanf("%s %s %f",(newbook->node).nums,(newbook->node).name,&(newbook->node).price);
if(strcmp((newbook->node).nums,"0")==0 && strcmp((newbook->node).name,"0")==0 && (newbook->node).price == 0)
break;
BookList *p = *head;
p->node.price++; //若没有输入0 0 0,则添加书的信息,书的本数+1
while(p->next) //遍历到尾节点,将尾节点的指针指向新建结点
p = p->next;
p->next = newbook;
}
}
void print(BookList *head)
{
BookList *p = head->next;
printf("%.f\n",head->node.price);
while(p)
{
printf("%s %s %0.2f\n",p->node.nums,p->node.name,p->node.price);
p = p->next;
}
}
//2.基于顺序(链式)存储结构的图书信息表的修改
void change(BookList *head)
{
float PriceSum = 0; //价格总和
BookList *p = head->next;
int nums = (int)head->node.price;
while(p)
{
PriceSum += p->node.price;
p = p->next;
}
p = head->next;
PriceSum /= nums;
printf("%.2f\n",PriceSum);
while(p)
{
if(PriceSum > p->node.price)
p->node.price *= 1.2;
else if(PriceSum <= p->node.price)
p->node.price *= 1.1;
p = p->next;
}
}
// 3.基于顺序(链式)存储结构的图书信息表的最贵图书的查找
void findmax(BookList *head)
{
BookList *p = head->next->next;
BookList *maxnode = head->next;
while(p)
{
if(p->node.price > maxnode->node.price)
maxnode = p;
p = p->next;
}
p = head->next;
while(p)
{
if(p->node.price == maxnode->node.price)
printf(" %s %s %0.2f\n",p->node.nums,p->node.name,p->node.price);
p = p->next;
}
}
// 4.基于顺序(链式)存储结构的图书信息表的新图书的入库
void enku(BookList *head)
{
int pos;
BookList *p = head;
printf("输入新图书的位置序号(一个整数)\n");
scanf("%d",&pos);
if(pos <= 0 || pos > (int)head->node.price + 1)
{
printf("抱歉,入库位置非法\n");
return;
}
while(--pos)
{
p = p->next;
}
head->node.price++;
BookList *newbook = (BookList *)malloc(sizeof(BookList));
scanf("%s %s %f",(newbook->node).nums,(newbook->node).name,&(newbook->node).price);
newbook->next = p->next;
p->next = newbook;
}
// 5.基于顺序(链式)存储结构的图书信息表的旧图书的出库
void delku(BookList *head)
{
BookList *pre = head , *cur = head->next;
int delpos;
printf("输入删除图书的位置序号(一个整数)\n");
scanf("%d",&delpos);
if(delpos <= 0 || delpos > (int)head->node.price)
{
printf("抱歉,出库位置非法\n");
return;
}
while(--delpos)
{
pre = cur;
cur = cur->next;
}
head->node.price--;
BookList *tem = cur;
pre->next = cur->next;
free(tem);
}
// 6.基于顺序(链式)存储结构的图书信息表的图书去重(选做)
void delnode(BookList *head,BookList *del)
{
printf("3");
BookList *cur = head->next , *pre = head;
while(cur != del)
{
pre = cur;
cur = cur->next;
}
head->node.price--;
BookList *tem = cur;
pre->next = cur->next;
free(tem);
printf("4");
}
void delre(BookList *head)
{
int i = 0;
BookList * p = head->next,*pr = NULL;
while(p)
{
pr = p->next;
while(pr)
{
if(strcmp(pr->node.nums,p->node.nums) == 0)
{
delnode(head,pr);
}
pr = pr->next;
}
p = p->next;
}
}
int main()
{
BookList *head = NULL;
int choice = 1;
printf("-----------------欢迎来到图书管理系统-------------------\n");
printf("-----------------请选择你的操作 -------------------\n");
printf("-----------------1.创建图书信息 -------------------\n");
printf("-----------------2.修改图书信息表 -------------------\n");
printf("-----------------3.查找最贵图书 -------------------\n");
printf("-----------------4.入库新图书 -------------------\n");
printf("-----------------5.出库旧图书 -------------------\n");
printf("-----------------6.去重图书 -------------------\n");
printf("-----------------9.输出图书信息 -------------------\n");
while(choice)
{
scanf("%d",&choice);
switch(choice)
{
case 1:
insert(&head);
print(head);
break;
case 2:
change(head);
print(head);
break;
case 3:
findmax(head);
break;
case 4:
enku(head);
print(head);
break;
case 5:
delku(head);
print(head);
break;
case 6:
delre(head);
print(head);
break;
case 9:
print(head);
break;
}
}
}