图书管理系统——链表实现

这篇具有很好参考价值的文章主要介绍了图书管理系统——链表实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

实验要求:
定义一个包含图书信息(书号、书名、价格)的顺序表或者链表。要求实现下面功能:

  1. 读入相应的图书数据来完成图书信息表的创建。然后,输出图书表中的图书个数,同时逐行输出每本图书的信息。
  2. 由于某种原因物价上涨,书店计划提高图书价格,要求计算所有图书的平均价格,低于平均价格的图书价格涨价10%,高于或等于平均价格的图书价格涨价5%,并输出调价后的图书信息。
  3. 将读入图书的信息逆序存储,逐行输出逆序存储后的每本图书的信息。反转链表
  4. 找出最贵的图书,并输出其信息。若有多本,则先输出图书个数,再依次输出图书信息。
  5. 新近一批图书,插入到图书表中的指定位置,并输出插入后的图书表信息。
  6. 如果图书表中不允许存在书号相同的图书,请为图书表去重,即删除书号相同的图书(只保留一本)。

实验环境: devc++
实现代码:文章来源地址https://www.toymoban.com/news/detail-733985.html

#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
//1.书的结构定义 
typedef struct Book{
	string number;
	string name;
	float price;
}Book;

//2.链表的结构定义,一个数据一个指针 
typedef struct LinkNode{
	Book *data;
	struct LinkNode *next;
	int length;
}LinkNode,*LinkList; 

//3.初始化
//3.1 链表的初始化 
LinkList init_list(){
	LinkList l = new LinkNode;
	l->next = NULL;
	l->length = 0;
	l->data = NULL;
	return l;
} 

//3.2 节点的初始化
LinkNode *init_node(Book *book){
	LinkNode *node = new LinkNode;
	node->data = book;
	node->next = NULL;
	node->length = 1;
	return node;
} 

//3.3 图书的初始化
Book *init_book(string num1,string nam1,float price1){
	Book *boo = new Book;
	boo->number = num1;
	boo->name = nam1;
	boo->price = price1;
	return boo;
} 

//4.图书信息表的创建
void creat_book_list(LinkList &l,int n){
	l->length= n; 
	cout<<"请输入您想要存放的数据:"<<endl;
	//4.1.输入的数据是书这个数据结构的内容
	string number;
	float price;
	string name;
	LinkList r = l;
	for(int i=0;i<n;i++){
		cin>>number;
		cin>>name;
		cin>>price;
//		cout<<number<<" "<<name<<" "<<price<<endl;
		Book *my_book = init_book(number,name,price);	
		//4.2.得到书的数据类型后就可以将其插入到信息表中了
		//4.2.1 初始化节点
		LinkNode *tmp = init_node(my_book);
		if(i == 0){
			r->data = my_book;
		}
		// 4.2.2 尾插法插入元素,没有虚拟头节点 
		else{
			r->next = tmp;
			r = tmp;
		}

	}
	r->next = NULL;

	  
} 

//5.展示链表
void display(LinkList l){
	cout<<"=============== 展示:==============="<<endl;
	int x = 1; 
	while(l){
		cout<<x++<<" ";
		cout<<l->data->number<<" "<<l->data->name<<" "<<l->data->price<<endl;
		l = l->next; 
	} 
	cout<<"=============== over!! ==============="<<endl;
} 

//6.涨价函数 有数据要改 
void add_price(LinkList &l){
	//6.1 计算链表里数据的平均值
	int sum = 0;
	LinkNode *r = l;
	while(r){
		sum += r->data->price;
		r = r->next;
	}

	float average = sum / 10; //****一会这要进行改变****
	//低于平均价格的图书价格涨价10%,高于或等于平均价格的图书价格涨价5%,并输出调价后的图书信息。 
	r = l;
	while(r){
		if(r->data->price < average)
			r->data->price = 1.1 * r->data->price;
			
		else
			r->data->price = 1.05 * r->data->price; 
			
		r = r->next;
	} 
	 
} 

//7.反转链表里的内容
LinkList reverse_real(LinkNode *pre,LinkNode *cur){
	//1.递归结束的最终条件 
	if(cur == NULL) return pre;//cur为null,那它的前一个就说明是原来链表的末尾结点,也就是新链表的头节点,返回新的头节点说明链表反转成功 
	//2.用一个结点来记录当前节点的下一个结点
	LinkNode *tmp = cur->next;
	//3.真正的反转操作,让当前指针指向当前指针的前一个指针,就是链表的反转操作 
	cur->next = pre;
	//4. 上面仅仅只是反转了一次,重新调用反转函数接着向后进行操作
	return reverse_real(cur,tmp);
	/*
	只需假想一下链表反转的情况即可,一开始传入的是(null,head),head表示链表的真正头节点,执行到return之前仅仅只是记录了一下原来
	的head->next指针,并让头部指向了pre也就是null;所以下一步要反转的就是cur和记录下head->next的指针进行反转然后依次...... 
	 
	*/ 
}
void reverse_link(LinkList &l){
	int n = l->length;
	l = reverse_real(NULL,l);
	l->length = n;
	
	// reverse_real(NULL,l) = reverse_real(l,tmp1) = reverse_real(tmp1,tmp2)= ...... = pre ,所以最后 l 得到的就是返回的 头部节点 
} 

//8.在图书中找出最贵的书
void find_most_dear(LinkList l){
	//8.1用于遍历
	LinkNode *r = l->next;  
	//8.2用于记录,因为可能会出现多个值,所以将其设置为链表 ,但实质上和LinkNode * 一致 
	
  //又开辟了一个新的空间用于记录,是为了避免原来的链表收到tmp的影响,只需将l的头部数据赋值给tmp即可,并不是地址 
	LinkList my_list = init_node(l->data);
	
	LinkNode* tmp = my_list; //此时tmp的next为空,说明不是原来的链表了 

	while(r){
//		cout<<tmp->data->price<<" "<< r->data->price <<endl;
		if(tmp->data->price < r->data->price ){
			//8.3如果当前tmp所代表的价格要小于遍历得到的,就更新 
			LinkNode *node = init_node(r->data); //意为创建一块新的内存空间,为了不影响原来的链表, 
			tmp = node;
			my_list = tmp; //表示每次调用if里面时,my_list的头部都会改变 
		}
	
		//8.4如果tmp的价格等于遍历得到的就放到tmp的next指针 
		else if(tmp->data->price == r->data->price){ 
			LinkNode *p = init_node(r->data);
			tmp->next = p;
			tmp->length += 1;
			tmp = p;
			
		}
		//8.5用于控制循环次数 
		r = r->next; 

					
	}
	tmp->next = NULL;
	cout<<"共匹配到"<<my_list->length<<"本价格最高的图书:"<<endl; 
	display(my_list); //对新链表进行展示 

} 

//9.将新来的图书插入到指定位置
int insert_book(LinkList &l,int index,Book *book){
	//9.1 条件判断 
//	cout<<l->length<<endl;
	if(index <= 0 || index > l->length) return -1;
	//9.2 创建链表节点
	LinkNode *my_book = init_node(book);
	//9.3 要插入到指定位置就要 找到要插入位置的前一个结点
	if(index == 0){
		LinkNode *tmp = l;
		l = my_book;
		l->next = tmp;
//		cout<<"222"<<endl;
		
	} 
	else{
//		cout<<"111"<<endl;
	index = index - 1;
	//定义一个结点指向真正的头节点 
	LinkNode *p = l;
	while(index--){
		p = p->next; //循环完成之后,p指的就是要插入位置的前面一个节点 
	}
	my_book ->next = p->next;
	p->next = my_book;
	}

	l->length += 1;
	return 0; 
	
} 

//10.将书号相同的数据进行去重,如果有相同的删去后面的那个
void delete_same_number(LinkList &l){
	LinkNode *r = l;
	LinkNode *inner = l;
	cout<<l->length<<endl;
	while(r){
		//必须加上inner不为空这个条件,因为如果当前inner已经为空就不存在inner->next这条语句,就会报错
		//而如果inner不为空inner->next为空,则下面的比较就没有意义 
		while(inner && inner->next){
//			cout<<r->data->number<<" "<<inner->next->data->number<<endl;
			if(r->data->number == inner->next->data->number){//意为当外循环的序号与内循环的下一个结点的序号相同时就删除内循环的那个结点 
				cout<<"相同编号"<<inner->next->data->number<<"去重成功!!"<<endl; 
				inner->next = inner->next->next;
				l->length -= 1; 
								
			}
			inner = inner->next;//循环变量 

		}
		r = r->next;
		inner = r;
	}

//因为处理了l->length所以不能使用for循环 
//	for(int i=0;i<l->length;i++){//外循环进行遍历		
//		for(int j=i+1;j<l->length;j++){
//			
//			cout<<r->data->number<<" "<<inner->next->data->number<<endl;
//			if(r->data->number == inner->next->data->number){//意为当外循环的序号与内循环的下一个结点的序号相同时就删除内循环的那个结点 
//				cout<<inner->next->data->number<<"去重成功!!"<<endl; 
//				inner->next = inner->next->next;
//				l->length -= 1; 
//								
//			}
//			inner = inner->next;//循环变量 
//		}
//		cout<<"111"<<endl;
//		r = r->next;
//		cout<<r->data->number<<endl;
//	}
} 
 
int main()
{
	LinkList l1 = init_list(); 
	int num = 0; 
	while(1){
		//1.展示功能界面
		cout<<"***欢迎来到图书管理系统***"<<endl;
		cout<<"******1.存入图书信息******"<<endl;
		cout<<"******2.图书进行涨价******"<<endl; 
		cout<<"******3.逆转图书信息******"<<endl;
		cout<<"******4.找出最贵图书******"<<endl;
		cout<<"******5.插入指定图书******"<<endl;
		cout<<"******6.为图书表去重******"<<endl; 
		cout<<"******7.展示当前图表******"<<endl;
		cout<<"**************************"<<endl; 
		cout<<"请输入您想使用的功能编号(输入0退出):"<<endl;
		int answer;
		cin>>answer;
		if(answer == 0)
			break;
		if(answer == 1){
			cout<<"请输入您想要传入图书的个数:"<<endl;
			int n;
			cin>>n; 
			creat_book_list(l1,n);
			cout<<"存入成功!!"<<endl;
			display(l1); 
			num++;
		}
		else if(num == 0){
			cout<<"只有存入图书信息后才能使用该功能!!"<<endl; 
		}
		else if(answer == 2){
			add_price(l1);
			cout<<"涨价成功!!"<<endl; 
			display(l1);
		}
			
		else if(answer == 3) {
			reverse_link(l1);
			cout<<"逆转成功!!"<<endl; 
			display(l1);
		}
		else if(answer == 4){
			find_most_dear(l1);
		}
		else if(answer == 5){
			cout<<"请输入要插入的数据:"<<endl;
			float price;
			string name,number;
			cin>>number>>name>>price;
			Book *boo = init_book(number,name,price);
			cout<<boo->price<<boo->name<<endl;
			cout<<"请输入想要插入的位置(从0开始):"<<endl;
			int ind;
			cin>>ind; 			
			if(insert_book(l1,ind,boo) == 0)
				cout<<"插入成功!!"<<endl; 
			else
				cout<<"插入失败!!"<<endl; 
			display(l1);
		}
		else if(answer == 6){
			delete_same_number(l1);	
			display(l1);
		}
		else if(answer == 7)
			display(l1);
		else
			cout<<"请输入有效数字!!"<<endl; 

}
		                    
	 
	                  
/*
	//测试
	LinkList l1 = init_list();
	creat_book_list(l1,10); 
	display(l1);
	
//	add_price(l1);
//	display(l1);
//	
//	reverse_link(l1);
//	display(l1);
//	
	find_most_dear(l1); 
	display(l1);
	
//	cout<<"请输入要插入的数据:"<<endl;
//	float price;
//	string name,number;
//	cin>>number>>name>>price;
//	Book *boo = init_book(number,name,price);
//	insert_book(l1,1,boo);
//	display(l1); 
//	
//	delete_same_number(l1);
//	display(l1); 

*/ 
	return 0;
}
// over!!

到了这里,关于图书管理系统——链表实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构课设--图书管理系统(含泪版)

    设计一个计算机管理系统完成图书管理基本业务。 【基本要求】 (1)每种书的登记内容包括书号、书名、著作者、现存量和库存量; (2)对书号建立索引表(线性表)以提高查找效率; (3)采编入库:新购一种书,确定书号后,登记到图书帐目表中,如果表中已有,则只

    2024年02月08日
    浏览(47)
  • 图书管理系统|基于Springboot的图书管理系统设计与实现(源码+数据库+文档)

    图书管理系统目录 目录 基于Springboot的图书管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、个人中心 2、管理员管理 3、用户管理 4、图书出版社管理 四、数据库设计 1、实体ER图 五、核心代码  六、论文参考 七、最新计算机毕设选题推荐 八、源码获取:

    2024年03月26日
    浏览(90)
  • Java连接数据库实现图书馆管理系统(详细教程)

    该功能用到的软件为 IDEA 、Navicat 、云服务器(非必须) 源码下载 https://www.aliyundrive.com/s/UTz8pNxobGK 在自己的服务器或者电脑本机安装数据库系统,本次系统演示的数据库版本为5.6。 1.创建图书管理数据库library 字符集为:utf8 -utf8_general_ci 2.设计好将要使用的sql语句 视图、存储

    2024年02月06日
    浏览(49)
  • 数据库课程设计-图书馆管理系统(2.数据库实现-基于mysql)

    如果对你有帮助,可以给卑微的博主留个赞、关注、收藏   (不是)  (骗一下数据,说不定以后面试就过了,拜谢) 好像有读者说现在不要积分的资源也要vip才能下,如果下不了可以留邮箱到评论区或者私聊,我也把资源放到github了,地址如下: https://github.com/goLSX/library_mana

    2024年02月06日
    浏览(52)
  • 将Java与数据库连接起来(配置idea),实现一个简单的图书管理系统

    目录 1.通过connector连接Java和Mysql数据库 (1)首先配置idea (2)如何把java和mysql连接起来 1.简单连接 2.认识PrepareStatement 2.实现简单的图书管理系统 (1)创建数据库jdbc,并且创建出book表  (2)在idea中书写代码将mysql与java连接,实现基本的增删改查 1.JdbcUtiles类,一个使用jdbc的工具

    2024年02月11日
    浏览(49)
  • 基于java的图书借阅管理系统设计与实现(源代码+数据库+部署文档+部署视频)

           图书管理系统 该系统对数据进行保存、修改、删除等管理。为用户提供了一个友好、简单快捷的运行操作平台。该统对数据进行保存、修改、删除等管理,为用户提供了一个友好、简单快捷的运行操作平台。本系统的各界面设计友好、流程正确、功能也较为完善,

    2024年02月03日
    浏览(55)
  • 图书管理系统(Java实现,十个数据表,含源码、ER图,超详细报告解释,2020.7.11更新)...

    图书管理系统数据库设计实验报告 2020.7.11 修改了表的结构,表之间增加了外键联系,更加完整且符合第三范式。 数据库设计实验报告 疫情期间,大家都只能够在家里,不能去到学校,此时需要在图书馆借书,就是只能通过网络来操作了。因此,网上图书馆就此诞生了,有了

    2024年02月05日
    浏览(128)
  • 数据结构——基于单链表实现通讯管理系统

    这个通讯录是基于单链表实现的,关于单链表,之前已经做过完整的实现方法——数据结构——单链表(C语言版) 用单链表实现的通讯录其实和用顺序表实现的通讯录类似,可以参考该文章——基于动态顺序表的应用——通讯录 完成该通讯录需要引进经过修改后的单链表的

    2024年04月14日
    浏览(58)
  • 【Java】实现图书管理系统

    随着社会的发展和科技的进步,图书馆的规模和藏书量都在不断扩大,图书的管理和维护变得越来越复杂。传统的图书管理方式已经无法满足现代图书馆的需求,因此需要开发一种高效、便捷的图书管理系统来提高图书管理效率和读者的借阅体验。 在这种背景下,我们设计了

    2024年02月20日
    浏览(62)
  • 图书管理系统(借还图书)--Java实现(附源码)

    目录 图书管理系统权限 图书管理系统程序框图 图书管理系统架构 管理员执行流程 学生执行流程 详细代码 源码获取 毕设专栏 图书管理系统权限 管理员:具有  1、查找图书 2、增加图书 3、删除图书 4、显示图书 等功能 学生:具有  1、查找图书 2、借阅图书 3、归还图书

    2024年02月08日
    浏览(77)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包