C++链表的插入与删除

#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;
}

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

时间: 2024-10-21 09:00:31

C++链表的插入与删除的相关文章

数据结构Java实现03----单向链表的插入和删除

数据结构Java实现03----单向链表的插入和删除 文本主要内容: 链表结构 单链表代码实现 单链表的效率分析 一.链表结构:            概念: 链式存储结构是基于指针实现的.我们把一个数据元素和一个指针称为结点.   数据域:存数数据元素信息的域. 指针域:存储直接后继位置的域. 链式存储结构是用指针把相互直接关联的结点(即直接前驱结点或直接后继结点)链接起来.链式存储结构的线性表称为链表. 链表类型: 根据链表的构造方式的不同可以分为: 单向链表 单向循环链表 双向循环链表 二

简直offer之链表的插入和删除

在插入和删除链表的时候一定要注意不要让链表断了,另外要特别注意对头结点的单独考虑 参考剑指offer上第50页删除给定值的结点的代码.得知,要删除一个节点必须知道该节点的前一个节点.书上的代码使用pNode.next 和pNode.next.value来判断的 下面把代码附上,有个问题 public static ListNode deleteNode(ListNode head,int value){ if(head==null){ return null; } ListNode toBeDe

单链表实现“插入”和“删除”操作

在单链表中,又如何实现"插入"和"删除"操作呢? 插入操作: 假设我们要在线性表的两个数据元素a和b之间插入一个数据元素x,已知p为其单链表存储结构中指向结点a的指针.为插入数据元素x,首先要生成一个数据域为x的结点,然后插入在单链表中.根据插入操作的逻辑定义,还需修改结点a中的指针域,令其指向结点x,而结点x中的指针域应该指向b结点,从而实现3个元素a,b和x之间逻辑关系的变化. 假设s为指向结点x的指针.则上述指针修改用语句描述即为: s->next=p-

链表的插入、删除

结构体: 1 typedef struct Student{ 2 int m_val; 3 struct Student* m_next; 4 }NODE,*pNODE; 链表的插入: 1 //尾部插入 2 void linkInitTail(pNODE* pphead) 3 { 4 int val; 5 pNODE pNew,pTail; 6 while(scanf("%d",&val) == 1) 7 { 8 pNew = (pNODE)calloc(1,sizeof(NO

面试之路(10)-BAT面试之java实现单链表的插入和删除

链表的结构: 链表在空间是不连续的,包括: 数据域(用于存储数据) 指针域(用于存储下一个node的指针) 单项链表的代码实现: 节点类 构造函数 数据域的get,set方法 指针域的get,set方法 代码: public class Node { Object element; //数据域 Node next; //指针域 //构造方法 public Node(Object obj, Node nextval) { this.element = obj; this.next = nextva

Partition List(链表的插入和删除操作,找前驱节点)

Given a linked list and a value x, partition it such that all nodes less than x come before nodes greater than or equal to x. You should preserve the original relative order of the nodes in each of the two partitions. For example,Given 1->4->3->2

单链表的插入和删除

1 #define OKO 1 2 #define ERROR 0 3 typedef struct Lnode{ 4 ElemType data;//数据域 5 struct Lnode *next; //指针域 6 }Lnode,*Linklist; 7 Lnode *LocateElem_L(Linklist L,Elemtype e){ 8 //在链表中查找值为e的数据元素 9 Lnode *p; 10 p=L->next; 11 while(p&&p->data!=e

静态链表的插入和删除

小结: 1.线性链表.静态链表 <数据结构>严 0 1 2 3 4 5 6 7 8 ZHAO QIAN SUN LI ZHOU WU ZHENG WANG 1 2 3 4 5 6 7 8 0 第一行为顺序号,可作为指针值 第二行为节点值 第三行指针值 初始状态 0->1 1->2 ... 7->8 8->0 插入SHI,在LI之后 注意2点:插入式放在末尾 “插入SHI”:第一步,指针值没有改变 0 1 2 3 4 5 6 7 8 9 ZHAO QIAN SUN LI

单链表的读取、插入与删除

链表是由一个个结点构成,而每一个结点都是由存储数据的数据域以及存储下一个结点地址的地址域两部分构成. 链表的一大优点就是,可以在任意两个数之间毫无限制的插入无限多的数据.在很多时候,我们都需要对数据做个查找工作,就比如,一个班的同学去上课,结果老师发现人数不对,于是就开始点名,点到后来发现某某某同学没有到,这就是典型的数据查找.那么如何实现对链表的数据元素的查找呢? 比如,我想知道链表的第5个元素的值是多少,我应该怎么做呢?由于,链表是依靠地址来查找数据的,那比如说链表的第一个结点的数据域中保存