【线性表5】线性表的链式实现:循环单链表

简介

循环单链表 是在在单链表的基础上,用最后的一个结点的指针域指向头结点形成的。因此它在逻辑上是一个环形结构。
 
要点:1、遍历结束的标志是 p == 【头结点地址】,而不是p==NULL
          2、表为空的判断标志是:   if( head->next == head   )
          3、在单循环链表中,从任一结点出发都可访问到表中所有结点
 
 
 

 

 
循环链表一般还使用尾指针rear保存最后一个结点的地址,因为使用尾指针既可以快速找到 最后一个结点,也可以快速找到头结点。
 

 

简单的代码实现

 

#include<iostream>
#include<cstdlib>
#include<stdexcept>

using namespace std;

struct ListNode
{
    int element;
    ListNode* next;
    
    ListNode(int e=0,ListNode* nxt=0):element(e),next(nxt)
    {
    }
    
};

class CircleList
{
private:
    
    
    ListNode headNode;    //头结点 
    ListNode* p_rear;     //尾结点指针 
    int size;             //表长度 

public:
    CircleList():headNode(0,0),p_rear(0),size(0)
    {
        p_rear = &headNode;        //尾结点指针初始化时也保存头结点的地址 
        headNode.next = &headNode; //形成环 
    }
    
    ~CircleList()
    {
        ListNode * p = headNode.next;
        
        ListNode *t ;
        while( p!= &headNode  )
        {
            t = p;
            p = p->next;
            delete t;    
        }
    }
    
    
    void append(int e)
    {
        ListNode *new_node = new ListNode(e,&headNode);   //新结点创建 ,新结点的next指向头结点。 
        
        p_rear->next = new_node;
        p_rear = new_node;
        size++;
        
    } 
    
    
    void show()const
    {
        ListNode *p = headNode.next;
        cout<<'[';
        while(p!=&headNode)
        {
            if(p!=headNode.next) 
                cout<<',';
            cout<<p->element;
            p = p->next;
        }
        cout<<']';
    } 
};



int main()
{
    
    CircleList clist;
    
    clist.append(12);
    clist.append(13);
    clist.append(14);
    clist.append(15);
    clist.append(16);
    clist.show();


} 

 

 

 
posted @ 2017-08-24 00:07  lulipro  阅读(614)  评论(0编辑  收藏  举报