
C/C++
文章平均质量分 78
疯狂的红豆
拥有热情相信未来
展开
-
C++如何拒绝对象的copy
中的一个条款,如果是想要阻止一个对象的复制或是copy assignment操作应该怎么做呢?class HomeForSale {};HomeForSale h1;HomeForSale h2;HomeForSale h3(h1); //企图调用h3的copy构造函数克隆出一份h1h1 = h2; //企图调用co原创 2013-04-29 13:58:36 · 3404 阅读 · 0 评论 -
基于数组的循环队列
之前讲的是基于链式存储的队列,如果是基于数组的存储结构 的队列会是怎样的呢?起初队头和队尾均指向第一个元素,随着不断地进队列,后来队列满了。这时候从队头出队列,当出完后此时队头和队尾均指向数组的末尾了。虽然这个数组是空的,但是不能用来存储了,造成了很大的浪费。在这个时候能不能将数组前面的空位置利用起来,继续用来存储呢?这个时候就用到了循环队列的概念了,循环队列主要是为了解决基于顺序存储的队列造成的原创 2013-01-22 19:41:07 · 9154 阅读 · 0 评论 -
基于链式存储的队列
日常生活中我们吃饭,买票等都是要排队的,这里的排队其实就是对应着数据结构中的队列了。其中排队过程中不允许插队也是一个能反应队列结构性质的表现吧。队列和栈一样,是一个被限制存取的线性结构。普通队列规定只能在队头出,只能在队尾进,这也是为什么不允许插队的原因了。当然这里讨论的是最简单的最普通的队列了,当然还是有一些特殊的队列的,比如双端队列,优先级队列等,后续细说。基于链式存储的队列结构中,结点类原创 2013-01-22 18:34:35 · 1425 阅读 · 0 评论 -
队列的应用—电路布线最优解问题
首先什么是电路布线问题呢?电路布线问题是类似于迷宫的问题,也是一个模拟矩阵,迷宫是每个点有8个方向可以走,但是在电路布线问题中每个点上只有上下左右4个方向可走。因为电路布线不允许对角线上布线,并且电路布线问题要求线路所走过的路程必须是最短的,即从出发点到目的点路径很可能有很多,要找的是经过跳数最少的那个。也就是说不能太多的弯儿,能直走的就直着走。迷宫问题是只要找到出路,不管路径是如何的。在寻找原创 2013-02-05 20:39:29 · 4691 阅读 · 1 评论 -
栈的应用—中缀转后缀求表达式值
栈的应用有很多,我们最熟悉的函数调用与递归等对编译器来说都是用栈的工作原理来实现的。还有我们的浏览器中有一个向后退选项,这就是一个栈的应用了(这个是中的举例)。还有就是本篇要讲的表达式求值了。我们知道C/C++是基于表达式的程序设计语言,可见表达式对于语言的重要性了。至于什么是表达式等话题这里就不讨论了,直接说表达式的三种类型,他们分别是:前缀表达式,中缀表达式,后缀表达式。在这里只讲对于双目原创 2013-01-18 23:27:52 · 7464 阅读 · 1 评论 -
约瑟夫问题详解
约瑟夫问题记得是在学习C语言数组的时候写过的一道题目,至于什么是约瑟夫问题我想大多数学过C的人都应该知道的,下面就来说下如何利用数组解决约瑟夫问题。默认的约瑟夫问题是从第一个人开始计数,并且留下最后一个幸存者,笔者做的改进是可以从指定位置起始计数,并且可以留下指定的人数,并且可以查看被踢出的人。最开始要求输入总人数,然后指定起始计数位置(默认从第一个开始),剩余人数(默认剩余一个人)。每一个被原创 2013-01-13 12:39:24 · 3162 阅读 · 0 评论 -
基于链式存储结构的栈
基于链式存储结构的栈和单链表几乎没差,不同的地方在链栈也是只能在一端进行存取操作,而单链表则可以在任何位置进行。单链表的建立分为前插法和后插法,前插法是将每次新插入的结点作为头,后插法是将每一次新进入的结点放在最后面。链栈的建立用前插法是很方便的。链栈的结点类和单链表的一样:#pragma once#includeusing namespace std;templateclass原创 2013-01-13 13:18:13 · 1760 阅读 · 0 评论 -
基于顺序存储结构的栈
栈也是一种线性结构,如果用一句话介绍栈的话,那就是后进先出(LIFO:Last In First Out)。栈的特性是由于其特殊的存取方式决定的,那就是只能在一端进行存取动作。可以存取的一端一般称为栈顶,另一端称为栈底。究竟栈底索引置为-1还是置为0也是一个讲究,普遍的方法是置为-1,这一点在后面的存取操作中会发现优势。 一般有push和pop操作,以及栈空,栈满等判断。本文介绍的是基于顺序存原创 2013-01-13 13:09:56 · 1524 阅读 · 0 评论 -
队列的应用—输出杨辉三角
#include"Queue.h"#includeusing namespace std;const int total_row = 6;void main(){ void Pascal_Triangle();//函数声明 Pascal_Triangle();}void Pascal_Triangle()//杨辉三角 输出二项式系数{ Queue qu;//队列 int e原创 2013-01-26 23:08:41 · 6919 阅读 · 0 评论 -
基本单链表实现
这个学期初识数据结构,不知其为何物,更不知道其在软件工程以及计算机科学中的重要地位与作用。在这个学期的第一个月内我只做了一件事,那就是认真的读教材,认真的分析书上的所有代码,慢慢的我也懂了什么是数据结构了,并在看书的过程中不断的思考为什么要这么做,中途也会自己冒出一些想法来。因为教材有不完善或是错误的地方(后续的结构中会在代码中提示出来),而且确实诟病很多,所以我就在看懂一个结构后对他修修改改使结原创 2013-01-10 10:36:46 · 2112 阅读 · 0 评论 -
基于栈操作的迷宫问题求解
新的一年的第一个月都已经过了一个星期了,发现这个月至今还没有写一篇博客呢,于是就把之前学栈的时候写过的一个基于栈操作的迷宫问题求解给贴上来吧,哈哈哈。。。。迷宫的描述:用一个二维数组表示一个迷宫,这个二维数组的每一个元素的上下左右以及对角线上的四个方向,这总共加起来是八个方向,其中数字0表示可以通过,数字1表示此处不通,判断给定的一个迷宫是否有出路,有出路的话,求解出走出的路线。存储结原创 2013-01-07 13:45:13 · 6932 阅读 · 4 评论 -
递归求解迷宫问题
前面已经介绍了迷宫的存储等一些准备工作,这篇博客就只是介绍利用递归思想解决迷宫问题。递归有几个要义:知道在函数的哪里调用自身进行递归,换句话说就是递归的条件是什么,然后递归的出口是什么。最开始当前位置记录的是起始位置,然后利用循环有顺序的去判断8各分支是否可走,如果可以那么就将这下一个位置的行和列传入函数本身,进行递归了。如果下一个位置不行,那么在跳转在下一个方向,还有就是如果一个位置上8个方原创 2013-01-07 14:33:03 · 4553 阅读 · 1 评论 -
双向循环链表的实现
在使用链表来解决约瑟夫问题的时候,用到了循环链表。循环链表又分为单向循环链表与双向循环链表,约瑟夫问题采用单向循环链表可以得到很好的而解决了,但是单向链表的很大的缺陷仍然存在,那就是在删除的时候需要两个并排指针同步移动。双向链表就可以解决这个问题,因为在双向链表中的每一个结点都有两个指针域来分别指向其前驱和后继。这样子在遍历链表时不用两个指针,直接使用一个就好,当锁定位置后,取出其前驱然后再保存当原创 2013-01-10 12:16:17 · 2715 阅读 · 3 评论 -
C++封装SQLite实例<四>
之前介绍的是如何获取一张表和一个查询结果,这一篇主要是将SQLite的查询语句封装成一个类,便于使用与查询。一个SQLite语句有执行DML(数据控制语言)类操作的,还有主要就是执行查询类的语句了。需要指定sqlite3*对象,还需要sqlite3_stmt*对象。这两个就是这个CppSQLite3Statement类的成员变量。class CppSQLite3Statement{pr原创 2013-03-28 21:39:29 · 3620 阅读 · 1 评论 -
C++封装SQLite实例<五>
之前的博客都在讲如何将一个普通的SQLite查询/执行流程中所涉及到的变量与函数封装到几个类中去。封装所遵循的原则是,尽量的不要有太多的耦合,因为SQLite的变量或是结构都是指针类型的,如果不同的类对象公用同一个指针,那么势必会在后面出现内存访问问题。所以CppSQLite3Table中字段是独有的一个一维指针数组,两个整型字段分别表示这个表中的行值和列值。CppSQLite3Query中的大部原创 2013-03-30 00:38:18 · 6604 阅读 · 0 评论 -
C++封装SQLite实例<六>
之前的连续五篇大致介绍了各种SQLite的原生函数原型,参数以及用途等,并对各个封装的类做了详细的介绍,最后一篇将展示一下怎么使用封装,使用封装的时候需要注意的问题等。假设已经存在一个数据库名为FirSQLite.db;下面使用各种类来对其做各种常规访问与操作。最开始要定义一个CppSQLite3DB类对象 db;然后调用函数Open(const char *)打开一个已经存在的数据库,原创 2013-03-30 23:20:45 · 4303 阅读 · 0 评论 -
基于循环链表的约瑟夫问题
#pragma once#includeusing namespace std;templateclass LinkNode //一个结构体对外全部可见{public: T data; //模板类型的一个数据 LinkNode* link; //该struct的一个指针,用于指向下一个结点public: LinkNode(LinkNode* ptr = NULL)//只初始化指原创 2013-05-30 19:43:39 · 1950 阅读 · 0 评论 -
二叉树实现详解
二叉树按照数据结构类型来划分属于树结构,在树结构中他又是比较简单而且具有理论研究的意义的一种数据结构。有很多树形结构都是基于二叉树的变种,所以对二叉树的学习与了解是很有必要的。根据笔者的经验,在学习数据结构的过程中要深刻的体会逻辑接口与物理存储实现的区别与联系。比如在之前的博客中有讲到栈和队列的实现,栈和队列都有基于数组存储方式的实现和基于链表存储形式的实现。所谓的逻辑接口就是这个数据结构具备哪些原创 2013-05-01 18:48:04 · 14574 阅读 · 2 评论 -
ADO连接SQL SERVER 2008数据库代码
ADO在这里就不细述了,直接讲解访问的过程。#pragma once#include#include #include #include //为了COleDateTime类引入using namespace std;//这是引入ADO动态链接库,默认的路径如下,如果不在默认地方,在这里需要另外指明位置#import "c:\program files\common fil原创 2013-04-18 20:55:10 · 9918 阅读 · 1 评论 -
野指针,悬垂指针,垃圾内存,内存“黑洞”
野指针首先他不是NULL指针,其次他指向的内存是不合法的,这个不合法的内存俗称“垃圾”内存。它产生的原因一个是在free或是delete后,没有及时将指针设置为NULL。野指针的检测也是很困难的,比如用if(0 == ptr)也是不行的,因为在free或是delete后ptr并没有被设置为NULL。关于为什么是(0 == ptr)而不是(ptr == 0),这一点建议去看Effective C++原创 2013-04-12 20:31:08 · 3890 阅读 · 3 评论 -
使用纯C++STL重写读取CSV表格
之前写的读取CSV表格代码是经过封装的C与C++混合代码,最近不断的有机会接触C++的容器与算法库,所以就不断的学习,不断的进步,发现了用STL搜索文本的方法就去改写之前写的代码。第一步先打开文件ifstream in("skill.csv"); 判断打开是否成功的函数有in.is_open(),in.fail(),in.bad(),in.good()等。第二步将文件中的内容以行原创 2013-04-11 22:57:11 · 3882 阅读 · 0 评论 -
C++封装SQLite实例<三>
前一篇博客中介绍的是如何根据sqlite3_get_table()函数来获取一张表的内容,就是一股脑的把表中的内容全部存储起来放在一个一维数组中,这当中的规则已经介绍过了。接下来讲的是如何根据一个SQL查询语句来挑选出合乎选择条件的记录,被挑选出的记录事先是不知道的。你不知道这个查询的结果中有几行更不知道每一行中具体的记录值是什么,所以没办法用给定行值和列值的方式来获取数据,所有之前的用数组存储表原创 2013-03-26 18:32:58 · 7779 阅读 · 0 评论 -
C++封装SQLite实例<二>
这一篇博客主要讲如何使用SQLite有关库函数去管理数据库中的一张表。主要用到的函数:SQLITE_API int sqlite3_get_table( sqlite3 *db, /* The database on which the SQL executes */ const char *zSql, /* The SQL t原创 2013-03-24 13:38:15 · 5038 阅读 · 2 评论 -
C++封装SQLite实例<一>
第一次结识SQLite是在上学期,有一个软工的同学在看有关安卓应用的书籍,正好在实验室碰到了他,他正在看的就是SQLite这个数据库在安卓上的使用。从那以后就再也没有了解过有关SQLite的信息,上星期学长们的CDIO组在做一个游戏,要用到这个数据库,正好我也在这个组里,于是就分配我去学习如何封装这个数据库中的原生态函数,以便于访问数据库。学了一个星期,根据外文网站上的一个例子逐步的去拆解过程函数原创 2013-03-22 23:49:33 · 4918 阅读 · 1 评论 -
基于单链表的多项式问题
上学期的东西了,不想再去细究思路了,直接贴代码,注释很详细#pragma once#includeusing namespace std;class LinkNode{public: float coef;//系数 int expn;//指数 LinkNode *link;//指向后继的指针域 LinkNode *plink;//指向前驱的指针域public: LinkN原创 2013-03-23 23:20:53 · 2706 阅读 · 0 评论 -
C++读取CSV表格
看到这个题目可能会有人问什么是CSV表格呢,在我做这个实现之前我也是没有听说过CSV表格,更不知道他有什么用了。CSV是一种Excel表格的导出格式,在Excel表格的菜单栏中点击文件->另存为会弹出一个文件夹浏览窗口,在下拉框中可以选择保存格式,其中有一个就是.CSV(逗号分隔符)选项。CSV表格的规则:1 开头是不留空,以行为单位。2 可含或不含列名,含列名则居文件第一行。3原创 2013-04-06 16:34:20 · 32872 阅读 · 11 评论 -
C/C++中的序点
int i = 3; i = i++; cout 结果是什么?有人可能会说是3,也有人可能会说是4,更多的人在骂出题的人白痴,但这语句究竟有何问题呢?未必每个人都清楚。 有些人也许马上会说,这是“未定义行为”。没错,这是一个典型的未定义行为。i = i++这个表达式合乎C++语法,能够顺利编译通过,但是执行的结果,标准说“未定义”。为什么是原创 2013-04-06 15:41:34 · 1945 阅读 · 0 评论 -
void main()误区
很多人甚至市面上的一些书籍,都使用了void main( ) ,其实这是错误的。C/C++ 中从来没有定义过void main( ) .C++ 之父 Bjarne Stroustrup 在他的主页上的 FAQ 中明确地写着 The definition void main( ) { /* …… */ } is not and never has been C++, nor has it e原创 2013-04-03 15:13:18 · 7475 阅读 · 3 评论 -
双向链表的实现
单链表是最基本最简单的结构了,用处也蛮多的吧,尤其是后面在层序结构的各种树与图结构的时候大量使用链表而且还很多是单链表形式的。学习双向链表还是由约瑟夫问题引入的呢,在单链表的删除操作时需要用并排的两个指针同步向后移动,为避免这个问题双向链表就派上用场了。双向链表顾名思义是每个结点有两个方向了,那么在结点里面不仅仅要保存一个后向指针还要保存一个前向指针了。#pragma once#includ原创 2013-01-10 10:54:06 · 2646 阅读 · 0 评论 -
声明与定义&&赋值与初始化详解
我想不管是现在学C系语言的人,还是学习Java等以及其他语言的人最初的入门语言应该都是C语言吧。C语言的难易程度是否适合作为编程入门语言我恐怕没有这个能量来论述一番。我想说的是C语言中的这几个名词(RT)自从最开始出现就一直萦绕在耳边,停留在口头上,但却又总是分不清,道不明的。最近几天搜集了一些这方面的文章与帖子来总结一下,总结是一项很好的学习方法,如果你能把你所学的东西说给别人听,并且把别人说懂原创 2012-12-27 12:38:55 · 7237 阅读 · 1 评论 -
AOV网络
在现代化管理中,人们常用有向图来描述和分析一项工程的计划和实施过程,一个工程常被分为多个小的子工程,这些子工程被称为活动(Activity),在有向图中若以顶点表示活动,有向边表示活动之间的先后关系,这样的图简称为AOV网。如下图是计算机专业课程之间的先后关系: 图片注释:基础知识课程应先于其它所有课程,pascal语言课程应先于数据结构。 用顶点表示活动,用弧表示活动原创 2012-12-06 19:19:19 · 2001 阅读 · 0 评论 -
C/C++中怎样获取日期和时间
C/C++中怎样获取日期和时间C/C++中怎样获取日期和时间摘要: 本文从介绍基础概念入手,探讨了在C/C++中对日期和时间操作所用到的数据结构和函数,并对计时、时间的获取、时间的计算和显示格式等方面进行了阐述。本文还通过大量的实例向你展示了time.h头文件中声明的各种函数和数据结构的详细使用方法。 关键字:UTC(世界标准时间),Calendar Time(日历时间),转载 2012-11-21 22:55:46 · 22533 阅读 · 2 评论 -
Dijkstra最短路径算法(SPF)
算法描述:Dijkstra算法是一种求单源最短路的算法,即从一个点开始到所有其他点的最短路。其基本原理是:每次新扩展一个距离最短的点,更新与其相邻的点的距离。当所有边权都为正时,由于不会存在一个距离更短的没扩展过的点,所以这个点的距离永远不会再被改变,因而保证了算法的正确性。不过根据这个原理,用Dijkstra求最短路的图不能有负权边,因为扩展到负权边的时候会产生更短的距离,有可能就破坏了原创 2012-12-04 22:42:53 · 15258 阅读 · 1 评论 -
微软“匈牙利”法程序标示符命名规则
//头文件#pragma once //防止头文件二次编译#include#includeusing std::string;using std::ifstream;using std::ostream;//using namespace std;class Student //类名用大写字母开头的单词组合{protected: //可能会被作为基类继承,所以做成保护的原创 2012-11-19 01:57:56 · 3583 阅读 · 0 评论 -
最小生成树之Prim算法的实现
这个算法的实现与克鲁斯卡尔算法的实现,个人感觉思想还是差很多的。K算法从第一个迭代就保证了符合最小生成树的基础上的算法正确性,因为每一次选的都是符合规则的前提下代价最小的。然而P算法却不是这么想的,当初上课的时候还问老师,如何证明P算法的正确性。最后发现,不管首次选取的是哪一个点,都是找与此点相关联的边中代价最小的,所以经过某些轮的迭代(最后是图的边数目次)就会把所有权值中最小的那个加进去,倒数第原创 2012-12-03 00:09:09 · 1836 阅读 · 0 评论 -
最小生成树之Kruskal算法的实现
克鲁斯卡尔算法定义:(百度贴来的) 假设 WN=(V,{E}) 是一个含有 n 个顶点的连通网,则按照克鲁斯卡尔算法构造最小生成树的过程为:先构造一个只含 n 个顶点,而边集为空的子图,若将该子图中各个顶点看成是各棵树上的根结点,则它是一个含有 n 棵树的一个森林。之后,从网的边集 E 中选取一条权值最小的边,若该条边的两个顶点分属不同的树,则将其加入子图,也就是说,将这两个顶点分别所在的两原创 2012-12-03 00:00:05 · 1801 阅读 · 0 评论 -
并查集的实现
之前没有接触过集合这种数据结构,而且还因为课程进度慢的原因就没讲,但是最近在学最小生成树的算法的时候用到了并查集这个结构。但是没学,那天和老师聊的时候,受命写了一个并查集的数据结构供大家使用。我写之前只是看了看百度的对并查集的描述和Kruskal算法的需求,就开始动手写了,因为这个学期因为数据结构喜欢上了GP编程,并通过不断的学习结构定义与算法实现,自己为了锻炼一下子,就采用了模板,而且这个并查集原创 2012-12-02 23:48:02 · 1569 阅读 · 0 评论 -
防止头文件二次编译
一、下划线“__”属于编程风格的内容,对程序没有影响。不用下划线也可以,用几个下划线也由个人习惯。二、其实质是一个宏名。由此我们可以防止发生重复定义或声明。假设你的头文件名为head.h,根据习惯,我们声明一个宏HEAD_H,对应这个头文件,在头文件中开始的地方和结尾的地方加上 对HEAD_H的声明和判断,头文件Head.h如下: #ifndef HEAD_H转载 2012-11-16 22:23:18 · 2232 阅读 · 0 评论 -
#pragma once与#ifndef两种防止头文件二次编译的区别
在最开始接触到C语言的时候,看到很多大牛们写的代码里面就有#ifndef #define #endif 这三条语句,当时不明白什么意思,慢慢的后来自己也开始用了,也知道了他们合起来使用时为了防止头文件被二次编译,因为我们曾经写代码的过程中一定遇到过等类似的错误吧。到了学习C++的时候,我们老师给我们看他的代码的时候发现他的头文件里用的是#pragma once,就奇怪这是什么呢?然后私下百度原创 2012-11-16 23:36:51 · 37828 阅读 · 6 评论 -
图结构系列—图的遍历
对于图的描述,已经把最基本的结构定义以及操作算法说的差不多了,其余的当做补充在后序中说吧。一个图,不管是有向的无向的,是基于什么结构存储的,这些差异都体现在存储上,对于上层的业务逻辑来说,都是一样的。所以现在来讨论一下有关图的遍历算法的实现。图的遍历有深度优先算法,以及广度优先遍历算法。我们作为教材学习的是着重于 顶点描述一个图,所以对图的遍历也是针对顶点的搜索与判断,查询等。之前学的树原创 2012-11-29 21:57:13 · 1157 阅读 · 0 评论