之前用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 = );//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 == )
{
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的一些数据,每组数据大小不一样,所以每个结点的大小会不同。
C++链表的更多相关文章
-
Redis链表实现
链表在 Redis 中的应用非常广泛, 比如列表键的底层实现之一就是链表: 当一个列表键包含了数量比较多的元素, 又或者列表中包含的元素都是比较长的字符串时, Redis 就会使用链表作为列表键的底层 ...
-
[数据结构]——链表(list)、队列(queue)和栈(stack)
在前面几篇博文中曾经提到链表(list).队列(queue)和(stack),为了更加系统化,这里统一介绍着三种数据结构及相应实现. 1)链表 首先回想一下基本的数据类型,当需要存储多个相同类型的数据 ...
-
排序算法----基数排序(RadixSort(L))单链表智能版本
转载http://blog.csdn.net/Shayabean_/article/details/44885917博客 先说说基数排序的思想: 基数排序是非比较型的排序算法,其原理是将整数按位数切割 ...
-
防御性编程习惯:求出链表中倒数第 m 个结点的值及其思想的总结
防御性编程习惯 程序员在编写代码的时候,预料有可能出现问题的地方或者点,然后为这些隐患提前制定预防方案或者措施,比如数据库发生异常之后的回滚,打开某些资源之前,判断图片是否存在,网络断开之后的重连次数 ...
-
时间复杂度分别为 O(n)和 O(1)的删除单链表结点的方法
有一个单链表,提供了头指针和一个结点指针,设计一个函数,在 O(1)时间内删除该结点指针指向的结点. 众所周知,链表无法随机存储,只能从头到尾去遍历整个链表,遇到目标节点之后删除之,这是最常规的思路和 ...
-
C语言之链表list
#include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <string.h& ...
-
单链表的C++实现(采用模板类)
采用模板类实现的好处是,不用拘泥于特定的数据类型.就像活字印刷术,制定好模板,就可以批量印刷,比手抄要强多少倍! 此处不具体介绍泛型编程,还是着重叙述链表的定义和相关操作. 链表结构定义 定义单链表 ...
-
学习javascript数据结构(二)——链表
前言 人生总是直向前行走,从不留下什么. 原文地址:学习javascript数据结构(二)--链表 博主博客地址:Damonare的个人博客 正文 链表简介 上一篇博客-学习javascript数据结 ...
-
用JavaScript来实现链表LinkedList
本文版权归博客园和作者本人共同所有,转载和爬虫请注明原文地址. 写在前面 好多做web开发的朋友,在学习数据结构和算法时可能比较讨厌C和C++,上学的时候写过的也忘得差不多了,更别提没写过的了.但幸运 ...
-
数据结构:队列 链表,顺序表和循环顺序表实现(python版)
链表实现队列: 尾部 添加数据,效率为0(1) 头部 元素的删除和查看,效率也为0(1) 顺序表实现队列: 头部 添加数据,效率为0(n) 尾部 元素的删除和查看,效率也为0(1) 循环顺序表实现队列 ...
随机推荐
-
【开源】OSharp框架解说系列(4):架构分层及IoC
OSharp是什么? OSharp是个快速开发框架,但不是一个大而全的包罗万象的框架,严格的说,OSharp中什么都没有实现.与其他大而全的框架最大的不同点,就是OSharp只做抽象封装,不做实现.依 ...
-
iphone状态栏高度?
设备分辨率 状态栏高度 导航栏高度 标签栏高度 iPhone6 plus 1242×2208 px 60px ...
-
webpack配置详解
webpack配置详解 先点个赞吧,再挨个点下面的连接,觉得不值这个赞的回来骂我啊. Webpack傻瓜式指南(一) Webpack傻瓜指南(二)开发和部署技巧 Webpack傻瓜式指南 原生的官网详 ...
-
hdu-4893-Wow! Such Sequence!-线段树【2014多校第三场-J】
题意:一个初始为0的数组,支持三种操作:1.向第k个数添加d,(|d| < 2^31);2.把[l, r]区间内的数字都换成与它最相近的Fibonacci数;3.询问[l, r]区间的和. 思路 ...
-
Android Studio 1.3新版体验
Google发布的Android Studio最新版是 1.3 版,上周的I/O大会中三位Google工程师对Android Studio作了将近1小时的演讲: 之前一直习惯用Eclipse luna ...
-
Error Curves(2010成都现场赛题)
F - Error Curves Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Descript ...
-
PHP操作Redis队列的方法
入队: <?php $redis = new Redis(); $redis->connect('127.0.0.1',6379); while(True){ try{ $value = ...
-
iOS命名规范(转载)
转载地址:http://www.cnblogs.com/qiqibo/archive/2012/09/05/2671553.html 正文: • 格式化代码 ◦ 指针“*”号的位置 ▪ 如:NSStr ...
-
打开Delphi 10.1 berlin提示脚本错误的解决方法
HKEY_CURRENT_USER\SOFTWARE\Embarcadero\BDS\18.0\Known IDE Packages $(BDS)\Bin\CommunityToolbar240.bp ...
-
node socket :10106无法加载或初始化请求的服务提供程序
node socket :10106无法加载或初始化请求的服务提供程序 无端端的,不知道怎么回事,node突然就坏掉 了,应该是某些配置无意中改动了,问题如下: 目前能想到的解决办法就是:重置配置,用 ...