数据结构 实验1:线性表的图书管理系统

大一下学校开设了数据结构实验课,在这里和大家分享一下我的实验报告。

实验目的

掌握线性表的顺序存储表示和链式存储表示
掌握顺序表和链表的基本操作,包括建、查找、插入和删除等算法

实验内容

图书信息表包括以下10项常用的基本操作:图书信息表的创建和输出、排序、修改、逆序存储、最贵图书查找、最爱图书查找、最佳位置图书查找、新图书入库、旧图书出库、图书去重。实验要求分别用顺序表和链表实现上述10操作。

题1:创建图书信息表(顺序存储)

问题描述:
基于顺序存储结构的图书信息表的创建和输出定义一个包含图书信息(书号、书名、价格)的顺序表,读入相应的图书数据来完成图书信 息表的创建,然后统计图书表中的图书个数,同时逐行输出每本图书的信息。

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

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

输入样例:
9787302257646 程序设计基础 25.00
9787302164340 程序设计基础(第2版) 20.00
9787302219972 单片机技术及应用 32.00
9787302203513 单片机原理与应用技术 26.00
9787810827430 工业计算机控制技术——原理与应用 29.00
9787811234923 汇编语言程序设计教程 21.00

输出样例:
9787302257646 程序设计基础 25.00
9787302164340 程序设计基础(第2版) 20.00
9787302219972 单片机技术及应用 32.00
9787302203513 单片机原理与应用技术 26.00
9787810827430 工业计算机控制技术——原理与应用 29.00
9787811234923 汇编语言程序设计教程 21.00

题2:排序(顺序存储)

问题描述:
基于顺序存储结构的图书信息表的排序
定义一个包含图书信息(书号、书名、价格)的顺序表,读入相应的图书数据完成图书信息表的创建,然后将图书按照价格降序排序,逐行输出排序后每本图书的信息。

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

输出要求:
总计 n 行,每行是一本图书的信息(书号、书名、价格),书号、书名、价格用空格分隔。 其中价格输出保留两位小数。

输入样例:
9787302257646 程序设计基础 25.00
9787302164340 程序设计基础(第2版) 20.00
9787302219972 单片机技术及应用 32.00
9787302203513 单片机原理与应用技术 26.00
9787810827430 工业计算机控制技术——原理与应用 29.00
9787811234923 汇编语言程序设计教程 21.00
0 0 0

输出样例:
9787302219972 单片机技术及应用 32.00
9787810827430 工业计算机控制技术–原理与应用 29.00
9787302203513 单片机原理与应用技术 26.00
9787302257646 程序设计基础 25.00
9787811234923 汇编语言程序设计教程 21.00
9787302164340 程序设计基础(第2版) 20.00

题3:修改价格(顺序存储)

问题描述:
表的创建,然后计算所有图书的平均价格,将所有低于平均价格的图书价格提高 20%,所有高于或等于平均价格的图书价格提高 10%,最后逐行输出价格修改后的图书信息。

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

输出要求:
总计 n+1 行,第一行输出平均价格,后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
9787302257646 程序设计基础 30.00
9787302164340 程序设计基础(第2版) 24.00
9787302219972 单片机技术及应用 35.20
9787302203513 单片机原理与应用技术 28.60
9787810827430 工业计算机控制技术——原理与应用 31.90
9787811234923 汇编语言程序设计教程 25.20

题4:查找(顺序存储)

问题描述:
基于顺序存储结构的图书信息表的最贵图书的查找
定义一个包含图书信息(书号、书名、价格)的顺序表,读入相应的图书数据来完成图书信 息表的创建,然后查找价格最高的图书,输出相应图书的信息。

输入要求:
n+1 行,其中,第一行是图书数目 n,后 n 行是 n 本图书的信息(书号、书名、价格),每本图书信息占一行,书号、书名、价格用空格分隔,价格之后没有空格。其中书号 和书名为字符串类型,价格为浮点数类型。

输出要求:
m+1 行,其中,第一行是最贵图书的数目(价格最高的图书可能有多本),后 m 行是最贵图书的信息,每本图书信息占一行,书号、书名、价格用空格分隔,其中价格输出保留两位小数。

输入样例:
6
9787302257646 程序设计基础 25.00
9787302164340 程序设计基础(第 2 版) 20.00
9787302219972 单片机技术及应用 32.00
9787302203513 单片机原理与应用技术 26.00
9787810827430 工业计算机控制技术——原理与应用 29.00
9787811230710 C#程序设计易懂易会教程 32.00

输出样例:
2
9787302219972 单片机技术及应用 32.00
9787811230710 C#程序设计易懂易会教程 32.00

题5:创建图书信息表(链式存储)

题目描述:
基于链式存储结构的图书信息表的创建和输出
定义一个包含图书信息(书号、书名、价格)的链表,读入相应的图书数据来完成图书信息 表的创建,然后统计图书表中的图书个数,同时逐行输出每本图书的信息。

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

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

输入样例
9787302257646 程序设计基础 25.00
9787302164340 程序设计基础(第2版) 20.00
9787302219972 单片机技术及应用 32.00
9787302203513 单片机原理与应用技术 26.00
9787810827430 工业计算机控制技术——原理与应用 29.00
9787811234923 汇编语言程序设计教程 21.00
0 0 0

题6:排序(链式存储)

基于链式存储结构的图书信息表的排序
定义一个包含图书信息(书号、书名、价格)的链表,读入相应的图书数据完成图书信息表的创建,然后将图书按照价格降序排序,逐行输出排序后每本图书的信息。

输入输出要求及样例和题2同。

题7:修改价格(链式存储)

基于链式存储结构的图书信息表的修改
链表的创建,然后计算所有图书的平均价格,将所有低于平均价格的图书价格提高 20%,所有高于或等于平均价格的图书价格提高 10%,最后逐行输出价格修改后的图书信息。

输入输出要求及样例和题3同。

设计思路

实验题1:用结构体存每本书的相关信息,用顺序存储建立线性表,即图书信息表,然后通过函数创建线性表,初始化线性表,进行线性表的输入和输出。

实验题2:用sort函数进行排序

实验题3:所有图书价格相加再除以图书本数=图书平均价格。遍历两遍线性表,第一遍求出图书平均价格,第二次每本书的价格和平均价格逐个进行对比,大于等于平均价格的将图书价格乘以1.1,小于则乘以1.2

实验题4:从头遍历线性表,用int变量max记录最贵图书价格,int数组maxprice记录最贵图书价格所在行,最后输出maxprice里对应的最贵图书信息

实验5:用结构体存每本书的相关信息,用链式存储建立线性表,即图书信息表,然后通过函数创建线性表,初始化线性表,进行线性表的输入和输出。

实验6:用冒泡排序来排线性表

实验7:所有图书价格相加再除以图书本数=图书平均价格。遍历两遍线性表,第一遍求出图书平均价格,第二次每本书的价格和平均价格逐个进行对比,大于等于平均价格的将图书价格乘以1.1,小于则乘以1.2

代码及注释

#include <stdio.h>//头文件 
#include <malloc.h>
#include <string.h>
#include <algorithm> 
using namespace std;
#define MAXID 100//书号的长度,可根据需要修改
#define MAXNAME 100//书名的长度,可根据需要修改
#define MAXSIZE 100//线性表的长度,可根据需要修改
typedef int status;//函数状态(错误,完成,溢出)
#define ERRER 0//错误
#define OVERFLOW -2//溢出
#define OK 1//完成 
typedef struct //一本书的信息 
{
	char id[MAXID];//书号
	char name[MAXNAME];//书名
	float price;//价格	
}book;
typedef struct //图书信息表 (顺序存储)
{
	book *elem;//一本书
	int length;//线性表的长度
}booklist;
status init(booklist &L)//初始化线性表(顺序存储)
{
	L.elem=(book *)malloc(sizeof(book)*MAXSIZE);//分配线性表空间 
	if (!L.elem) exit(OVERFLOW);//空间分配失败,退出 
	L.length=0;//线性表长度初始化为0
	return OK;//空间分配完成 
}
status insert(booklist &L)//输入图书数据(顺序存储) 
{
	int i=1;
	while(1)
	{
		if (i>MAXSIZE) 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;
}
bool cmp(book L1,book L2)//按照价格降序排序 
{
	if (L1.price>L2.price) return true;
	else return false;
}
status sortbl (booklist &L)//排序(顺序存储) 
{	
	sort (&(L.elem[1]),&(L.elem[L.length+1]),cmp);	
	return OK;
}
status upprice(booklist &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) L.elem[i].price*=1.1;//高于或等于平均价格的图书价格提高 10%	
		else if (L.elem[i].price<avg) L.elem[i].price*=1.2;//低于平均价格的图书价格提高20%
	}
	printf ("%.2f\n",avg);//输出平均价格 
	return OK;
}
status maxprice(booklist &L)//最贵图书查找 (顺序存储)
{
	int n;//图书数目 
	scanf ("%d",&n);//输入图书数目 
	init(L); //初始化线性表 	
	L.length=n;//给线性表中的图书数目赋值 
	int i=1;
	while(i<=n)
	{
		scanf ("%s %s %f",L.elem[i].id,L.elem[i].name,&L.elem[i].price);//输入图书信息表 
		i++;
	}
	int maxprice[n+5];//最贵图书在线性表中的编号 
	int len=0,max=0;//len:最贵图书的数目  max:最贵图书价格 
	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].id,L.elem[j].name,L.elem[j].price);//根据编号输出最贵图书的信息 
	}
	return OK;	
}
typedef struct lbooklist//图书信息表的一个结点(链式存储)
{
	book elem;//数据域:存一本书的信息 
	lbooklist *next;//指针域:指向下一本书的地址 
}lbooklist,*link;
status linit (link &L)//初始化线性表(链式存储)
{
	L=(link)malloc(sizeof(lbooklist));//分配结点空间 
	if (!L) exit(OVERFLOW);//空间分配失败,退出 
	L->next=NULL;//下一本书的地址为空 
	return OK;//空间分配完成 	
}
status linsert (link L)//输入图书数据(链式存储)(头插法)  
{
	while (1)
	{
		link p =(link) malloc(sizeof(lbooklist));//新建结点并分配空间 
		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 loutput (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 lsort (link L)//排序(链式存储) 
{	
	if (L->next==NULL||L->next->next==NULL) return OK;//线性表无元素或只有一个元素,无需排序	
	link pre=L;//操作结点的前一个结点 
	link now=L->next;//操作结点 
	link tail=NULL;	//尾结点 
	while (L->next!=tail)//冒泡排序 
	{
		pre=L;
		now=L->next;
		int flag=0;
		while (now->next!=tail)
		{			
			if (now->elem.price<now->next->elem.price)
		    {		    
			    flag=1;
			    pre->next=now->next;			
			    now->next=now->next->next;
			    pre->next->next=now;
				pre=pre->next;					
		    }
			else 
			{
				pre=pre->next;
		    	now=now->next;		
			}					
		}
		if (flag==0) break;
		else
		{
			tail=now;									
		}				
	}
	return OK;
}
status lupprice(link &L)//提高图书价格(链式存储) 
{
	int num=0;//图书数量 
	float avg=0;//图书平均价格 
	link p=L->next;
	while (p!=NULL)//遍历线性表 
	{
		avg+=p->elem.price;//计算图书总价 
		num++;//统计图书数量 
		p=p->next;
	} 
	avg/=num;//图书均价=总价/图书数量 
	p=L->next;
	while (p!=NULL)
	{
		if (p->elem.price>=avg) p->elem.price*=1.1;//所有高于或等于平均价格的图书价格提高10%
		else if (p->elem.price<avg) p->elem.price*=1.2;//所有低于平均价格的图书价格提高20%
		p=p->next;
	}
	printf ("%.2f\n",avg);//输出图书均价 
	return OK;
}
int main()
{
	int i;
	printf ("选择存储方式:1.顺序存储  2.链式存储\n");
	scanf("%d",&i);
	if (i==1)
	{
		booklist L;
	    init(L);   
		printf ("选择功能:1.输出图书信息表 2.价格降序排序 3.提高图书价格 4.最贵图书查找\n");
		scanf("%d",&i);
		switch (i)
	    {
	    	case 1:                   //实验题1:输出图书信息表(顺序存储) 
			{
				insert(L);
				output(L); 
				break;
			}
		    case 2:                  //实验题2:排序(顺序存储) 
		    {
		    	insert(L);
				sortbl (L);
	            output(L);
	            break;
			}
		    case 3:                  //实验题3:提高图书价格(顺序存储) 
			{
				insert(L);
				upprice(L);
             	output(L);
             	break;
			}
	    	case 4:maxprice(L);break;//实验4:最贵图书查找 (顺序存储)	
	    }		
	}
	else if (i==2)
	{
		link L;
	    linit(L);	    
	    printf ("选择功能:1.输出图书信息表 2.价格降序排序 3.提高图书价格\n");
	    scanf("%d",&i);
	    linsert(L);	
	    switch (i)
	    {
	    	case 1: loutput(L); break;  //实验题5:输出图书信息表(链式存储) 
	    	case 2:                    //实验题6:排序(链式存储) 
		    {
				lsort (L);
	            loutput(L);
	            break;
			}
			case 3:                  //实验题7:提高图书价格(链式存储) 
			{
				lupprice(L);
             	loutput(L);
             	break;
			}
	    }
	}
	return 0;
}

运行实例

题1:创建图书信息表(顺序存储)

输入
输入
输出
在这里插入图片描述

题2:排序(顺序存储)

输入
在这里插入图片描述
输出
在这里插入图片描述

题3:修改价格(顺序存储)

输入
在这里插入图片描述
输出
在这里插入图片描述

题4:查找(顺序存储)

输入
在这里插入图片描述
输出
在这里插入图片描述

题5:创建图书信息表(链式存储)

输入
在这里插入图片描述
输出
在这里插入图片描述

题6:排序(链式存储)

输入
在这里插入图片描述
输出
在这里插入图片描述

题7:修改(链式存储)

输入
在这里插入图片描述
输出
在这里插入图片描述

  • 33
    点赞
  • 238
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值