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 = );//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) 循环顺序表实现队列 ...
随机推荐
- UITextView回收或关闭键盘
iOS开发中,发现UITextView没有像UITextField中textFieldShouldReturn:这样的方法,那么要实现UITextView关闭键盘,就必须使用其他的方法,下面是可以使用 ...
- UIToolBar
//UIToolBar 是导航控制器默认隐藏的工具条 //设置UIToolBar的隐藏状态 self.navigationController.toolbarHidden = NO; //如何找到UI ...
- 蚂蚁金服寒泉子:JVM源码分析之临门一脚的OutOfMemoryError完全解读
➠更多技术干货请戳:听云博客 概述 OutOfMemoryError,说的是java.lang.OutOfMemoryError,是JDK里自带的异常,顾名思义,说的就是内存溢出,当我们的系统内存严重 ...
- SQL SERVER 作业浅析
作业介绍 SQL SERVER的作业是一系列由SQL SERVER代理按顺序执行的指定操作.作业可以执行一系列活动,包括运行Transact-SQL脚本.命令行应用程序.Microsoft Activ ...
- linux c++应用程序内存高或者占用CPU高的解决方案_20161213
对于绝大多数实时程序来说,实时处理相关程序中的循环问题所带来的对机器的损耗和自身的处理速度的平衡,以及与其他程序的交互以及对其他功能的影响难免会成为程序设计中最大的障碍同时也是最大的突破点. 在所有这 ...
- iOS AppIcon尺寸和上传ITunes构建版本尺寸
避免忘记. 记录一下 App Icon: 29X2940X4058X5876X7687X8780X80120X120152X152167X167180X180 ITunes构建版本: 1242 x 2 ...
- 附加数据库后无法创建发布,error 2812 解决
日前,由于业务需要,我要把一个数据库直接迁移到新的实例上 用的方法比较古老,就是直接停旧服务器,将数据文件复制到新服务器上,附加数据库 当然这个附加没有什么可说的了,但是在附加后需要将原来库上的发布重 ...
- 【java开发】面向对象初步认识与基础概念讲解
简单的把前面的java基础知识讲了,接下来就开始面向对象的旅程了. 对象(Object):简而言之,世界是由对象组成的,一切可见的事物吧 类(class):说白了就是把具有相同的一些特征或是属性归为一 ...
- Ubuntu配置OpenLDAP
sudo apt-get install slapd ldap-utils sudo dpkg-reconfigure slapd sudo apt-get purge slapd sudo apt- ...
- Eclipse Kelper 设置代理服务器无效解决方案
Open Network Connection Settings. Select Active Provider to "Manual". Set HTTP/HTTPS proxy ...