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自定义控件2-简单的写字板控件
概述 上一篇文章我们对自定义控件进行了一个大体的知识介绍.今天就来学习自定义一个简单的写字板控件. 先来看看效果图 就是简单的根据手指写下的轨迹去画出内容 实现 在上一篇文章里提到了android官方 ...
- MyBatis Generator作为maven插件自动生成增删改查代码及配置文件例子
什么是MyBatis Generator MyBatis Generator (MBG) 是一个Mybatis的代码生成器,可以自动生成一些简单的CRUD(插入,查询,更新,删除)操作代码,model ...
- Oracle数据泵(Data Dump)错误汇集
Oracle数据泵(Data Dump)使用过程当中经常会遇到一些奇奇怪怪的错误案例,下面总结一些自己使用数据泵(Data Dump)过程当中遇到的问题以及解决方法.都是在使用过程中遇到的问题,以后陆 ...
- Vmware虚拟机进入BIOS方法
在VMware里面如何进入BIOS是个头疼的问题,因为启动界面一闪而过(下面两个图如果不设置bios.bootDelay,基本上很难抓到),即使你狂按F2或ESC键(ESC: 调整启动顺序;F2: 进 ...
- 使用管道符在PowerShell中进行各种数据操作
最近在培训PowerShell,在讲到Pipeline的时候,对于我这种长期和数据(数据库)打交道的人来说,觉得很实用,所以写此博文,记录一下. 无论是在Linux中写Bash脚本还是在Window上 ...
- nodejs 使用Google浏览器进行可视化调试——Node Inspector工具
1.npm安装Node Inspector工具,全局安装 命令行执行npm install -g node-inspector 2.启动Node Inspector工具,命令行执行 node-insp ...
- 设计模式C#实现(十五)——命令模式
意图 0 适用性 1 结构 2 实现 3 效果 4 参考 5 意图 将请求封装成一个对象,客户接受请求参数:可以对请求排队或者记录请求日志,以及可以支持撤销操作 适用性 抽象出待执行的动作以参数化某对 ...
- [原创]kali linux下破解wifi密码以及局域网渗透
无线破解是进行无线渗透的第一步.破解无线目前只有两种方法:抓包.跑pin. 破解无线方法一:抓包.我是在kali linux下进行的. 将无线网卡的模式调为监听模式. airmon-ng start ...
- JavaScript的写类方式(6)
时间到了2015年6月18日,ES6正式发布了,到了ES6,前面的各种模拟类写法都可以丢掉了,它带来了关键字 class,extends,super. ES6的写类方式 // 定义类 Person c ...
- ubuntu sudo不需要输入密码
用如下命令 sudo visudo 在其中添加一行,若你想让一个用户sudo时不需要进行密码输入则以用户名开头,若想让一个组有此特权则以%组名开头,例如: zhuhui ALL=NOPASSWD: A ...