题目:
双链表的插入和删除操作,要求:
1、每次插入和删除操作之后,链表里的元素都必须是有序的(假设元素类型为int);
2、必须是用C++ 是实现两个类 CNode和CLink,CLink里封装了函数 add() 和 delete();
3、时间限制,最多20分钟。
#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;
class CNode
{
public:
int data;
CNode* next;
CNode* prev;
CNode()
{
next=NULL;
prev=NULL;
data=0;
}
};
class CLink
{
public:
CLink()
{
pHead=NULL;
pEnd=NULL;
}
CNode* add(int data);
void del(int data);
void print();
CNode* pHead;
//用 pEnd
CNode* add2(int data);
void del2(int data);
CNode* pEnd;
};
/***************************************************
*
*交换指针
*
***************************************************/
CNode* CLink::add(int data)
{
CNode* node= new CNode;
node->data=data;
if(pHead==NULL)
{
pHead=node;
return node;
}
CNode* p1,*p2;
p1=pHead;
while(p1!=NULL)
{
if(p1->data>data)
{
node->next=p1;
node->prev=p1->prev;
if(p1->prev!=NULL)
{
p1->prev->next=node;
p1->prev=node;
}
else
{
pHead->prev=node;
pHead=node;
}
return node;
}
p2=p1;
p1=p1->next;
}
if(p1==NULL)
{
node->prev=p2;
p2->next=node;
return node;
}
}
void CLink::del(int data)
{
CNode* p1=pHead;
if(pHead->data==data)
{
p1=pHead->next;
delete pHead;
pHead=p1;
return ;
}
while(p1!=NULL)
{
if(p1->data==data)
{
p1->prev->next=p1->next;
if(p1->next !=NULL)
p1->next->prev=p1->prev;
delete p1;
return;
}
p1=p1->next;
}
}
void CLink::print()
{
cout<<"\n";
CNode*p=pHead;
while(p)
{
cout<<p->data<<"\t";
p=p->next;
}
cout<<"\n";
}
/***************************************************
*
*交换数据
*
***************************************************/
CNode* CLink::add2(int data)
{
CNode * node=new CNode;
node->data=data;
if(pHead==NULL)
{
pHead=node;
pEnd=node;
return node;
}
pEnd->next=node;
node->prev=pEnd;
pEnd=node;
CNode* tmp=pEnd;
while(tmp !=pHead && tmp->prev->data>data)
{
tmp->data=tmp->prev->data;
tmp=tmp->prev;
}
tmp->data=data;
}
void CLink::del2(int data)
{
CNode*p;
for(p=pHead;p!=NULL && p->data !=data; p=p->next);
if(p==NULL)
return;
else if(p==pHead)
{
pHead=pHead->next;
delete p;
return ;
}
while(p!=pEnd)
{
p->data=p->next->data;
p=p->next;
}
pEnd=p->prev;
pEnd->next=NULL;
delete p;
}
int main(int argc,char** argv)
{
{
cout<<"\n方法一\n";
CLink c1;
for(int i=10;i>0;i--) c1.add(i);
c1.print();
c1.del(1);
c1.print();
c1.del(5);
c1.print();
c1.del(10);
c1.print();
c1.del(20);
c1.print();
}
{
cout<<"\n方法二\n";
CLink c2;
srand(clock());
for(int i=10;i>0;i--) c2.add2(i);
c2.print();
c2.del2(1);
c2.print();
c2.del2(5);
c2.print();
c2.del2(10);
c2.print();
c2.del(20);
c2.print();
}
system("pause");
return 0;
}