// 11图书 药品管理系统/*#include#include using namespace std;class Date{public: Date(int n, float p):number(n),price(p){} float GetPrice()const{ return price; } int GetNumber()const{ return number;} virtual void print()const = 0; //抽像类,纯虚函数 virtual ~Date(){} private: int number; //编号 float price; //介格};class Book:public Date{public: Book(int n, float p):Date(n,p){} virtual void print()const //定义纯虚函数 { cout<<"图书的编号为:"< < GetNext(); delete m; n++; cout<<"删除第"< <<"个节点!"< GetDate(); }else{ return NULL; }}Date *List::operator[](int offset)const{ Node* pn = head; if(!head) { return NULL; } //注这里的要把下标在一个安全的范围内 if(offset>=count){ //元素值大于总数 return NULL; } for(int i=0; i GetNext(); } return pn->GetDate();}void List::show()const{ if(!head){ return; } Node *pn = head; do{ pn->GetDate()->print(); }while(pn = pn->GetNext());}void List::InSert(Date *pDate){ Node *pn = new Node(pDate); Node *pNow = head; Node *pNext = 0; //当前节点的下一个节点的地址,实始化为0 int New=pDate->GetNumber(); //取得商品编号 int next = 0; //下一个节点的商品编号 count++; if(!head){ //设置头节点,判断头节点是否存在 head = pn; return; } //头节点的数据的number值是否大于新节点的编号 if(head->GetDate()->GetNumber() > New){ //将新节点设置为头节点,头节点成为了新节点的下一个节点 pn->SetNext(head); //将新节点的下一个节点设置为头节点 head = pn; //将来pn设置的新节点设置为新节点 return; } for(;;) { //当前节点的next指针是否为空,也就是有没有下一个指针对 if(!pNow->GetNext()){ pNow->SetNext(pn); //将新节点设置为下一个节点 return; } pNext = pNow->GetNext(); //当前节点还有下一个节点,那么获取当前节点的下一个节点 next = pNext->GetDate()->GetNumber(); //取得下一个节点的number值 if(next > New){ //当前节点的下一个节点的编号,与新节点的编号相对比 pNow->SetNext(pn);//当前节点的下一个节点设置为新节点 pn->SetNext(pNext); //用pn指向的下一个节点的设置为当前节点的下一个节点 return; } pNow = pNext; //如果没有找到相应的位置,那么将当前节点的下一个节点设置为当前节点 }}//删除函数void List::Delete(int number){ Node *pBack=head; //保存上一个节点的地址,初始化的地址为头节点的地址 Node *pNow=head; //当前节点,初始化为头节点的地址 if(!head){ cout<<"没有数据可删除!"< GetDate()->GetNumber() == number) { //判断头节点下面是否还有节点 if(!head->GetNext()){ //不存在下一个节点 delete head; cout<<"数据被清空!"< GetNext(); delete pNow; pNow =0; cout<<"删除成功!"< GetNext() == NULL){ //没有下一个节点 cout<<"找不到要删除的编号"< GetNext()->GetDate()->GetNumber() == number) { pNow = pBack->GetNext(); pBack->SetNext(pNow->GetNext()); //头节点和被删除节点的下一个节点相联起来 delete pNow; cout<<"删除数据成功!"< GetNext(); } cout<<"不存在此编号数据"< GetNext()) { if(pn->GetDate()->GetNumber() == number) { break; } } if(pn==NULL){ return NULL; }else{ return pn->GetDate(); }}Date*List::Find(int &increase, int number)const{ Node*pn=0; for(pn=head, increase=0; pn!=NULL; pn=pn->GetNext(), increase++) { if(pn->GetDate()->GetNumber() == number){ break; } } if(pn == NULL){ return NULL; }else{ pn->GetDate(); }}class Repair{public: void RInsert(Date*newdate); void Ran();private: List pl;};void Repair::Ran(){ //List pl; Date *pDate =0; int number; //编号 float price; //价格 int choice; //选项 bool quit=false; while(1) { system("cls"); cout<<"(1)添加商口 (2)列出所有商品 (3)删除商品 (4)查找商品 (5)统计商品数目 (6)退出"< >choice; switch(choice) { case 1: //添加商品 while(1) { cout<<"(0)返回 (1)图书 (2)药品"< >choice; if(!choice){ break; }else if(choice==1 || choice==2){ cout<<"请输入编号"< >number; if(choice==1){ cout<<"请输入图书价格"< >price; pDate = new Book(number,price); //pl.InSert(pDate); RInsert(pDate); }else if(choice==2) { cout<<"请输入药品价格"< >price; pDate = new Drug(number,price); //pl.InSert(pDate); RInsert(pDate); }else{ cout<<"请输入0到2之间的数字"< >number; pl.Delete(number); cin.get(); cin.get(); break; case 4: //查找商品 while(1) { cout<<"(0)返回 (1)按编号进行查询 (2)按序号进行查询"< >choice; if(!choice){ break; }else if(choice==1 || choice==2){ if(choice==1){ cout<<"请输入所有查找的商品编号"< >number; Date*result = pl.Find(number); if(result==0){ cout<<"找不到该编号"< print();//print是虚函数,可以去动态 } }else if(choice==2) { cout<<"请输入所要查找的数据的序号:"< >number; if(pl[number-1]) { pl[number-1]->print(); }else{ cout<<"找不到你要查询的数据"< ::max()返回缓冲区的大小 cin.ignore(numeric_limits ::max(),'\n'); cout<<"您只可以输入1-6之间的数字,请重新输入"< GetNumber(); int place =0; //查找数据的次数 if(pl.Find(place,num)) { cout<<"您输入的编号"< <<"与链表中"<