图书管理(单链表C++)
#include<iostream>
#include<string>
#include<iomanip>
#include<fstream>
using namespace std; #define OK 1
#define ERROR -1
#define OVERFLOW -2
typedef int Status; //函数返回值类型,函数状态代码
#define MAXSIZE 100 //线性表可能达到的最大长度
int length=;
string head_1,head_2,head_3;
typedef struct{
string id; //图书编号
string name; //图书名称
double price; //图书价格
}Book;
typedef struct LNode{
Book data; //数据域
struct LNode *next; //指针域
}LNode,*LinkList;
Status InitList_L(LinkList &L){
L=new LNode; //开辟以 LNode 大小的内存空间
L->next=NULL;
return OK;
}
Status CreateList_L(LinkList &L){
LinkList p,r;
r=L;
//string head_1,head_2,head_3;
fstream file;
file.open("d:\\book.txt");
if(!file){
cout<<"没有找到该文件,文件打开失败!"<<endl;
exit(ERROR);
}
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;
r=p;
length++;
}
file.close();
return OK;
}
Status GetElem(LinkList &L,int i){
LinkList p;
Book data;
int j;
p=L->next;
j=;
while(p&&j<i){
p=p->next;
j++;
}
if(!p||j>i)
return ERROR;
cout<<p->data.id<<"\t\t"<<p->data.name<<"\t\t"<<p->data.price<<endl;
return OK;
}
Status ListInsert_L(LinkList &L,int i){
int j;
LinkList p,s;
p=L; //申明一个节点p,指向头节点
j=;
while(p&&j<i){ //寻找第i个节点
p=p->next;
j++;
}
if(!p||j>i) //第 i 个元素不存在
return ERROR;
s=new LNode; //在内存中生成新的节点
cin>>s->data.id>>s->data.name>>s->data.price;
s->next=p->next; //将p的后继赋值给s的后继
p->next=s; //将s的后继赋值给p
return OK;
}
Status ListDelete_L(LinkList &L,int i){//删除单链表的第 i 个数据元素,表长减一
int j;
LinkList p,r;
p=L; //申明一个节点p,指向第一个节点
j=;
while(p&&j<i){ //寻找将要删除的第 i 个数据
p=p->next;
j++;
}
if(!p||j>i) //链表中第 i 个数据不存在
return ERROR;
r=p->next;
p->next=r->next; //将r的后继赋值给p的后继
return OK;
}
int main()
{
int choose,i;
LinkList L,p; //定义头结点
cout<<"1.建立"<<endl;
cout<<"2.输入"<<endl;
cout<<"3.查找"<<endl;
cout<<"4.插入"<<endl;
cout<<"5.删除"<<endl;
cout<<"6.输出"<<endl;
cout<<"0.退出"<<endl<<endl;
choose=-;
while(choose!=){
cout<<"请选择:"<<endl;
cin>>choose;
switch(choose){
case : //退出
cout<<"您已经成功退出系统,欢迎您的到来!"<<endl;
break;
case : //建立
if(InitList_L(L))
cout<<"线性链式表已成功建立!"<<endl;
else
cout<<"线性链式表建立失败!"<<endl;
break;
case : //输入
if(CreateList_L(L))
cout<<"图书信息内容已经成功输入!"<<endl;
else
cout<<"图书信息内容输入失败"<<endl;
break;
case : //查找
int i;
cout<<"请您输入将要查找的第几本书"<<endl;
cin>>i;
cout<<"您要查找的第"<<i<<"本书的信息如下:"<<endl<<endl;
GetElem(L,i);
cout<<"----------------------------------------------------------------------"<<endl;
break;
case : //插入
cout<<"请您输入在第几行插入新的图书:"<<endl;
cin>>i;
cout<<"请您为将要插入新的图书依次输入 图书编号、图书名称、图书价格:"<<endl;
ListInsert_L(L,i);
cout<<"您插入新的图书信息,如下所示:"<<endl<<endl;
cout<<left<<head_1<<left<<"\t\t\t\t"<<head_2<<left<<"\t\t\t"<<head_3<<endl;
p=L->next;
while(p){
cout<<left<<setw()<<p->data.id<<"\t\t"<<left<<setw()<<p->data.name<<p->data.price<<endl;
p=p->next;
}
cout<<"----------------------------------------------------------------------"<<endl;
break;
case : //删除
cout<<"请您输入将要删除的第几个元素:"<<endl;
cin>>i;
ListDelete_L(L,i);
cout<<"您已经成功删除第"<<i<<"个数据"<<endl;
cout<<"新的图书信息如下所示:"<<endl<<endl;
cout<<left<<head_1<<left<<"\t\t\t\t"<<head_2<<left<<"\t\t\t"<<head_3<<endl;
p=L->next;
while(p){
cout<<left<<setw()<<p->data.id<<"\t\t"<<left<<setw()<<p->data.name<<p->data.price<<endl;
p=p->next;
}
cout<<"----------------------------------------------------------------------"<<endl;
break;
case : //输出
LinkList p;
cout<<"图书信息如下:"<<endl<<endl;
cout<<left<<head_1<<left<<"\t\t\t\t"<<head_2<<left<<"\t\t\t"<<head_3<<endl;
p=L->next;
while(p){
cout<<left<<setw()<<p->data.id<<"\t\t"<<left<<setw()<<p->data.name<<p->data.price<<endl;
p=p->next;
}
cout<<"----------------------------------------------------------------------"<<endl;
break;
}
}
return ;
}
图书管理(单链表C++)的更多相关文章
- day 47 Django 4的简单应用 创建简单的图书管理 (单表的增删改查)
前情提要 Django 已经学了大半.. 很多东西已经能够使用在生产环境当中 一:模糊查询 二:单表删除 三:单表修改 四:图书管理 图书管理操作 视图结构 A:路由层 A :配置路由文件 参数解 ...
- 分离的思想结合单链表实现级联组件:CascadeView
本文介绍自己最近做省市级联的类似的级联功能的实现思路,为了尽可能地做到职责分离跟表现与行为分离,这个功能拆分成了2个组件并用到了单链表来实现关键的级联逻辑,下一段有演示效果的gif图.虽然这是个很常见 ...
- C语言实现单链表-02版
我们在C语言实现单链表-01版中实现的链表非常简单: 但是它对于理解单链表是非常有帮助的,至少我就是这样认为的: 简单的不能再简单的东西没那么实用,所以我们接下来要大规模的修改啦: Problem 1 ...
- 简单约瑟夫环的循环单链表实现(C++)
刚刚接触C++以及数据结构,今天做了第一次尝试用C++和数据结构解决问题,问题是基于约瑟夫环问题的简单版. 先来看看约瑟夫环问题的介绍: 约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3.. ...
- 66、django之模型层(model)--多表相关操作(图书管理小练习)
前面几篇随笔的数据库增删改查操作都是在单表的操作上的,然而现实中不可能都是单表操作,更多的是多表操作,一对一,一对多,多对多的表结构才是我们经常需要处理的,本篇将带我们了解多表操作的一些相关操作.也会 ...
- C语言 - 栈和单链表的实现
单链表:linkList.h linkList.c #ifndef LINKLIST_H_INCLUDE #define LINKLIST_H_INCLUDE #include <Windows ...
- django之模型层(model)--多表相关操作(图书管理小练习)
前面几篇随笔的数据库增删改查操作都是在单表的操作上的,然而现实中不可能都是单表操作,更多的是多表操作,一对一,一对多,多对多的表结构才是我们经常需要处理的,本篇将带我们了解多表操作的一些相关操作.也会 ...
- 图书管理(Loj0034)+浅谈哈希表
图书管理 题目描述 图书管理是一件十分繁杂的工作,在一个图书馆中每天都会有许多新书加入.为了更方便的管理图书(以便于帮助想要借书的客人快速查找他们是否有他们所需要的书),我们需要设计一个图书查找系统. ...
- 单链表删除(Delete)或者去除(Remove)节点面试题总结
(尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76061004冷血之心的博客) 关于单链表反转的多种形式请参见本博文 ...
随机推荐
- 记录RabbitMQ
第一步:建立Erlang环境 >>https://www.erlang.org/downloads 下载并安装.一路Next即可. 默认安装目录: C:\Program Files\erl ...
- Linux常用命令(自用)
1 抓包 tcpdump port 5060 and host 192.168.1.180 tcpdump -i ethx -w 1.pcap -s 0 2. 查看硬盘使用情况 df ./ 3.查看进 ...
- EF的导航属性
在EF中,外键被称为导航属性. 在EF core中,查询的时候默认是只查自身而不会去查询外键表的.如果想要让查询结果包含外键实体,则需要使用include方法来让查询结果包含外键实体.如 db.Stu ...
- javaScript节流与防抖
一.节流(throttle) 用来实现阻止在短时间内重复多次触发同一个函数.主要用途:防止使用脚本循环触发网络请求的函数的恶意行为,确保请求的真实性(当然也包括其他阻止高频触发行为的应用): 实现原理 ...
- 使用百度echarts仿雪球分时图(三)
这章节将完成我们的分时图,并使用真实的数据来进行展示分时图. 一天的交易时间段分为上午的09:30~11:30,下午的13:00~15:00两个时间段,因为分时间段的关系,数据是不连续的,所以会先分为 ...
- JDK,JRE,JVM 关系和概念
JDK : Java Development ToolKit(Java开发工具包).JDK是整个JAVA的核心,包括了Java运行环境(Java Runtime Envirnment),一堆Java工 ...
- 每天一个Linux命令之:chage
命令简介: 该命令用于密码时效管理.它可以修改账号和密码的有效期.对于chage命令的描述如下所示: The chage command changes the number of days betw ...
- 13.SpringMVC核心技术-异常处理
常用的SpringMVC异常处理方式主要是三种: 1.使用系统定义好的异常处理器 SimpleMappingExceptionResolver 2.使用自定义异常处理器 3.使用异常处理注解 Si ...
- kbmMW Scheduler.InAMoment用法
kbmMW Scheduler提供了一个方法InAMoment,由于没有找到调用的例子,只好查看代码,原来这个方法与RunNow差不多,是立即执行一个方法,并且在主线程中. Scheduler.InA ...
- shell脚本——数组
连续的变量 解决:变量过多的问题,在同一类变量中,不需要定义多个名字,而是以数组的方式来定义 定义数组: declare -I 定义整数 declare -a 定义数组 declare -A 定义嵌套 ...