#include
using namespace std;
class Node //结点类
{ public:
Node( );
Node(int ); //构造函数
void SetNext(Node *p); //设置后继结点
int Getd();
void Setdata(int); //得到当前结点的数据值
Node *GetNext( ); //得到后继结点的地址
~Node( ); //析构函数
private:
int data;
Node *next;
};
Node::Node( )
{ }
Node::Node(int d):data(d)
{
}
void Node::SetNext(Node p)
{ next=p;}
int Node::Getd( )
{ return data;}
Node Node::GetNext( )
{ return next;}
void Node::Setdata(int n)
{
data=n;
}
Node::~Node( )
{ cout<<data<<" 被析构!"<<endl;}
class Link
{
public:
Link();
Link(int n);
void LinkPrint();
void LinkSort();
void LinkInsert(int);
void LinkDel(int);
//void con(Link*);
void operator+(Link&);
~Link();
private:
Node *Head;
int num;
};
Link::Link():num(0),Head(NULL)
{
}
Link::Link(int n):num(n)
{
Node *h=NULL,*p,*q;
int d;
int i;
if(n>0)
{
cin>>d;
h=q=p=new Node(d);
for(i=2;i<=num;i++)
{
cin>>d;
p=new Node(d);
q->SetNext(p);
q=p;
}
q->SetNext(NULL);
}
Head=h;
}
void Link::LinkPrint()
{
Node *p;
p=Head;
while(p)
{
cout<Getd()<<" ";
p=p->GetNext();
}
cout<<endl;
}
void Link::LinkSort()
{
Node *h1,*h2;
Node *p,*q,*t;
h2=h1=Head;
h2=h2->GetNext();
h1->SetNext(NULL);
for(;h2;)
{
t=h2;
for(p=h1,q=p;(q)&&(t->Getd()>q->Getd());p=q,q=q->GetNext());
h2=h2->GetNext();
if(q==h1)
{
t->SetNext(q);
h1=t;
}
else
{
p->SetNext(t);
t->SetNext(q);
}
}
Head=h1;
}
void Link::LinkInsert(int d)
{
Node *p,*q,*s;
p=q=Head;
while(q&&(d>q->Getd()))
{
p=q;
q=q->GetNext();
}
s=new Node(d);
if(q==Head)
{
s->SetNext(q);
Head=s;
}
else
{
s->SetNext(q);
p->SetNext(s);
}
}
void Link::LinkDel(int d)
{
Node *p,*q;
p=q=Head;
while(q&&(d!=q->Getd()))
{
p=q;
q=q->GetNext();
}
if(q==NULL)
{
cout<<"不存在此数据!"<<endl;
return ;
}
if(q==Head)
{
Head=Head->GetNext();
delete q;
}
else
{
p->SetNext(q->GetNext());
delete q;
}
}
void Link::operator+(Link&l)
{
Node *p;
p=Head;
while(p->GetNext())
{
p=p->GetNext();
}
p->SetNext(l.Head);
l.Head=NULL;
}
Link::~Link()
{
Node *p,*q;
p=Head;
while(p)
{
q=p->GetNext();
delete p;
p=q;
}
}
main()
{
//Link l1(5);
Link *p,q;
p=new Link(5);
/
p->LinkPrint();
p->LinkSort();
p->LinkPrint();
p->LinkInsert(15);
p->LinkPrint();
p->LinkDel(15);
p->LinkPrint();
*/
q=new Link(3);
//p->con(*q);
*p+*q;
p->LinkPrint();
delete p;
delete q;
}
很明显,这是插入排序。
void Link::LinkSort()
{
Node* h1, * h2;
Node* p, * q, * t;
h2 = h1 = Head;
h2 = h2->GetNext();
h1->SetNext(NULL);
//h1的初始值是第一个节点;h2的初始值是第二个节点
//可以把h1看做一个已排序链表,h2看做一个未排序的链表
//对h2进行遍历
for (; h2;)
{
t = h2;
//这个for循环是关键
//p的初始值是已排序链表,q的初始值是p
//t的初始值是未排序链表的首节点
//for循环结束条件单,t的值大于q的值,或者q为空(遍历完已排序链表)
//for循环的迭代:q往后移一个节点
//for循环之后,要么t的值大于q的值,要么t的值大于所有已排序链表的值(q为空)
for (p = h1, q = p; (q) && (t->Getd() > q->Getd()); p = q, q = q->GetNext());
h2 = h2->GetNext();
if (q == h1)
{
t->SetNext(q);
h1 = t;
}
else
{
p->SetNext(t);
t->SetNext(q);
}
}
Head = h1;
}