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) 循环顺序表实现队列 ...
随机推荐
- Android高效计算——RenderScript(一)
高效计算——RenderScript RenderScript是安卓平台上很受谷歌推荐的一个高效计算平台,它能够自动把计算任务分配到各个可用的计算核心上,包括CPU,GPU以及DSP等,提供十分高效的 ...
- 我的Android第五章:通过Intent实现活动与活动之间的交互
Intent在活动的操作 作用: Itent是Android程序中各个组件直接交换的一个重要方式可以指定当前组件要执行任务同时也可以给各个组件直接进行数据交互 同时Inten ...
- 从英文变形规则计算到Restful Api设计
➠更多技术干货请戳:听云博客 一天在研究Restful API设计,命名的时候我总是很纠结,我相信大多数人也有这种感觉,不是说想不出来某个单词怎么写的问题,像我这种没事背单词背到13000词量的人也要 ...
- OC NSFileHandle(文件内容操作)
OC NSFileHandle(文件内容操作) 初始化 [NSFileHandle fileHandleForUpdatingAtPath:@"data.txt"]; //file ...
- ios手势操作,四个基本事件与六个常用事件
基本事件包括begin,canceled,move,ended四项,如果对象的hidden属性为yes,则无效果,hidden属性必须为no;才能使用: -(void)touchesBegan:(NS ...
- Linux No volume control GStreamer plugins and/or devices found
案例环境:Oracle Linux Server release 5.7 进入Oracle Linux系统后,在右上角点击声音图标时,则会弹出如下报错窗口: The volume control di ...
- Database 'xxx' cannot be upgraded because it is read-only or has read-only file Make the database or files writeable, and rerun recovery.
在分离数据库DatabaseName(暂且用DatabaseName代替该数据库名)后,我将其数据文件以及日志文件移动到新增的磁盘上.然后附加该数据库,结果报如下错误: Database 'Dat ...
- SQLSERVER自动定时(手动)备份工具
最近项目需要,写了一个小工具软件: 1.实时显示监控 2.可多选择备份数据库 3.按每天定时备份 4.备份文件自动压缩 5.删除之前备份文件 直接上图 1.备份监控界面: 2.数据库设置: 附工具下载 ...
- SQL Server 2008 R2——软件创建月表时同时创建一个触发器
=================================版权声明================================= 版权声明:原创文章 谢绝转载 请通过右侧公告中的“联系邮 ...
- android onActivityResult无效或先执行或无回传问题
我的问题属于第一种情况,更改后下确有回传结果. (http://www.cnblogs.com/tt_mc/p/3586834.html) Android Activity的加载模式和onActivi ...