您的位置:首页 > 编程语言 > C语言/C++

C++实现单链表

2016-06-03 13:15 423 查看
C++和C语言最大的不同就是类和模板。利用C++实现单链表当然少不了类。首先利用结构体定义好结点。

如上所示,将函数在类内声明,实现写在类外,和C语言的写法大致相同,不在详述。void sList::PushBack(const DataType& d)
{
Node* newNode=new Node(d);
if(_head==NULL)
{
_head=newNode;
_tail=_head;
}
else
{
_tail->_next=newNode;
_tail=newNode;
}
}

void sList::PushFront(const DataType& d)
{
Node* newNode=new Node(d);
if(_head==NULL)
{
_head=newNode;
_tail=_head;
}
else
{
newNode->_next=_head;
_head=newNode;
}

}

void sList::PopBack()
{
if(_head==NULL)
{
return;
}
else if(_head==_tail)
{
delete _head;
_head=NULL;
_tail=NULL;
return;
}
else
{
Node* cur=_head;
while(cur->_next!=_tail)
{
cur=cur->_next;
}
delete _tail;
_tail=cur;
cur->_next=NULL;
}
}

void sList::PopFront()
{
if(_head==NULL)
{
return;
}
else
{
Node* del=_head;
_head=_head->_next;
delete del;
del=NULL;
}
}

Node* sList::Find(const DataType& d)
{
Node* cur=_head;
while(cur!=NULL)
{
if(cur->_data==d)
{
return cur;
}
cur=cur->_next;
}
return NULL;
}

void sList::Insert(Node* pos,const DataType& d)
{
if(pos==NULL)
{
return;
}
Node* newNode=new Node(d);
if(pos==_tail)
{
_tail->_next=newNode;
_tail=newNode;
}
else
{
newNode->_next=pos->_next;
pos->_next=newNode;
}
}

void sList::Reverse()
{
if((_head==NULL) || (_head==_tail))
{
return;
}
Node* cur=_head;//therr point
Node* prev=NULL;
Node* newHead=NULL;
while(cur)
{
prev=cur;
cur=cur->_next;
prev->_next=newHead;
newHead=prev;
_head=newHead;
}
}

void sList::Sort()
{
Node* cur=_head;
Node* end=NULL;
while(cur!=end)
{
while(cur && cur->_next!=end)
{
if(cur->_data  <  cur->_next->_data)
{
DataType tmp=cur->_data;
cur->_data=cur->_next->_data;
cur->_next->_data=tmp;
}
cur=cur->_next;
}
end=cur;
cur=_head;
}
}

void sList::Remove(const DataType& d)
{
Node* cur=_head;
Node* del=NULL;
Node* prev=NULL;
while(cur!=NULL)
{
if(cur->_data==d)
{
del=cur;
if(cur==_head)
{
_head=_head->_next;
}
else
{
prev->_next=cur->_next;
}
delete del;
break;
}
prev=cur;
cur=cur->_next;
}
}
void sList::RemoveAll(const DataType& d)
{
Node* cur=_head;
Node* del=NULL;
Node* prev=NULL;
while(cur!=NULL)
{
if(cur->_data==d)
{
del=cur;
if(cur==_head)
{
_head=_head->_next;
_head=cur;
}
else
{
prev->_next=cur->_next;
cur=prev->_next;
}
delete del;
}
else
{
prev=cur;
    cur=cur->_next;
}
}
}

void sList::Erase(Node* pos)
{
if(pos==NULL)
{
return;
}
Node* del=NULL;
Node* cur=_head;
Node* prev=NULL;
while(cur!=NULL)
{
if(pos==cur)
{
del=cur;
{
if(pos==_head)
{
_head=_head->_next;
}
else
{
prev->_next=cur->_next;
}
delete del;
break;
}
}
prev=cur;
cur=cur->_next;
}

}

Node* sList::FindMidNode()
{
Node* Slow=_head;
Node* Fast=_head;
if(Fast==NULL || Fast->_next==NULL)
{
return NULL;
}
else
{
while(Fast && Fast->_next)
{
Slow=Slow->_next;
Fast=Fast->_next->_next;
}
return Slow;
}
}

Node* sList::CheckCircle()
{
Node* Slow=_head;
Node* Fast=_head;
while(Fast && Fast->_next)
{
Slow=Slow->_next;
Fast=Fast->_next->_next;
if(Fast==Slow)
{
return Slow;
}
}
return NULL;
}

int GetCircleLength(Node* meet)
{
Node* Start=meet;
int count=0;
do
{
count++;
Start=Start->_next;
}
while(Start!=meet);
return count;
}

Node* sList::GetCircleEntryNode(Node* meet)
{
Node* entry=_head;
while(entry!=meet)
{
entry=entry->_next;
meet=meet->_next;
}
return entry;
}


本文出自 “七月朔风” 博客,请务必保留此出处http://luminous.blog.51cto.com/10797288/1752180
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: