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

c++实现链表

时间:2016-03-18 18:01:08      阅读:273      评论:0      收藏:0      [点我收藏+]

标签:用c++实现链表


之前在学c的时候以c的版本谢了有关链表的最基础的几个函数,最近在学习C++,所以,,,哈哈就用另一种版本再次呈现给大家;

感觉c++好像写起来比较简单一些。因为它有结构体,所以没有那么繁琐;


cpp.h

#pragma once

#include<iostream>

using namespace std;

typedef int DataType;

 struct Node

{

DataType _data;

struct Node * _next;

Node(const DataType &d)

:_data(d)

,_next(NULL)

{

}


};


 class Slist

 {

friend ostream & operator<<(ostream &os,Slist &s);

 public:

//构造链表

Slist()

:_head(NULL)

,_tail(NULL)

{

 

}

~Slist()

{

if(_head==NULL)

{

return ;

}

Node *cur=_head;

while(cur!=NULL)

{

Node *del=cur;

cur=cur->_next;

delete del;

}

delete cur;

_head=NULL;

_tail=NULL;

}

Slist(const Slist &s)

:_head(NULL)

,_tail(NULL)

{

Node *cur=_head;

while(cur)

{

pushback(cur->_data);

cur=cur->_next;

}

 

}

 public:

void pushback(const DataType &d);

void popback();

void pushfront(const DataType &d);

void popfront();

//寻找链表中某个节点

Node *Find(const DataType &d);

void Insert(Node* pos,const DataType &d);

void Reverse();

void sort();

//合并两个有序单链表。。有一点问题

Node* Merge(Slist slist1,Slist slist2);

void Remove(const DataType &d);

void RemoveAll(const DataType &d);

//删除链表中倒数第k个节点

void Delk(int k);

//在指定节点后边插入一个节点

void InsertFrontNode(Node* pos,const DataType &d);

//寻找链表的中间节点

Node* FindMidNode();

//求链表的长度

int GetlistLength();

//销毁链表

void Destory();

//判断链表是否带环

Node* Checkcycle();

//获取环的入口节点

Node* GetcycleEntryNode(Node* meetnode);

 private:

Node *_head;

Node *_tail;

 };

test.c

#include"Slist.h"

#include<assert.h>

//1<<输出运算符的重载

ostream& operator<<(ostream &os,Slist &s)

 {

if(s._head==NULL)

{

return os;

}

Node *cur=s._head;

while(cur!=NULL)

{

os<<cur->_data<<"->";

cur=cur->_next;

}

os<<"over"<<endl;

return os;

 }

//2头插法建立单链表

 void Slist::pushback(const DataType &d)

 {

 Node * newNode=new Node(d);

if(_head==NULL)

{

_head=newNode;

_tail=_head;

}

else

{

_tail->_next=newNode;

_tail=newNode;

}

 }

 //3尾删除法单链表

void  Slist::popback()

{

Node *cur=_head;

//没有节点

if(_head=NULL)

{

return;

}

//有一个节点

if(_head==_tail)

{

delete _head;

_head=NULL;

_tail=NULL;

return;

}

//有好多个节点

while(cur->_next!=_tail)

{

cur=cur->_next;

}

delete _tail;

_tail=cur;

_tail->_next=NULL;

}

//3头插法建立单链表

void  Slist::pushfront(const DataType &d)

{

     Node* newNode=new Node(d);

if(_head==NULL)

{

_head=newNode;

_tail=_head;

}

else

{

newNode->_next=_head;

_head=newNode;

}

}

//4头删

void  Slist::popfront()

{

//如果链表为空则直接返回

if(_head==NULL)

{

  return;

}

//否则挨个删除

Node *del=_head;

_head=_head->_next;

delete del;

}

//5在单链表中查找某个数据的节点

Node*  Slist::Find(const DataType &d)

{

Node *cur=_head;

if(_head==NULL||_head->_next==NULL)

{

return _head;

}

while(cur)

{

if(cur->_data==d)

{

   return cur;

}

   cur=cur->_next;

}

    return NULL;

}

// 6在当前节点后边插入某个数据

void  Slist::Insert(Node* pos,const DataType &d)

{

Node* newNode=new Node(d);

if(pos==_tail)

{

_tail->_next=newNode;

_tail=newNode;

}

else

{

newNode->_next=pos->_next;

 pos->_next=newNode;

}

}

//7翻转单链表

void Slist::Reverse()

{

Node *th=NULL;

Node *q =NULL;

Node *p=_head;

if(_head==NULL||_head->_next==NULL)

{

   return;

}

while(p)

{

   q=p;

p=p->_next;

q->_next=th;

th=q;

}

_head=th;

}

//8对单链表进行排序

 void Slist:: sort()

{

Node* end=NULL;

Node* cur=_head;

     if(cur==NULL||cur->_next==NULL)

{

   return;

}

while(cur->_next!=end)

{

while(cur!=NULL&&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;

}

}

//9合并两个有序单链表

Node* Merge(Node* _head1,Node* _head2)

{

  Node *newHead=NULL;

 if(_head1==_head2)

 {

 return _head1;

 }

 if(_head1==NULL&&_head2!=NULL)

 {

   return _head2;

 }

if(_head1!=NULL&&_head2==NULL)

{

   return _head1;

}

if(_head1->_data<_head2->_data)

{

 newHead=_head1;

_head1=_head1->_next;

}

else

{

newHead=_head2;

_head2=_head2->_next;

}

Node* cur=newHead;

while(_head1&&_head2)

{

if(_head1->_data<_head2->_data)

{

  cur->_next=_head1;

 _head1=_head1->_next;

}

else

{

cur->_next=_head2;

_head2=_head2->_next;

}

cur=cur->_next;

}

if(_head1)

{

cur->_next=_head1;

}

else

{

cur->_next=_head2;

}

return newHead;

}

//10删除链表中的某个值为d的节点

void  Slist::Remove(const DataType &d)

{

Node *cur=_head;

Node * del=NULL;

Node *prve=NULL;

if(cur==NULL)

{//若链表为空则直接返回

 return;

}

//若cur不为空 则一直往下走

while(cur)

{

 

if(cur->_data==d)

{

del=cur;

//若要找的为第一个节点

if(cur=_head)

{

_head=_head->_next;

}

else

{

prve->_next=cur->_next;

delete del;

break;

}

}

prve=cur;

cur=cur->_next;

}

}

//11删除链表中的所有值为d的节点

void  Slist::RemoveAll(const DataType &d)

{

 Node *cur=_head;

Node * del=NULL;

Node *prve=NULL;

if(cur==NULL)

{//若链表为空则直接返回

 return;

}

//若cur不为空 则一直往下走

while(cur)

{

if(cur->_data==d)

{

del=cur;

//若要找的为第一个节点

if(cur=_head)

{

_head=_head->_next;

cur=_head;

}

else

{

prve->_next=cur->_next;

cur=prve->_next;

delete del;

}

}

else

{

prve=cur;

cur=cur->_next;

}

}

}


//12删除链表中倒数第k个节点

void Slist::Delk(int k)

{

assert(k>1);

Node* p1=_head;

Node* p2=_head;

while(--k)

{

p1=_head->_next;

}

while(p1->_next)

{

p1=p1->_next;

p2=p2->_next;

}

Node* del=p2->_next;

p2->_data=p2->_next->_data;

p2->_next=p2->_next->_next;

delete del;

}

//13在当前链表前插入一个数据

void Slist::InsertFrontNode(Node* pos,const DataType &d)

{

Node * newNode=new Node(d);

newNode->_next=pos->_next;

pos->_next=newNode;

DataType tmp=pos->_data;

pos->_data=pos->_next->_data;

pos->_next->_data=tmp;

}


//14寻找链表的中间节点

Node* Slist:: FindMidNode()

{

  Node *fast=_head;

  Node *slow=_head;

  if(fast==NULL)

  {

     return NULL;

  }

  if(fast!=NULL&&fast->_next!=NULL)

  {

  fast=fast->_next->_next;

  slow=slow->_next;

  }

    return slow;

}

//15求链表的长度

int  Slist:: GetlistLength()

{

int count=0;

Node *cur=_head;

while(cur)

{

count++;

cur=cur->_next;

}

   return count;

}

void Slist::Destory()

{

 Node* cur=_head;

 Node* del=NULL;

 if(_head=NULL)

 {

   return;

 }

 else

 {

 while(cur)

 {

del=cur;

cur=cur->_next;

delete del;

del=NULL;

 }

 }

}

Node* Slist::Checkcycle()

{

  Node* fast=_head;

  Node*slow=_head;

  while(fast&&fast->_next)

  {

  fast=fast->_next->_next;

  slow=slow->_next;

if(fast==slow)

  {

return slow;

  }

  }

  return NULL;

}


Node* Slist::GetcycleEntryNode(Node* meetnode)

{

 Node* entry=_head;

 Node* meet=meetnode;

 while(entry!=meet)

 {

 entry=entry->_next;

 meet=meet->_next;

 

 }

 return entry;

}

void test1()

{

Slist slist1;

slist1.pushback(1);

slist1.pushback(2);

slist1.pushback(3);

slist1.pushback(4);

slist1.Destory();

cout<<slist1<<endl;

}

    void test2()

{

Slist slist1;

slist1.pushfront(1);

slist1.pushfront(2);

slist1.pushfront(4);

slist1.pushfront(4);

slist1.RemoveAll(4);

cout<<slist1<<endl;

}

void test3()

{

Slist slist1;

slist1.pushfront(3);

slist1.pushfront(2);

slist1.pushfront(1);

slist1.Reverse();

cout<<slist1<<endl;

}

void test4()

{

Slist slist1;

slist1.pushfront(1);

slist1.pushfront(3);

slist1.pushfront(5);

slist1.pushfront(7);

slist1.Delk(2);

cout<<slist1;

}

void test5()

{

Slist slist1;

slist1.pushfront(1);

slist1.pushfront(3);

slist1.pushfront(4);

slist1.pushfront(5);

Node* cur=slist1.Find(1);

slist1.InsertFrontNode(cur,2);

cout<<slist1;

}


void test6()

{

Slist slist1;

slist1.pushfront(1);

slist1.pushfront(2);

slist1.pushfront(3);

slist1.pushfront(4);

slist1.sort();

cout<<slist1;

}

void test8()

{

Slist slist1;

slist1.pushfront(1);

slist1.pushfront(2);

slist1.pushfront(3);

slist1.pushfront(4);

slist1.pushfront(5);

int count=slist1.GetlistLength();

cout<<count;

}

void test9()

{

int i=0;

Slist slist1;

for(i=1;i<8;i++)

{

slist1.pushfront(i);

}

Node* end=slist1.Find(8);

Node* cur=slist1.Find(2);

end->_next=cur;

cur=slist1.Checkcycle();

if(cur!=NULL)

cout<<cur;

}

int main()

{

test9();

system("pause");

return 0;


}


 


本文出自 “1” 博客,请务必保留此出处http://10808695.blog.51cto.com/10798695/1752647

c++实现链表

标签:用c++实现链表

原文地址:http://10808695.blog.51cto.com/10798695/1752647

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