STL版本的循环链表

原创 2013年12月03日 15:10:44
/*
  循环链表
  实现功能,创建循环链表,插入指定数据
  到指定位置,删除,查找数据位置,插入
  到指定位置
*/
#include<iostream>
using namespace std;

template<class T>
struct Node
{
   T data;
   struct Node<T> *next;/*指针域,在这里<T>可省略*/
};

template <class T>
class ClinkList
{
 public:
  ClinkList()
  {
   head=new Node <T>;
   head->next=head;
  }        /*无参构造函数*/
  ClinkList(T a[], int n);  /*有参构造函数,使用含有n个元素的数组a初始化单链表(头插法和尾插法)*/
  ~ClinkList();      /*析构函数*/
  int GetLength();    /*获取线性表的长度*/
  Node<T> * Get(int i);   /*获取线性表第i个位置上的元素*/
  int Locate(T x);    /*查找线性表中值为x的元素,找到后返回其位置*/
  void Insert(int i, T x);        /*在线性表的第i个位置上插入值为x的新元素*/
  int Delete(int i);    /*删除线性表第i个元素,并将该元素返回*/
  void PrintList();    /*按次序遍历线性表中的各个数据元素*/
 private:
  Node <T> *head;     /*尾指针*/
};


template<class T>
ClinkList<T>::ClinkList(T a[],int n)     //头插法建立循环列表
{
 head = new Node<T>;
    head->next = head;
 head->data = n;
 for(int i=0;i<=n-1;i++)
 {
  Node<T> *s=new Node<T>;   //修改新节点的指针域
  s->data=a[i];     //修改头结点的指针域,将新节点加入到链表中
  s->next=head->next;
  head->next=s;
 }
}

 

template <class T>
int ClinkList<T>::GetLength()
{
 int i=0;
 Node<T>*p=head;
 while(p->next!=head)
 {
  i++;
  p=p->next;
 }
 return i;
}

template <class T>
Node<T>* ClinkList<T>::Get(int i)
{
 if(i>head->data) cout<<"超出范围";
 Node<T> *p= head;
 int k = 0;
 while(k!=i)
 {
  k++;
  p=p->next;
 }
 return p;
}
/*查找x这个数据在循环链表中的位置*/
template <class T>
int ClinkList<T>:: Locate(T x)
{   int i = 0;
 Node<T> *p = head;
 while(p->data!=x)
 {
        p=p->next;
        i++;
    }
 if(i>head->data)
  throw"该链表中无此数";
 else
        return i;
}

/*插入到第i个数据后面*/
template<class T>
void ClinkList<T>:: Insert(int i, T x)
{
 if(i>head->data) throw"插入位置错误";
 Node<T> *p = head;
 int k = 0;
 while(k!=i)
 {
  k++;
  p=p->next;
 }
    Node<T> *s=new Node<T>;
    s->data=x;
    s->next=p->next;
    p->next=s;
    head->data++;
}

template<class T>
int ClinkList<T>:: Delete(int i)
{
 if(i>head->data) throw"删除位置错误";
 Node<T> *p=head->next;
 Node<T> *q=head;
 int k = 1;
 while(k!=i)
 {   k++;
        q = p;
  p = p->next;
 }
 int x = p->data;
 q->next = p->next;
 delete p;
 p = NULL;
 head->data--;
 return x;
}

template <class T>
void ClinkList<T>:: PrintList()
{
 Node<T> *p=head->next;
 //int i=GetLength();
 int i = head->data;
 cout<<"length = "<<i<<endl;
 while(p!=head)
 {
  cout<<p->data<<"   ";
  p = p->next;
    }
    cout<<endl;
}

template <class T>
ClinkList<T>::~ClinkList()
{
    while(head->next!=head)
    {
       Node<T> *p = head->next;
       head->next = p->next;
       delete p;
       p = NULL;
    }
    delete head;
    head = NULL;
}

int main()
{
 int b[]={0,1,2,3,4,5,6,7,8,9};
 ClinkList<int>  circleLinkList(b,10);
 circleLinkList.PrintList();

    circleLinkList.Delete(5);
    cout<<endl<<"after circleLinkList.Delete(5)"<<endl;
 circleLinkList.PrintList();

 Node<int> *result = circleLinkList.Get(5);
 cout<<endl<<"circleLinkList.Get(5) is "<<result->data<<endl;

 circleLinkList.Insert(4,5);
 circleLinkList.PrintList();

 cout<<endl<<"circleLinkList.Locate(7) is at  "<<circleLinkList.Locate(7)<<endl;

 return 0;
}

 

 

 

《如何用STL中的list实现循环链表》

#include "stdafx.h" #include #include using namespace std; template class List : private list...
  • lsx_123_
  • lsx_123_
  • 2014年12月08日 00:25
  • 1276

STL之双向循环链表(List)的内部关系

/* *简单的list双向链表结构关系 * *李坤昱 *326087275@qq.com * * *从简单到复杂的学习之路 */ #include template class listnode//...
  • a29562268
  • a29562268
  • 2016年12月29日 22:12
  • 570

基于环形缓冲区的deque实现方法

众所周知,C++ STL中有一个叫做deque的容器,实现的是双端队列数据结构,这种队列允许同时从队列的首部和尾部插入和删除数据。 然而在STL中这种数据结构是用”分段连续”的物理结构实现的(可以参...
  • vipally
  • vipally
  • 2016年10月20日 00:50
  • 562

双向循环链表的C++实现

双向循环链表的C++实现
  • mourinho_my_idol
  • mourinho_my_idol
  • 2013年10月21日 18:36
  • 1274

C++的标准模板库STL中实现的数据结构之链表std::list的分析与使用

摘要 本文主要借助对C++的标准模板库STL中实现的数据结构的学习和使用来加深对数据结构的理解,即联系数据结构的理论分析和具体的应用实现(STL),本文是系列总结的第二篇,主要针对线性表中的链表 S...
  • LG1259156776
  • LG1259156776
  • 2015年07月23日 15:36
  • 5765

STL list链表的用法详细解析

原文地址:http://www.jb51.net/article/41525.htm 本文以List容器为例子,介绍了STL的基本内容,从容器到迭代器,再到普通函数,而且例子丰富,通俗易懂。不失为S...
  • Double2hao
  • Double2hao
  • 2016年03月01日 08:05
  • 2959

循环链表C++实现

#include using namespace std; typedef int ElemType; struct NodeType { ElemType data; NodeType...
  • xiaogua1211
  • xiaogua1211
  • 2016年03月19日 15:47
  • 1141

循环链表的实现与操作(C语言实现)

循环链表是另一种形式的链式存贮结构。它的特点是表中最后一个结点的指针域指向头结点,整个链表形成一个环。 循环链表的操作 1,循环链表的新操作 2, 获取当前游标指向的数据元素 3, 将游标重置...
  • u010590318
  • u010590318
  • 2014年06月05日 14:55
  • 2277

STL 之 list 双向链表

list 介绍 list 是双向链表的一个泛化容器,它的数据元素可通过链表指针串接成逻辑意义上的线性表。不同于采用线性表顺序存储结构的vector 和 deque 容器,list 双向链表中任一位置的...
  • xunmengpiaoyun
  • xunmengpiaoyun
  • 2013年12月23日 15:33
  • 1505

(三)循环链表以及循环链表应用

单向循环链表 单向循环链表是单链表的另一种形式,其结构特点是链表中最后一个结点的指针不再是结束标记,而是指向整个链表的第一个结点,从而使单链表形成一个环。和单链表相比,循环单链表的长处是从链尾到链头比...
  • FullyFang
  • FullyFang
  • 2013年10月04日 23:05
  • 1472
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:STL版本的循环链表
举报原因:
原因补充:

(最多只允许输入30个字)