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的一些数据,每组数据大小不一样,所以每个结点的大小会不同。

posted @ 2015-06-27 09:29  meadow@dlut  阅读(330)  评论(0编辑  收藏  举报