码迷,mamicode.com
首页 > 编程语言 > 详细

C++链表的插入与删除

时间:2018-03-09 22:48:47      阅读:279      评论:0      收藏:0      [点我收藏+]

标签:list   链表   ++   date   图书   []   保存   --   public   

#include<iostream>
#include<limits>
using namespace std;
class Date
{
public:
Date ():date(1){}
Date(int number):date(number){}
virtual ~Date(){}
int GetDate()const {return date;}
virtual void print() const = 0;
private:
int date;
};
class Book:public Date
{
public:
Book():Price(94){}
Book(float Price,int number);
virtual void print()const
{
cout<<"图书编号为:"<<Book::GetDate()<<endl;
cout<<"图书的价格为:"<<Price<<endl;
}
private:
float Price;
};
Book::Book(float price,int number):Price(price),Date(number){}
class medica:public Date
{
public:
medica():Price(94){}
medica(float Price,int number);
virtual void print()const
{
cout<<"药品的编号为:"<<medica::GetDate()<<endl;
cout<<"药品的价格为:"<<Price<<endl;
}
private:
float Price;
};
medica::medica(float price,int number):Price(price),Date(number){}
class Node
{
public:
Node(Date*);
~Node();
void setnext(Node*node){itsnext=node;}
Node*getnext()const;
Date*getDate()const;
private:
Node*itsnext;
Date*itsDate;
};
Node::Node(Date*pDate):itsDate(pDate),itsnext(0){}
Node::~Node()
{
delete itsDate;
itsDate=0;
delete itsnext;
itsnext=0;
}
Node*Node::getnext() const
{
return itsnext;
}
Date*Node::getDate()const
{
if(itsDate)
return itsDate;
else
return NULL;
}

class List
{
public:
List();
~List();
Date*List::find(int number)const;
Date*find(int &increase,int count)const;
int getcount()const{return count;}//获得节点的个数
Date*getfirst()const;
void insert(Date*);
void repeat()const;
Date*operator[](int)const;
void Delete(int num);
void show()const;
private:
int count;
Node *head;
};
List::List():head(0),count(0){}
List::~List()
{
delete head;
}
Date*List::find(int number)const
{
Node*pn=0;
for(pn=head;pn!=NULL;pn=pn->getnext())
{
if(pn->getDate()->GetDate()==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()->GetDate()==number)
break;

if(pn==NULL)
return NULL;
else
return pn->getDate();
}
Date*List::getfirst()const
{
if(head)
return head->getDate();
else
return NULL;
}
void List::insert(Date*pDate)//接收一个要插入链表中数据对象的地址
{
Node*pn=new Node(pDate);//堆中创建一个节点Node并将数据对象的地址传递给它 返回新节点的地址 并由临时指针pn保存
Node*pNow=head;
Node*pNext=0;//当前节点的下一个节点的地址
int New=pDate->GetDate();
int next=0;
count++;
if(!head)
{
head=pn;
return;
}
if(head->getDate()->GetDate()>New)//第一个getDate是Node类的成员函数,返回date对象的地址;GetDate获取商品的编号;最终获得头结点的商品编号
{
pn->setnext(head);//将新节点的下一个节点设置为头结点
head=pn;//更新头结点 这样就完成了新节点成为头结点,先前的头结点成为了新节点的下一个节点
return;
}
for(;;)
{
if(!pNow->getnext())//当前节点的Next指针是否为空
{
pNow->setnext(pn);//当前节点的Next指针不存在 通过PNow调用setnext设置头节点的下一个节点为新节点
return;
}
pNext=pNow->getnext();//下一个节点的地址有PNext保存
next=pNext->getDate()->GetDate();
if(next>New)//下一节点的商品编号大于新节点的商品编号
{
pNow->setnext(pn);//通过PNow调用setnext设置头节点的下一个节点为新节点其PNow本身还为头结点的地址
pn->setnext(pNext);//新节点的下一个节点设置为当前节点的下一个节点
return;
}
pNow=pNext;//把末尾的节点重新赋给当前节点 循环判断
}
}
void List::repeat()const// 输出数据编号
{
if(!head)
return;
Node*pn=head;
do
pn->getDate()->print();//遍历节点 输出数据编号
while(pn=pn->getnext());
}
Date*List::operator[](int offset)const//获取某个节点的数据 offset为待找节点的编号
{
Node*pn =head;
if(!head)
return NULL;
if(offset>=count)//count链表的元素个数
return NULL;
for(int i=0;i<offset;i++)
pn=pn->getnext();
return pn->getDate();
}
void List::Delete(int num)
{
Node*pBack=head;
Node*pNow=head;
if(!head)
cout <<"没有数据可删除"<<endl;
if(head->getDate()->GetDate()==num)
{
if(!head->getnext())
{
delete head;
cout<<"数据被清空\n";
head =0;
count--;
return;
}
else
{
head=head->getnext();
delete pNow;
pNow=0;
cout<<"删除成功";
count--;
return;
}
}

while(pBack)
{
if(pBack->getnext()==NULL)
{
cout<<"找不到要删除的编号\n";
return;
}
if(pBack->getnext()->getDate()->GetDate()==num)//删除头节点的下一个节点
{
pNow=pBack->getnext();
pBack->setnext(pBack->getnext());//pBack节点的下一个节点设置为被删除节点的下个节点;完成将头结点的下个节点设置为头结点的的下个节点的下个节点
delete pNow; //将pBack的下一个节点设置为PNow的下一个节点
cout<<"删除数据成功";
count--;
return ;
}
pBack=pBack->getnext();
}
cout<<"不存在此编号";
}
void List::show()const
{
if(!head)
{
return;
}
Node*pn=head;
do
{
pn->getDate()->print();
}while(pn=pn->getnext());

}
class Repair
{
public:
void insert(Date*);
void PrintAll(){ll.repeat();}
private:
Node*head;
List ll;
};
void Repair::insert(Date*newdate)
{
int num=newdate->GetDate();
int place=0;
if(!ll.find(place,num))
ll.insert(newdate);
else
{
cout<<"您输入的编号"<<num<<"与链表中";
switch(place)
{
case 0:cout<<"第"<<place+1;break;
default: cout<<"第"<<place+1;
}cout<<"个编号重复";
}
}
int main()
{
List p1;
Date*pDate=0;
int number;//商品的编号
float value;
int choice;
bool quit=false;
while(1)
{
system("cls");
cout<<"(1)增加商品(2)列出所有商品(3)删除商品(4)查找上商品(5)商品的数目(6)退出:";

cin>>choice;
switch(choice)
{
case 1:
while (1)
{
cout<<"(0)返回(1)图书(2)药品";
cin>>choice;
if(!choice)
break;
else if(choice==1||choice==2)
{
cout<<"请输入编号:";
cin>>number;
if(choice==1)
{
cout<<"请输入图书价格:";
cin>>value;
pDate=new Book(value,number);

}
else if(choice==2)
{
cout<<"请输入药品的价格:";
cin>>value;
pDate=new medica(value,number);
p1.insert(pDate);
}
}
else
{
cout<<"请输入0—2之间的数字\n";
}
}

break;
case 2:
if(p1.getfirst()==0)
{
cout<<"你的商品为空,请增加商品\n"<<"按回车键返回主菜单\n";
cin.get();
cin.get();
}
else
{
p1.show();
cout<<"请按回车键返回主窗口\n";
cin.get();
cin.get();
}
break;
case 3:
cout<<"请输入你要删除的编号"<<endl;
cin>>number;
p1.Delete(number);
cin.get();
cin.get();
break;
case 4:
while (1)
{
cout<<"(0)返回(1)按编号进行查询(2)按序号进行查询";
cin>>choice;
if(!choice)
break;
else if(choice==1||choice==2)
{

if(choice==1)
{
cout<<"请输入索要查找的编号:";
cin>>number;
Date*result=p1.find(number);
if(result==0)
{
cout<<"找不到该编号\n";
}
else
result->print();
}
else if(choice==2)
{
cout<<"请输入索要查找的序号:";
cin>>number;
if(p1[number-1])
{
p1[number-1]->print();
}
else

cout<<"找不到查询的数据\n";
}
}
else
cout<<"请输入0-2的数字\n";
}
break;
case 5:
cout<<"该链表共有"<<p1.getcount()<<"节点\n";
cin.get();
cin.get();
break;
case 6:
quit=true;
break;
default:
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(),‘\n‘);
cout<<"只能输入1-6\n"<<"请安回车键返回重新录入\n";
cin.get();
break;
}


if(quit)
{
cout<<"程序结束\n";
break;
}
}

return 0;
}



C++链表的插入与删除

标签:list   链表   ++   date   图书   []   保存   --   public   

原文地址:https://www.cnblogs.com/dourcer/p/8536377.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!