#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; } return true; } book *head=NULL; book *make() //一个链表的构造 { book *p1,*p2; p1=new book; head=p1; p2=p1; cout<<"请输入图书的数量,以0结束:"<<endl; string str; cin>>str; while(!check(str)) { cout<<"您刚才输入的不符合要求,请重新输入···"; cin>>str; } p1->num=atoi(str.c_str()); if(p1->num!=0) { cout<<"请输入图书的价格"<<endl; cin>>str; while(!check(str)) { cout<<"您刚才输入的不符合要求,请重新输入···"; cin>>str; } p1->price=atof(str.c_str()); } else { delete p1; p2=NULL; head=NULL; return head; } while(p1->num!=0) { p2=p1;//移动指针 p1=new book; cout<<"请输入图书的数量,以0结束:"<<endl; cin>>str; while(!check(str)) { cout<<"您刚才输入的不符合要求,请重新输入···"; cin>>str; } p1->num=atoi(str.c_str()); if(p1->num!=0) { cout<<"请输入图书的价格"<<endl; cin>>str; while(!check(str)) { cout<<"您刚才输入的不符合要求,请重新输入···"; cin>>str; } p1->price=atof(str.c_str()); } p2->next=p1;//链接上新构造好的节点 } delete p1; p2->next=NULL; return head; } void shuchu(book *head)//链表的输出 { book *p=head; while(p!=NULL) { cout<<"数量:/t"<<p->num<<"价格:"<<p->price<<endl; p=p->next; } } void deletelian(book *head,int num)//链表的删除操作 { book *l=NULL; if(head==NULL) cout<<"该链为空!"; else if(head->num==num) { l=head; head=head->next; ::head=head;//因为你改变的只是局部变量的head,函数调用结束之后局部变量会被销毁,所以要复制给全局变量head delete l; return; }//删除头结点你的操作 while(head) { if(head->next==NULL) { cout<<"找不到要输出的节点/n"; break; } if(head->next->num==num) { l=head->next; head->next=l->next; delete l; cout<<"操作成功!/n"; break; } head=head->next; } } void LastInsert(book *head,int num,float price)//尾插法 { book *l; while(head) { l=head; head=head->next; } book *s=new book; l->next=s; s->num=num; s->price=price; s->next=NULL; } void HeadInsert(book *head,int num,float price)//头插法 { book *l=new book; l->next=head; l->num=num; l->price=price; ::head=l; cout<<"ssss"; } void FlowInsert(book *head,int num,float price) { book* l=new book; l->num=num; l->price=price; //***************如果没有该链存在****************// if(head==NULL) { head=l; ::head=head; l->next=NULL; return; } //***************如果其编号比第一个起始节点的编号还要小,使用头插法****************// if(num<=head->num) { l->next=head; ::head=l; return; } //***************如果其编号介于两个号码之间使用中间插入法*******************// book* temp=NULL; while(head) { if(num>head->num) { temp=head; head=head->next;//链上所有节点编号都小于新申请节点编号;使用下面的尾插法// } else break;//发现号码间隔(空挡) } if(head)//***************如果其编号介于两个号码之间使用中间插入法*******************// { l->next=head; temp->next=l; //return; } if(head==NULL)//***************尾插法*******************// { temp->next=l; l->next=NULL; } } int main() { /* head=make(); shuchu(head); string s; cout<<"输出要删除的书号:/n"; cin>>s; while(!check(s)) { cout<<"输入不合法/n"; cin>>s; } int num=atoi(s.c_str()); deletelian(head,num); //cout<<p<<"/t"<<head<<endl; LastInsert(head,23,56); HeadInsert(head,1111,1111); shuchu(head);*/ cout<<"请录入书目信息:/n"; int i=0,num; float price; while(i<10) { cout<<"书号num:"; cin>>num; cout<<"价格price:"; cin>>price; FlowInsert(head,num,price); i++; } shuchu(head); return 0; }