zoukankan      html  css  js  c++  java
  • 【线性表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();
    
    
    } 
     
  • 相关阅读:
    BadgeView使用
    设计模式(一)单例模式的七种写法
    Android 之使用LocalBroadcastManager解决BroadcastReceiver安全问题
    AsyncTask源码分析
    Android微信支付—注意事项
    Android微信支付SDK开发
    Android支付宝SDK开发笔记
    onInterceptTouchEvent与onTouchEvent默认返回值
    线程间的通信方式3--Handler
    Android应用程序启动过程(二)分析
  • 原文地址:https://www.cnblogs.com/lulipro/p/7420936.html
Copyright © 2011-2022 走看看