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