• C++链表


        之前用C写链表的时候,结点使用结构体封装的,操作起来总是感觉很麻烦。C++中使用类来封装结点,感觉操作起来方便多了,内存回收也感觉很清楚。

        最近,做Gps数据分析时,别人要求加一个树形控件。

        Gps数据是存储在Excel中的,不知道什么原因,采用OLE方式操作数据较多的Excel时,数据读取变得很缓慢,如果加一个树形控件,总不能点一下就从新读取Excel表格一次吧。所以这里用链表暂时解决了这个问题,一个Excel表格的数据看做链表的一个节点,树形控件显示Excel的标题,当点击树形控件下已经被读取过得Excel时,程序不再重新读取Excel的数据,只需要去链表中查询对应的结点就好了。

    下面是实现链表的两个类(比较简单的一个封装):

    GpsNode 和GpsList的定义:

    class GpsNode//存储一组GPS数据的节点
    {
    public:
        GpsNode();
        GpsNode(int TotalNum);
        GpsNode(int TotalNum, int label = 0);//label=0作为头结点
        ~GpsNode();
    
        void SetSpace(int TotalNum);
        GpsNode *next;
    public:
        double Q;//计算DQ的均值
        double *F;//F值
        double *DQn;
        double *X;
        double*Y;
        double*Z;
        int  TotalNum;//数据量
        double MaxValue;//数据中最大的值,用于画图
        int Label;//在链表中的位置
    };
    
    class GpsList   //Gps数据链表
    {
    public:
        GpsList();
        ~GpsList();
        GpsNode *Head;
        GpsNode *p;
        void AddTail(int TotalNum, GpsNode *N);
    
        GpsNode * ReadNode(int Label);
        void DeleteNode(int Label);
        void ClearNode();
    };

    两个类的实现:

    GpsNode::GpsNode()
    {
        F = NULL;
        DQn = NULL;
        X = NULL;
        Y = NULL;
        Z = NULL;
    }
    GpsNode::GpsNode(int TotalNum)
    {
        F = new double[TotalNum];
        DQn = new double[TotalNum];
        X = new double[TotalNum];
        Y = new double[TotalNum];
        Z = new double[TotalNum];
    }
    
    GpsNode::GpsNode(int TotalNum, int label)
    {
        if (label == 0)
        {
            F = NULL;
            DQn = NULL;
            X = NULL;
            Y = NULL;
            Z = NULL;
        }
    }
    
    GpsNode::~GpsNode()
    {
        if (F != NULL)
        {
            delete[] F;
            delete[] DQn;
            delete[] X;
            delete[] Y;
            delete[] Z;
        }
    }
    void GpsNode::SetSpace(int TotalNum)
    {
        F = new double[TotalNum];
        DQn = new double[TotalNum];
        X = new double[TotalNum];
        Y = new double[TotalNum];
        Z = new double[TotalNum];
    }
    GpsList::GpsList()
    {
        GpsNode *N;
        N = new GpsNode;
        Head = N;
        p = Head;
    }
    GpsList::~GpsList()
    {
        ClearNode();
    }
    void GpsList::AddTail(int TotalNum, GpsNode *N)
    {
        p->next = N;
        N->next = NULL;
        p = N;
    }
    GpsNode * GpsList::ReadNode(int Label)
    {
        GpsNode *Flag = NULL;
        GpsNode *Result = NULL;
        Flag = Head->next;
        while (Flag != NULL)
        {
            if (Flag->Label == Label)
            {
                Result = Flag;
            }
            Flag = Flag->next;
        }
        return Result;
    }
    void GpsList::DeleteNode(int Label)
    {
        GpsNode *Flag = NULL;
        GpsNode *Next = NULL;
        while (Flag != NULL)
        {
    
            if (Flag->next->Label == Label)
            {
                GpsNode *Next = NULL;
                Next = Flag->next;
                Flag->next = Next->next;
                delete Next;
            }
            Flag = Flag->next;
        }
    }
    
    void GpsList::ClearNode()
    {
        GpsNode *Flag = NULL;
        GpsNode *Next = NULL;
        Flag = Head->next;
        while (Flag != NULL)
        {
            Next = Flag->next;
            delete Flag;
            Flag = Next;
        }
    }


    Node中封装的X,Y,Z,Q...Gps的一些数据,每组数据大小不一样,所以每个结点的大小会不同。

  • 相关阅读:
    友盟页面统计
    为什么调用 FragmentPagerAdapter.notifyDataSetChanged() 并不能更新其 Fragment?
    让jQuery的ajaxFileUpload插件支持onchange事件
    sublime双击选择全选带中划线
    配置Chrome Workspace功能
    font-face 跨域解决
    Yahoo团队经验:网站性能优化的34条黄金法则
    require.js+knockout.js+.underscore模板引擎的使用
    使用livereload实现自动刷新
    WebStorm 7.0 支持更多的Web技术
  • 原文地址:https://www.cnblogs.com/meadow-glog/p/4603627.html
Copyright © 2020-2023  润新知