#include<iostream>
#include<string>
#include<iomanip>
#include<fstream>
#include<cstdlib>
using namespace std;
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status;
typedef int ElemType;
struct Book{
string id;//ISBN
string name;//书名
double price;//定价
};
typedef struct LNode{
Book data;//节点的数据域
struct LNode *next;//节点的指针域
}LNode,*LinkList;// LinkLIst是指向LNode的指针类型
string head_1,head_2,head_3;
int length;
//单链表的初始化
Status InitList_L(LinkList &L){
L=new LNode;//生成新的节点为头结点
L->next=NULL;//头节点的指针域置空
return OK;
}
//单链表的取值
Status GetElem_L(LinkList L,int i,Book &e){
int j;//在带头结点的单链表L中查找第i个元素
//用e返回L中第i个数据元素的值
LinkList p;
p=L->next;
j=1;
while(j<i&&p){//顺链域向后扫描,直到p指向第i个元素或p为空
p=p->next;//p指向想一个结点
++j;//计速器j加1
}
if(!p||j>i)//值不合法或i>n 或i<=0
return ERROR;
e=p->data;//取第i个结点的数据域
return OK;
}
//按值查找
LNode *LocateElem_L(LinkList L,double e){
LinkList p;
p=L->next;
while(p&&p->data.price!=e)//顺链域向后扫描,直到p为空或p所指结点为所要结点
p=p->next;//指向下一个结点
return p;//查找成功返回值为e的结点地址p,查找失败p为null
}
Status ListInsert_L(LinkList &L,int i,Book &e){
//在带头结点的单链表L中第i个位置插入值为e的新结点
int j;
LinkList p,s;
p=L;
j=0;
while(p&&j<i-1){
p=p->next;
++j;
}//查找第i个结点,p指向该节点
if(!p||j>i-1) return ERROR;
s=new LNode;
s->data=e;//将e的数据保存到新建的结点s中
s->next=p->next;//让s指向第i个结点指的下一个结点
p->next=s;//让当前i的节点指向新结点s
++length;// 链表长度+1
return OK;
}
//删除单链表第i个结点
Status ListDelete_L(LinkList &L,int i){
LinkList p,q;
int j;
p=L;
j=0;
while((p->next)&&(j<i-1)){//查找第i个结点,p指向该结点
p=p->next;
++j;
}
if(!(p->next)||(j>i-1))
return ERROR;//当i>n或i<1时,删除位置不合理
q=p->next;//保存被删除结点的地址
p->next=q->next;//改变删除结点前驱结点的指针域
delete q;//释放删除结点的空间
--length;
return OK;
}
//前插法创建单链表
void CreateList_H(LinkList &L,int n){
//逆位序输入n个元素的值,建立到头结点的单链表L;
LinkList p;
L=new LNode;
L->next=NULL;//先建立一个带头结点的空链表
length=0;
fstream file;
file.open("book.txt");
if(!file){
cout<<"未找到相关文件,无法打开"<<endl;
exit(ERROR);
}
file>>head_1>>head_2>>head_3;
while(!file.eof()){
p=new LNode;//生成新节点*p
file>>p->data.id>>p->data.name>>p->data.price;//给结点赋值
p->next=L->next;//末尾结点指向NULL
L->next=p;//L结点指向p
length++;//长度+1;
}
file.close();
}
//后插法插入输入数据
void CreateList_R(LinkList &L,int n){
LinkList p,r;
L=new LNode;
L->next=NULL;
r=L;
length=0;
fstream file;
file.open("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;//将新节点*p插入尾结点*r之后
r=p;//指向新的尾结点*p
length++;
}
file.close();
}
int main(){
int a,n,choose;
double price;
Book e;
LinkList L,p;
cout<<"1.建立"<<endl;
cout<<"2.输入"<<endl;
cout<<"3.取值"<<endl;
cout<<"4.查找"<<endl;
cout<<"5.插入"<<endl;
cout<<"6.删除"<<endl;
cout<<"7.输出"<<endl;
cout<<"0.退出"<<endl;
choose=-1;
while(choose!=0){
cout<<"请选择:";
cin>>choose;
switch(choose){
case 1:if(InitList_L(L))
cout<<"成功建立单链表
";
break;
case 2:
CreateList_R(L,length);
cout<<"输入book.txt信息完毕
";
break;
case 3:
cout<<"请输入一个位置用来取值";
cin>>a;
if(GetElem_L(L,a,e)){
cout<<"查找成功
";
cout<<"第"<<a<<"本图书的信息是:
";
cout<<left<<setw(15)<<e.id<<" "<<left
<<setw(50)<<e.name<<" "<<left<<setw(5)<<e.price
<<endl;
}else
cout<<"查找失败
";
break;
case 4:
cout<<"请输入要查找的价格:";
cin>>price;
if(LocateElem_L(L,price)!=NULL){
cout<<"查找成功
";
cout<<"该价格对应的书名为: "<<LocateElem_L(L,price)->data.name<<endl<<endl;
}else cout<<"查找失败!定价"<<price<<"没有找到
";
break;
case 5:
cout<<"请输入插入的位置和书的信息,包括:编号,书名,价格 (用空格隔开):";
cin>>a;
cin>>e.id>>e.name>>e.price;
if(ListInsert_L(L,a,e))
cout<<"插入成功
";
else cout<<"插入失败
";
break;
case 6:
cout<<"请输入所要删除书籍的位置:";
cin>>a;
if(ListDelete_L(L,a))
cout<<"删除成功!
";
else cout<<"删除失败";
case 7:
cout<<"当前图书系统信息(链表)读出:
";
p=L->next;
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;
}
}
return 0;
}
链表的结构为 一个结点指向下一个结点的地址,末尾结点为空。
附带book.txt 信息
ISBN 书名 定价
9787302257646 程序设计基础 25
9787302219972 单片机技术及应用 32
9787302203513 编译原理 46
9787811234923 汇编语言程序设计教程 21
9787512100831 计算机操作系统 17
9787302265436 计算机导论实验指导 18
9787302180630 实用数据结构 29
9787302225065 数据结构(C语言版) 38
9787302171676 C#面向对象程序设计 39
9787302250692 C语言程序设计 42
9787302150664 数据库原理 35
9787302260806 Java编程与实践 56
9787302252887 Java程序设计与应用教程 39
9787302198505 嵌入式操作系统及编程 25
9787302169666 软件测试 24
9787811231557 Eclipse基础与应用 35