图书链表
来源:互联网 发布:服装设计用什么软件好 编辑:程序博客网 时间:2024/05/21 15:07
#include <iostream>#include <string>using namespace std;class book{public:int num;float price;book*next;};bool check(string str){int i,j=0;if (str[0]=='.') //假如字符串第一个元素为小数点返回假return false;for (i=0;i<str.length();i++){if ((str[i]=='.')) //验证字符串中有几个小数点j++;}if (j>1)return false; //假如小数点多于一个返回假for (i=0;i<str.length();i++)if((str[i]>'9'||str[i]<'0')&&(str[i]!='.'))return false; //假如字符串中不是0-9和小数点返回假return true;}book *head=NULL; //全局头指针//动态创建链表book *creat() { //p1作为下一个节点的指针,p2作为下个节点的指针 book *p1,*p2; p1=new book; head=p1; p2=p1; cout<<"请输入图书的编号,以0结束"<<endl; string str;cin>>str;while(!check(str)){cout<<"输入的不是数字重新输入,按零返回"<<endl;cin>>str;}p1->num=atoi(str.c_str()); //atoi将字符串转换为整形变量 if(p1->num!=0) { cout<<"请输入图书价格"<<endl; cin>>str;while(!check(str)){ cout<<"输入的不是数字重新输入,按零返回"<<endl; cin>>str;}p1->price=atof(str.c_str()); //atof将字符串转换为浮点型变量 } else { delete p1;p2=NULL;head=NULL;return head; } while(p1->num!=0) { p2=p1; //p2保存的是当p1的指针, p1=new book; //p1保存的是新开辟的空间 cout<<"请输入图书的编号,以0结束"<<endl; string str; cin>>str; while(!check(str)){ cout<<"输入的不是数字重新输入,按零返回"<<endl; cin>>str;}p1->num=atoi(str.c_str()); if(p1->num!=0) { cout<<"请输入图书价格"<<endl; cin>>str; while(!check(str)){ cout<<"输入的不是数字重新输入,按零返回"<<endl; cin>>str;} p1->price=atof(str.c_str()); } p2->next=p1; //由于p保存的是p1的原来的指针,就等于旧的p1->next保存新的p1。 } delete p1; //最好一个保存的是0,所以删除掉 p2->next=NULL; //最新的p1也就是链中最后变的p1的next成员指针保存的值为空 return head; //由于head指针和p2都是保存的p1最开始的指针,所以p2的作用是不断的给旧的p1保存新的p1,head的作用是利用最旧的p1查找p1保存的链式数据。 } //动态链表删除void Delete (book *head,int num){book *l;if(head->num==num) //假如head的头节点是所要删除的节点{l=head; //让i保存当前头指针head=head->next; //然后当前节点指向它的后一个节点::head=head; //把新的头节点赋给全局headdelete l; //然后删除旧的节点cout<<"操作成功"<<endl;return; //返回 结束delete函数}while(head){if (head->next==NULL) //假如一直没有找到所要删除的编号的节点{cout<<"找不到的编号"<<endl; //输出找不到编号return; //然后返回 结束函数}if (head->next->num==num) //假如找到了所要删除的节点编号{l=head->next; //l节点保存所要删除的当前节点head->next=l->next; //所要删除的节点指向它的后一个节点delete l; //然后删除当前节点 形成新的链cout<<"操作成功"<<endl;return;}head=head->next;}cout<<"找不到要删除的编号"<<endl;}//动态链表的显示void Showbook(book *head){cout<<endl;cout<<"图书信息如下:"<<endl;while(head){cout<<"图书编号:"<<head->num<<"\t";cout<<"图书价格:"<<head->price<<endl;head=head->next;}}//动态链表的插入void insert(book*head,int num,int price){book*list=new book;list->num=num;list->price=price;if (num<=head->num) //判断新插入的节点的编号是否小于等于头节点的编号{ list->next=head; //小于则插在头节点前面 ::head=list;return; //新节点成为了头节点要退出insert函数}book*temp=NULL;while((num>head->num)&&(head->next!=NULL)){temp=head;head=head->next; //head指向最后一个节点}if (num>head->num) //判断新节点编号是否大于head的尾节点编号{head->next=list; //list为尾节点list->next=NULL; //注意 由于list节点是尾节点,所以它的next指针赋为空。}else{temp->next=list; //temp保存了前一个节点的地址,head保存的下一个节点的地址//前一个节点就接上了list,然后list保存head节点,这样list就在中间插入了list->next=head;}}//返回图书编号int getbooknum(book *head){int num=0;while(head){num++;head=head->next;}return num; //返回有多少本书}//要用main()函数使用以上的功能组成一个图书管理系统void main(){string str;begin: //goto标签begincout<<"1->重建图书 2->显示图书 3->插入图书 4->删除图书 5->图书数目 Q->退出"<<endl;//↑提示信息cin>>str;if(str[0]=='1') //假如选择了重建图书{creat(); //调用动态创建图书函数system("cls"); //清楚屏幕上所有的文字goto begin; //无条件返回goto标签,执行goto标签后面的程序}else if(str[0]=='2'){if(head==NULL){cout<<"你现在的图书是空的,请增加图书"<<endl<<"按回车返回主程序"<<endl;cin.get(); //cin.get()保存用户输入的字符,第一个cin.get()保存用户输入的回车键cin.get(); //第一个实现了暂停,提示按任意键继续,所以第二个cin.get()执行以后,就直接执行下一条语句了system("cls"); //清屏goto begin; //返回begin标签}Showbook(head);cout<<"按回车返回主程序"<<endl;cin.get();cin.get();system("cls");goto begin;}else if(str[0]=='3'){if(head==NULL){cout<<"你的图书现在是空的,请增加书"<<endl<<"按回车返回主程序"<<endl;cin.get();cin.get();system("cls"); goto begin; //假如没有书,返回begin标签}cout<<"请输入要插入的图书的编号:"<<endl;string str1; cin>>str1;float price;int num; while(!check(str1)){ cout<<"输入的不是数字重新输入,按零返回"<<endl; cin>>str1;}num=atoi(str1.c_str()); if (num!=0){ cout<<"请输入图书价格"<<endl; string str2; cin>>str2; while(!check(str2)){ cout<<"输入的不是数字重新输入,按零返回"<<endl; cin>>str2;}price=atof(str2.c_str());}else{system("cls");goto begin;}insert(head,num,price);cout<<"操作完毕,按回车返回主程序"<<endl;cin.get();cin.get();system("cls");goto begin;}else if(str[0]=='4'){if (head==NULL){cout<<"你现在的图书是空的,请增加书"<<endl<<"按回车返回主程序"<<endl;cin.get();cin.get();system("cls");goto begin;}int num;cout<<"请输入要删除的图书编号:"<<endl;string str3;cin>>str3;while(!check(str3)){cout<<"输入的不是数字,请重新输入,按0返回!!"<<endl;cin>>str3;}num = atoi(str3.c_str());Delete(head,num);cout<<"操作成功按回车返回主程序"<<endl;cin.get();cin.get();system("cls");goto begin;}else if(str[0]=='5'){cout<<"图书数目是:"<<getbooknum(head)<<endl<<"按回车返回主程序"<<endl;cin.get();cin.get();system("cls");goto begin;}else{if(str[0]!='Q'&&str[0]!='q'){cout<<"请输入数字!按回车继续操作";}if(str[0]!='Q'&&str[0]!='q'){cin.get();cin.get();system("cls");goto begin;}system("pause");}}
- 图书链表
- 链表实现图书管理系统
- 图书
- 图书
- 图书
- 图书
- 图书
- 图书
- C链表和文件操作实战--图书管理系统
- c++图书编号与价格 链表的创建及显示
- 黑马程序员--C语言指针链表之图书管理系统
- 从Excel电子表格生成图书信息表
- 实验室图书管理系统--数据库表
- 图书商城:图书模块
- Oracle从Excel电子表格生成图书信息表
- 【图书】CSS重构:样式表性能调优
- J2ME图书
- 职业图书
- 绑定RadioButtonList
- 学会使用接口
- 算法类面试题-1
- uva 10129 - Play on Words
- 如何动态设置客户区的大小?
- 图书链表
- 算法类面试题-2
- Eclipse常用插件
- git
- Linux socket之四:使用POLL机制处理多连接
- 如何用美剧真正提升你的英语水平
- 算法类面试题-3
- Xcode安装报错
- 汇编学习--7.11--内存寻址