【数据结构之线性表】单链表实现图书管理系统

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

        本次实验是在DEV C++软件上进行实现的。语言采用的是c++语言,但在整体上与c语言大致相似(不管用什么语言实现,思想是不变的)。

        此次实现的整体思路:首先定义图书这个抽象数据类型,并且定义节点抽象数据类型(根据这些抽象数据类型对下面的数据进行定义)。然后进行单链表的初始化、单链表的取值、单链表的查找、单链表的插入、单链表的删除、尾插法建立单链表。在尾插法建立单链表时使用了文件流读取txt文件,并将其存储到链表中。最后建立主函数,使用主函数调用上述的算法。

        具体程序代码如下:

#include<iostream>
#include<fstream>
#include <iomanip>
typedef int Status; 
using namespace std;
struct Book {
	string id;//ISBN
	string name;//书名
	double price;//价格 
};
typedef struct LNode {
	Book data;//节点数据
	struct LNode *next;//节点指针域 
} LNode, *LinkList;//都是LNode的别名,其中LinkList 为指向结构体LNode的指针类型
//单链表的初始化
Status InitList (LinkList &L) {
	//构建一个空链表
	L = new LNode;//生成新节点作为头节点,头指针L指向头结点
	L->next = NULL;//头指针指针域置空。 
	return 1; //初始化成功返回1. 
}
// 单链表的取值
Status GetElem (LinkList L, int i, Book &e) {
	//在带头节点的单链表L中查找第i个元素,并赋值给e
	LNode *p;
	int j;
	p = L->next;//初始化,p指向首元节点,计数器初值赋值为1. 
	j = 1;
	while (p && j < i) {//顺着链表往下找,直到p为空或者p指向第i个元素。 
		p = p->next;
		++j;
	}
	if(!p || j > i) {
		cout << "i值不合法。";
		return 0;
	} 
	e = p->data;//将*P节点的数据赋值给e。 
	return 1;//取值成功返回1. 
} 
//单链表的查找
Status LocateElem (LinkList L,double e) {
	//在带头结点的单链表L中查找值为e的元素。 
	LNode *p;
	int j = 1;
	p = L->next;//初始化,指针p指向首元节点 
	while (p && p->data.price != e) {//顺着链表向下查找,直到p为空,或者p所指的数据域等于e。 
		p = p->next;
		++j;
	}
	return j;//查找成功返回e的节点地址p,失败则返回NULL。 
} 
//单链表的插入
Status ListInsert (LinkList &L,int i, Book &e) {
	LNode * p, * s;
	int j = 0;
	p = L;
	while (p && j < i -1) {//查找第i-1个元素节点,p指向该节点。 
		p = p->next;
		++j;
	} 
	if(!p || j > i - 1) {
		cout << "i值不合法!!!";
		return 0;
	}
	s = new LNode;//生成新节点*s。 
	s->data = e;//将新节点的数据域置为e。 
	s->next = p->next;//将节点*s的指针域指向第i个元素。 
	p->next = s;//将节点*p的指针域指向*s的指针域。 
	return 1;//插入成功返回1. 
} 
//单链表的删除
Status ListDelete (LinkList &L, int i) {
	LNode *p, *q;
	p = L;
	int j = 0;
	while (p->next && j < i - 1) {//查找第i-1个节点,p指向第i-1个位置。 
		p = p->next;
		++j;
	}
	if(!(p->next) || j > i - 1) {
		cout << "i值不合法,删除失败!!!";
	} 
	q = p->next;//临时保存被删除节点的地址以备释放。
	p->next = q->next;//改变删除节点前驱结点的指针域。
	delete q;
	return 1;//删除成功返回1. 
} 
//使用尾插法创建单链表
void CreateList (LinkList &L, int n) {
	LinkList p,r;
	string head_1,head_2,head_3;
	L = new LNode;
	L->next = NULL;//先建立一个带头结点的空链表。
	r = L;//尾指针r指向头结点
	int length = 0;
	fstream file;
	file.open("book.txt");
	if(!file) {
		cout << "未找到相关文件,无法打开!!!" <<endl;
		exit(0);
	} 
	file >> head_1 >> head_2 >> head_3;
	while (!file.eof()) {//蒋文件中的信息运用尾插法插入到链表中。 
		p = new LNode;//生成新节点。
		file >> p->data.id >> p->data.name >> p->data.price;//输入元素赋值给新节点的数据域。
		p->next = NULL;
		r->next = p;//新节点*p插入到尾结点*r之后。
		r = p;//r指向新的尾结点*p 
		length++;//同时对链表的长度进行统计 
	}
	file.close(); 
} 
//构建主函数,调用上述算法
 int main() {
 	int i = 0, n = 0, choose,length = 0;
 	double price;
 	Book e;
 	LinkList L,p;
 	choose = -1;
	cout << "1,建立\n";
 	cout << "2,输入\n";
 	cout << "3,取值\n";
 	cout << "4,查找\n";
 	cout << "5,插入\n";
 	cout << "6,删除\n";
 	cout << "7,输出\n";
 	cout << "8,退出\n";
 	while (choose != 0) {
	 	cout << "请选择:\n";
	 	cin >> choose;
	 	switch (choose) {
	 		case 1://建立单链表。
			 	{
			 		if(InitList(L)) {
			 		cout << "成功建立链表!\n";
					 }
		 			break;
				 }
	 		case 2://使用尾插法创建单链表。
			 	{
			 		CreateList (L,length); 
			 	  	cout << "输入book.txt 信息完毕\n";
				 }
			 	break;
			case 3://单链表的按序号取值,
				   //调用函数:Status GetElem (LinkList L, int i, Book &e)
				{
					cout << "请输入序号:\n";
					cin >> i;
					GetElem(L,i,e);//调用单链表的取值函数。 
					cout << "序号为" << i << "的图书信息为:\n";
					cout << e.id << "\t\t" << e.name << "\t\t"<<e.price;
				}
				break; 
			case 4://单链表的查找,调用函数:
				   // Status LocateElem (LinkList L,double e)
				{
					price = 0;
					cout << "请输入查找的价格;";
					cin >> price;
					n = LocateElem(L,price);
					cout << "第一个出现该价格的图书序号为:";
					cout << n;
				}
				break;
			case 5://单链表的插入,调用函数:
			       // Status ListInsert (LinkList &L,int i, Book &e)
			    {
			    	cout << "请输入插入的位置,和图书信息(编号、书名、价格):";
				    cin >> i >> e.id >> e.name >> e.price;
				    if(ListInsert(L,i,e)) {
				    	cout << "插入成功!!!";
					}
				}
				break;
			case 6://单链表的删除,调用函数:
				   // Status ListDelete (LinkList &L, int i)
				{
					cout << "请输入所要删除图书的序号:\n";
					cin >> i;
					if(ListDelete(L,i)) {
						cout << "删除成功!!!";
					}
				}
				break;
			case 7://单链表的输出
				{
					cout << "当前图书系统信息(链表)读出:\n";
					p = L->next;//节点*p指向链表的首元节点。 
					while (p) {
						cout << left << setw(15) << p->data.id <<
						left << setw(50)<<p->data.name <<left<<setw(5)
						<<p->data.price<<endl;
						p=p->next;
					} 
					cout <<endl;
				}
				break;
			case 8:
				choose = 0;
				break;
			default:
				break; 
		 }
	 }
	 return 0;
 }

程序中用到的book.txt文件:

链接:https://pan.baidu.com/s/1RZm-5azt7Qu4JMD2Ll_HFw?pwd=tfr2 文章来源地址https://www.toymoban.com/news/detail-717275.html

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

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

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

相关文章

  • 【数据库课设】图书馆资源管理系统 源码+流程图+结构设计(借还图书 逾期罚款 图书管理 读者管理 信息查询)python实现

    一个管理员编号对应一个密码,且需要有管理员注册密匙。 可以在图书信息表中录入、修改、删除图书。 可以在图书信息表中查询书籍。 可以编辑图书借阅、归还信息。 可以编辑欠款信息。 可以编辑读者信息表。 图书馆注册,获得读者编号。 可以在图书信息表中查阅书籍

    2024年02月10日
    浏览(53)
  • 数据结构-->线性表-->单链表

      链表:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。 与顺序表不同的是,链表里的每节都是独立申请下来的空间,我们称之为“节点、结点”。 节点的组成主要由两个部分:当前节点要保存的数据和保

    2024年02月19日
    浏览(24)
  • 【数据结构】线性表-单链表

    编程语言:C++ 前言: 节点 :节点是链表的一个基本单元,包含两部分——数据域和指针域,数据域用于存储数据,指针域存储下一个节点的地址,形成链结。 什么是单链表 :n个节点链结成一个链表,即为线性表(a1,a2,a3……)的链式存储结构,每个节点只包含一个指针域

    2024年04月08日
    浏览(27)
  • 数据结构_线性表、顺序表、单链表

    目录 1. 线性表的定义和基本操作 1.1 线性表的定义 1.2 线性表的特点 1.3 线性表的基本操作 2. 线性表的顺序表示 2.1 顺序表的定义 2.2 顺序表上基本操作的实现 2.2.1 插入操作 2.2.2 删除操作 2.2.3 按值查找 2.3 相关练习巩固 3. 线性表的链式表示 3.1 单链表的定义 3.2 单链表上基本操

    2024年02月02日
    浏览(32)
  • 数据结构——图书管理系统

    1.深入理解数据结构的基本理论,掌握数据结构的设计方法训练基础知识和基本方法的综合运用。 2.熟悉和重新掌握c++语言,独立编制一个具有解决实际应用问题的应用程序。 3.制作一个图书管理系统,使他实现查找、删除、插入、输出、取值等这些基础操作。 4.掌握数据结

    2024年02月13日
    浏览(49)
  • 数据结构项目:图书管理系统

    随着科技的不断进步,图书的种类也随之日益增多。图书馆所需要处理的图书管理问题从而突出,而读者也许需要能够更方便的查找和查看图书馆的书籍。为解决以上问题,本系统设计时主要针对图书管理人员需求做出对图书信息的录入、删除、修改、导出等功能。 (1)用

    2024年02月04日
    浏览(49)
  • 数据结构课设--图书管理系统(含泪版)

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

    2024年02月08日
    浏览(47)
  • 数据结构--线性表(顺序表、单链表、双链表、循环链表、静态链表)

    前言  学习所记录,如果能对你有帮助,那就泰裤辣。 目录 1.线性表概念 定义 基本操作 2.顺序表 定义 顺序表的实现--静态分配 动态分配 顺序表的特点 顺序表的插入和删除 顺序表的查找 按位查找  按值查找 3.单链表 定义 单链表的初始化 不带头节点的单链表 带头节点的单

    2024年02月11日
    浏览(63)
  • 【玩转408数据结构】线性表——单链表的定义以及增删改查(线性表的链式表示 上)

            到这里我们已经了解到线性表是具有 相同数据类型 的 有限个数据元素 序列,而线性表的顺序存储也就是顺序表,顺序表的存储形式十分直观,我们在实现时使用数组进行实现,但顺序表在插入或者删除元素时需要移动大量元素,那么怎么样才能在插入删除元素时不

    2024年02月21日
    浏览(57)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包