私信 关注
happycock
码龄18年
  • 194,546
    被访问量
  • 70
    原创文章
  • 37,866
    作者排名
  • 79
    粉丝数量
  • 于 2003-06-15 加入CSDN
获得成就
  • 获得1次点赞
  • 内容获得57次评论
  • 获得2次收藏
荣誉勋章
TA的专栏
  • Windows相关
    4篇
  • WTL入门
    8篇
  • 常见问题FAQ
    12篇
  • 我的WTL
    5篇
  • 我的收藏
  • 数据结构(用面向对象和C++描述)
    44篇
  • 杂谈
    1篇
  • 最近
  • 文章
  • 资源
  • 问答
  • 课程
  • 帖子
  • 收藏
  • 关注/订阅

悲催的PKU ACM 3980

读研那会儿,偶然发现了这个http://acm.zju.edu.cn/onlinejudge/(现在回忆起来大约是在CSDN算法论坛泡的时候有人提起的,原谅我这读本科不是计算机专业的人吧),于是就兴致满满的一道一道做,直到做完了1008。突然觉得很没意思,那些AC率低的一般都是NP问题,翻来覆去就是如何剪枝,而这个是最伤脑细胞的。然后呢,就不做了。最近听说浙大得了ACM比赛的世界冠军,上去又看了看
原创
807阅读
0评论
0点赞
发布博客于 10 年前

J2ME中Form的内存泄露

改别人代码是件很痛苦的事情,但是工作中在所难免。今天碰到了很棘手的问题——有一个类的对象无论如何不能被回收,当然这是在排查了半天内存溢出之后得出的结论。还好模拟器忠实的反映了这个问题——假设创建了一个包含两个TextField的Form之后,那么这个Form将永远存在,哪怕没有任何引用,好在只会存在一个。问题的根由就是把那个包含很多资源的类作为那个Form的CommandListener之后,
原创
790阅读
0评论
0点赞
发布博客于 12 年前

Java中Stream的close

 最近在精简代码,发现每次new一个ByteArrayInputStream然后再new一个DataInputStream,然后还要把两个都close,看着都恶心,真的要这么写吗?首先,实在搞不懂为什么ByteArrayInputStream也要close,完全没有意义吗!好在现在java也开源了,看了一下源代码,发现close还真是多余的:    /**     * 
原创
2401阅读
0评论
1点赞
发布博客于 13 年前

在Lua中使用Unicode

这是一个事实上已经解决的,但是却很难搜索到方案的问题。在这点上不得不佩服老外的兜圈子和中国人的没耐性。关于这个问题比较详细的文档是lua-suers wiki上的一篇http://lua-users.org/wiki/LuaUnicode,看完之后,虽然懂了不少,还是没解。这点也怪不得人家,Unicode的问题对于东亚语系才是不得不解决的问题。倒是中文资料总是三言两语带过,确实让人很愤懑。
原创
7114阅读
0评论
0点赞
发布博客于 13 年前

Mercurial的.hgignore写法

 看了N多的介绍,结果都是一句话——一目了然,就不介绍了……其实那些例子并没有涵盖常用需求,所以导致我很困惑。自己研究一下吧。hgignore支持两种语法,Python/Perl-style regular expressions和系统shell。虽然shell语法一目了然,但是还是建议使用regexp吧,一是不用在文件中指定语法(正则表达式是默认语法),二是可控性高些。常用需求有两种:过
原创
4367阅读
0评论
0点赞
发布博客于 13 年前

Linux下Netbeans的字体反锯齿

首先说明,我是被锯齿的Netbeans虐待了半年才下决心解决来解决这个问题,想想还真是冤枉。我用的Linux发行版是Ubuntu8.04,如果使用源里面的JDK一切都很简单(现在源里的版本是1.6u6),JDK6开始支持反锯齿。装完Netbeans你就会惊喜的发现,仿原生GUI的界面(GTK+)上的文字是反锯齿的,但是编辑器里面的文字是锯齿的,小了看着别扭,选大号的字体就极为明显的看出来了。这
原创
4468阅读
0评论
0点赞
发布博客于 13 年前

如何在Linux下实现Nokia PC Suit的功能

    不管Nokia PC Suit的口碑如何(有人说它太大、影响系统稳定,等等……),我所以在windows下用,不外乎两个原因,电话簿和传文件,对于S40还有一个用处是安装程序——直接蓝牙发送和数据线拷贝不能保存RMS,对于继承存档的游戏来说真是个大问题。    换到Linux(我用的Ubuntu 8.04)下后,google到“Nokia PC Suit for Linux”一律是自力
原创
37阅读
1评论
0点赞
发布博客于 13 年前

生成在PC和手机都能运行的jar包

首先看一下可行性。java的字节码规范是一样的,但是两个平台的类库有很多不同,好在程序执行的入口点不同,并且对于根本不会执行到的死代码,里面有什么无所谓。下面看一下具体过程:首先生成一个midletimport javax.microedition.midlet.*;import javax.microedition.lcdui.*;public cla
原创
1353阅读
0评论
0点赞
发布博客于 13 年前

Java的“静态库链接”

Java的库组织方式就是“动态链接”的,从一个Java的jar包运行有可能要接一堆classpath就知道。和基于静态链接的C语言要实现动态链接要做额外的事情相似,Java要想实现类似C的静态链接也要做很多额外的事。用类似Fat Jar的方法,把所有的依赖库打包的最后的库中,其实不是静态链接——C的静态链接只把需要的代码复制过来,不是眉毛胡子一把抓。按说,以Java的思想,静态链接不是很必要,
原创
1494阅读
0评论
0点赞
发布博客于 13 年前

如何在不支持上传文件的论坛上传文件

如何在不支持上传文件的论坛上传文件要达成这个目标,有个前提条件是这个论坛要能上传图片。常用的图片格式一般为JPEG,这种格式是以FFD9作为文件结束标志的,至于这之后存了什么,就不管了,因此我们可以把我们要上传的文件附加在这后面,同时也不影响这张图片的显示。BMP格式也是可以这样的,因为这种格式里有一个位置是保存文件大小的,在确定的大小后面是什么也不管。推广之,所有带文件结束标志或者相当于有文
原创
3052阅读
2评论
0点赞
发布博客于 15 年前

系统托盘气泡提示和上下文(右键)菜单

系统托盘气泡提示和上下文(右键)菜单WTL嵌入类的架构可以使整个程序很清晰,系统托盘气泡提示、上下文菜单处理可以分别独立出来,以下是实现代码,很清晰就不注释了。基本上这两个类很少需要修改,因此我把它们放到了系统包含文件搜索路径中。//ContextMenu.h#pragma oncetemplate class CContextMenu{public:      
原创
2920阅读
2评论
0点赞
发布博客于 15 年前

准备工作——修改向导添加WinSock支持

要想使用WinSock必须在调用前加载相应的DLL,通常是调用WSAStartup来完成,这个函数一般放在WinMain,然后在程序结束的时候调用WSACleanup(其实不调用也行,不过“那就不符合WinSock规范”了),还需要链接ws2_32.lib。虽然不是很麻烦,考虑到以后我们要写得此类程序还很多,每次都要做如此乏味的事情也很让人不爽。所以,我们要让向导来为我们做这项工作,并且你将同时学
原创
1686阅读
0评论
0点赞
发布博客于 15 年前

Windows网络编程简易上手重写计划

首先很抱歉真正应了我写在开头的“有足够的耐心”,我已经很久没更新这个分类了。倒不是没写什么,这段时间我也写了完成端口的例程,只是整个程序看起来很混乱,实在没什么心情再给别人讲。这个系列处于停顿主要也是因为这个。由于用嵌入类来编写任务栏提示的类,让我认识到了WTL的架构的优越之处,当我的程序运行起来后,我觉得这实在是太神奇了。WTL广泛的使用了多重继承,在这里多重继承的语义不(只)是这个类属于某
原创
1810阅读
1评论
0点赞
发布博客于 15 年前

WTL for MFC Programmers, Part VIII - Property Sheets and Wizards

原作 :Michael Dunn [英文原文]翻译 :Orbit(桔皮干了) [http://www.winmsg.com/cn/orbit.htm]下载演示程序代码本章内容 介绍 WTL 的属性表类 CPropertySheetImpl 的方法 WTL 的属性页类
转载
1454阅读
0评论
0点赞
发布博客于 15 年前

WTL for MFC Programmers, Part VII - Splitter Windows

原作 :Michael Dunn [英文原文]翻译 :Orbit(桔皮干了) [http://www.winmsg.com/cn/orbit.htm]下载演示程序代码本章内容 介绍 WTL 的分隔窗口 相关的类 创建分隔窗口 基本的方法 数据成员
转载
1384阅读
0评论
0点赞
发布博客于 15 年前

WTL for MFC Programmers, Part VI - Hosting ActiveX Controls

原作 :Michael Dunn [英文原文]翻译 :Orbit(桔皮干了) [http://www.winmsg.com/cn/orbit.htm]下载演示程序代码本章内容 介绍 从使用向导开始 建立工程 自动生成的代码 使用资源编辑器添加控件 ATL中使用控件
转载
1386阅读
0评论
0点赞
发布博客于 15 年前

WTL for MFC Programmers, Part V - Advanced Dialog UI Classes

原作 :Michael Dunn [英文原文]翻译 :Orbit(桔皮干了) [http://www.winmsg.com/cn/orbit.htm]下载演示程序代码本章内容 第五章介绍 特别的自画和外观定制类 COwnerDraw CCustomDraw WTL的新控件
转载
1347阅读
0评论
0点赞
发布博客于 15 年前

WTL for MFC Programmers,Part IV - Dialogs and Controls

原作 :Michael Dunn [英文原文]翻译 :Orbit(桔皮干了) [http://www.winmsg.com/cn/orbit.htm]下载演示程序代码本章内容 介绍 回顾一下ATL的对话框 通用控件的封装 用应用程序向导生成基于对话框的程序 使用控件的封装类 ATL 方式 1 - 连
转载
1273阅读
0评论
0点赞
发布博客于 15 年前

WTL for MFC Programmers, Part III - Toolbars and Status Bars

原作 :Michael Dunn [英文原文]翻译 :Orbit(桔皮干了) [http://www.winmsg.com/cn/orbit.htm]下载演示程序代码本章内容 介绍 主窗口的工具条和状态条(Toolbars和Status Bars) 向导为工具条和状态条生成的代码 CMainFrame 如何创建工具条和
转载
1182阅读
0评论
0点赞
发布博客于 15 年前

WTL向导的中文本地化

需要修改两个文件,/AppWiz/Files/Templates/../root.rc,/AppWiz/Files/Scripts/../default.js。当然,愿意全盘汉化的也可以修改/AppWiz/Files/HTML里面的HTML页面。注意到这些目录里都有一个1033的子目录,这就是语言区域为USEnglish对应的文件,我们要做的是复制一份,改名为2052,然后修改里面的上边提到的
原创
2280阅读
1评论
0点赞
发布博客于 15 年前

WTL for MFC Programmers, Part II - WTL GUI Base Classes

原作 :Michael Dunn [英文原文]翻译 :Orbit(桔皮干了) [http://www.winmsg.com/cn/orbit.htm]下载演示程序代码本章内容 对第二部分的介绍 WTL 的总体印象 开始写WTL程序 WTL 对消息映射链的增强 从WTL的应用程序生成向导能得到什么 使
转载
1084阅读
0评论
0点赞
发布博客于 15 年前

WTL for MFC Programmers, Part I - ATL GUI Classes

原作 :Michael Dunn [英文原文]翻译 :Orbit(桔皮干了) [http://www.winmsg.com/cn/orbit.htm]下载演示程序代码本章内容 README.TXT 对本系列文章的总体介绍 对第一章的简单介绍 ATL 背景知识 ATL 和 WTL的发展历史 A
转载
1255阅读
0评论
0点赞
发布博客于 15 年前

WTL for MFC Programmers, Chinese Version Prologue

我一直在寻找这样一个类库:他对Windows的窗口提供面向对象的封装,有灵活的消息响应机制和比较完备的界面框架解决方案,对标准控件提供简练实用的封装,支持操作系统的新特性,支持功能扩充和二次开发,有代码自动生成向导机制,生成的程序使用较少的系统资源,最后是有完全的代码支持和文档支持。你会说那就用MFC吧!是的,我一直使用MFC,但我对MFC已经越来越厌倦了。陈旧的类库使得它无法支持操作系统
转载
1189阅读
0评论
0点赞
发布博客于 15 年前

托盘编程全接触

一、托盘简介   所谓的“托盘”,在Windows系统界面中,指的就是下面任务条右侧,有系统时间等等的标志的那一部分。在程序最小化或挂起时,但有不希望占据任务栏的时候,就可以把程序放到托盘区。其实,托盘区的编程很简单,下面简要阐述一下子喽^_^   二、托盘编程相关函数   其实呢,把程序放到托盘上的本质就是先在托盘区绘制一个图标,然后把程序隐藏不见,再对托盘的图标进行消息处理,就可以了。   绘
转载
729阅读
0评论
0点赞
发布博客于 15 年前

第一章 UDP

UDP(User Datagram Protocol,用户数据报协议)具体是什么我不说了,随便Google、Baidu一下,或者到书店、图书馆都能找到详细的答案。我只是打个比方,UDP的通信方式就好像你看见张三,然后你就扯着脖子喊“张三”,张三听见后,回喊你“李四”,你们就这么互相扯着脖子喊话。不过,要是张三的耳朵有点背,你就得多喊两声;再或者,有座隔音墙,你就是喊破喉咙,张三也不会理你,你只能自
原创
2229阅读
1评论
0点赞
发布博客于 16 年前

如何正确的计算文件收发进度

学习Winsock编程,用TCP协议收发文件是必不可少的一个实践环节,而计算收发百分比的一行代码,很多人都写不对。假设我们用DWORD(unsigned long)来表示文件长度,则长度的最大值是232-1,也就是4GB。虽然Win32 API能够返回两个DWORD表示长度,但是为了简便,我们还是原意接收4GB的人为限制。以下我们的讨论基于这个前提。通常我们会使用一个DWORD表示length,一
原创
1028阅读
0评论
0点赞
发布博客于 16 年前

WTL中CString的使用问题

如果你按照说明定义_WTL_USE_CSTRING,然后包含atlmsic.h,就会出现CString定义不明的编译错误,其实就是编译器分不清你是用WTL::CString,还是ATL::CString。其实你跟本用不着用WTL::CString,它们根本上就是一样的。避免这类错误的方法就是在atlapp.h前面包含atlstr.h,这个文件里面定义的__ATLSTR_H__和_WTL_USE
原创
3820阅读
1评论
0点赞
发布博客于 16 年前

WTL向导生成的对话框程序中文乱码的解决

首先,选工程属性,把资源的属性改成“中文(中国)”,是不是一定要改,我不确定。最重要的是,把对话框的字体换成中文字体,比如宋体。并不需要改成Unicode程序。或者直接中文化向导模板,参阅我的文章。
原创
1610阅读
0评论
0点赞
发布博客于 16 年前

Windows网络编程简易上手——写在开始

写在开始最近开始看《Windows网络编程(第二版)》,应该说是本好书,要言不烦,并且很细致,不过也很厚。以前用过MFC的CSocket,虽然也没弄清楚它是怎么工作的,但是也能发发消息,收收文件,并且传送文件功能我是在CArchive上实现的,不是像现在的例程用上了send、receive等更初级的函数;厉害吧,至于效率吗,如你所想,也不会高,呵呵。好像现在很多人对MFC都不耐烦了,并且很多人都推
原创
1426阅读
0评论
0点赞
发布博客于 16 年前

Windows下的应用程序如何获得本机IP地址

看到一些例程,使用的是winsocket,实际上我们都知道ipconfig就能完成我们的要求。IP助手API提供了类似的功能,本文用到的是GetAdaptersInfo,具体参数意义可以查MSDN。例子如下://需要链接iphlpapi.lib#include #include #include void GetHostIP(CString& address){ ULONG len = 0; ad
原创
1878阅读
2评论
0点赞
发布博客于 16 年前

如何在VS.net2003下开发ARX2005

这是一个老问题,也是一个热门问题,我所能找到的解决方案都不够理想。简单的办法就是,把mfcs71.dll,mfc71.dll复制一份,改名叫mfcs70.dll,mfc70.dll,这样就能胡弄过编译器,但是,AutoCAD不能加载,当然,用arx命令不理会那个警告信息也是能加载的。可是这样总有点顾及,并且总得为用户考虑吧,反正这种总是要弹警告的东西我是不敢用。这不是由于我们李代桃僵造成的,不信你
原创
1216阅读
0评论
0点赞
发布博客于 16 年前

数据结构学习(C++)续——续篇后记

我觉得续篇的写作我很不负责任,越到后面越是如此,可能是我没有打算写的缘故,或者说是“心浮气躁”——写了几个月有点熬不住了,^_^。但也可能我只能写到这样,毕竟这部分离我们太远,至少和前边的“数据结构”相比是太远。有人说,查找和排序的算法已经非常成熟了,大师们穷尽脑汁也不可能带来“质的飞跃”了,而像我们这些等着“吸收前人劳动果实”的人,能全盘吸收就甚为不易,更不要说“完成前人所未完成”了。因此,
原创
2177阅读
2评论
0点赞
发布博客于 17 年前

数据结构学习(C++)续——查找(搜索)【2】

树型查找折半查找所需要的,有序的、可以随机存取的、顺序结构的限制,导致了排序的额外负担(如果是逐个添加,主要的负担是移动数据,此时是折半插入排序)。通过观察折半查找的过程,发现实际上mid是从判定树的根走到了叶子节点,而这棵判定树和有相同节点的完全二叉树的高度是相同的。链式结构的好处就是不用大量移动数据,自然的用链树来做查找结构应该是个好选择。在前面我们曾经写过一个BSTree类,这个类大
原创
2302阅读
1评论
0点赞
发布博客于 17 年前

数据结构学习(C++)续——排序【6】内部排序总结

基数排序本文后面将会提到,我觉得将其和前面的排序算法放在一起比较有些不伦不类。前面介绍了四类排序方法,每种都有基本型和改进型。对于内部排序,我们最关心的当然是速度,这也是为什么快排受欢迎的原因。考虑到快排的缺陷,有时候我们可能会用堆排或者希尔排序、归并排序。上面可能是选择排序方法最直接的思路了(我们的选择范围也不算广,就那几个翻过来调过去的,好一点的,综合一下搞一个“杂牌”),出于“赌徒”的思
原创
2210阅读
1评论
0点赞
发布博客于 17 年前

数据结构学习(C++)续——查找(搜索)【1】

相信每个人都曾感受过找东西的痛苦,大多数人也感受过计算机参与资料管理后所带来的便捷,而学过编程的也曾为了某个问题(比如实现“如果不存在则加入”这样的算法描述——排列组合算法的初级阶段)而实现过查找。在SGI-STL的stl_algo.h里面有这样一段代码:template inline _InputIter find(_InputIter __first, _InputIter __las
原创
1595阅读
0评论
0点赞
发布博客于 17 年前

数据结构学习(C++)续——排序【5】归并排序

【5】归并排序当初学习链表的时候,我们都曾经做过将两个有序链表合成一个有序链表的练习。那时我们就知道了归并的特点就是,将分段有序的序列合成整体有序的序列。在内部排序中,归并的地位并不十分重要,主要是因为附加的O(n)的储存空间;但是,归并却是外部排序的不二法门——我们只能用内排得到分段有序的序列,为了得到最后的有序序列,必须使用归并的方法。迭代的2路归并排序2路归并是最简单的,并且单纯
原创
2195阅读
0评论
0点赞
发布博客于 18 年前

数据结构学习(C++)续——排序【4】选择排序

【4】选择排序基本思想是:每次选出第i小的记录,放在第i个位置(i的起点是0,按此说法,第0小的记录实际上就是最小的,有点别扭,不管这么多了)。当i=N-1时就排完了。直接选择排序直选排序简单的再现了选择排序的基本思想,第一次寻找最小元素的代价是O(n),如果不做某种特殊处理,每次都使用最简单的寻找方法,自然的整个排序的时间复杂度就是O(n2)了。template void S
原创
1506阅读
0评论
0点赞
发布博客于 18 年前

数据结构学习(C++)续——排序【3】交换排序

【3】交换排序基本思想是:两两比较待排序记录的关键码,如果发生逆序,则交换之,直到所有对象都排好为止。起泡排序起泡排序是比较相邻的两个记录,逆序则交换。这样的做法导致小的关键码一层层的浮上来,因此得名。CSDN的论坛曾经讨论过“冒泡”和“起泡”是不是一个东西,看来这是翻译惹的祸,英文名都是Bubble Sort,具体写的时候可以正着排,也可以倒着排。(严版是从后往前排,殷版是从前往后排
原创
1408阅读
0评论
0点赞
发布博客于 18 年前

用Visual C++编写电子邮件程序

一、概述 本文主要讲述如何使用Visual C++用MAPI编写E-mail程序。MAPI是包含在Windows之中的,因此不需要安装其他额外的部件。MAPI有以下三种形式: SMAPI,Simple MAPI,简单的MAPI CMC,Common Messaging Calls,一般通讯调用 完整的MAPI SMAPI和CMC都包含在完整的MAPI中,当用户想执行一些高级操作,比如编
原创
2089阅读
0评论
0点赞
发布博客于 18 年前

数据结构学习(C++)续——排序【2】插入排序

基本思想是,每步将一个待排序的记录,按其关键码大小,插入到前面已经排好序的记录的适当位置,从头做到尾就可以了。直接插入排序template void InsertSort(T a[], int N, int& KCN, int& RMN){       KCN = 0; RMN = 0;      for (int i = 1; i        {        
原创
1502阅读
1评论
0点赞
发布博客于 18 年前

数据结构学习(C++)续——排序【1】测试程序

后面的例程,都是对数组的排序,使用静态链表的也适用于链表的排序。为简单起见,只对单关键码排序,并且最后的结果都是从头到尾按升序排列。下面是统一的测试程序:#include #include using namespace std;#include #include #include #include "InsertSort.h"#define random(num)
原创
1671阅读
0评论
0点赞
发布博客于 18 年前

数据结构学习(C++)——后记

这回真的是后记了,也就是到了这些文章结束的时候了。虽然还有排序和查找两大算法系没有讲,但是对于“数据结构”而言,上面应该是全部了。并且这些文章加在一起已经很长了,每次打开WORD来编辑,跳到末页总是不那么顺畅,是到了结束的时候了。对于那两大算法系,我准备另外再开一个系列,姑且就叫做《数据结构学习(C++)续》吧。突然发现,在安排文章结构上不知不觉的受了《计算机编程艺术》的影响了。我的参考书主要
原创
2286阅读
2评论
0点赞
发布博客于 18 年前

数据结构学习(C++)——图【5】活动网络(AOV、AOE)

这部分是和工程相关的,也就是说,当AOV、AOE很复杂的时候,才能显示出这部分的价值——简单的话,手工都要比程序快,输入数据那段时间手工结果就出来了。我也没什么例子好举,总给我一种没底气的感觉,勉为其难的把程序写完就算完事吧。和前边的相比,这部分专业了一点,换而言之,不是每个人都感兴趣,不想看就跳过去吧。准备工作活动网络主要有两个算法,拓扑排序和求关键路径,后者以前者为基础。仿照上篇,另外
原创
2493阅读
0评论
0点赞
发布博客于 18 年前

数据结构学习(C++)——图(总结)

以上就是现在的教科书里面,图的全部内容了。写完之后,茫茫然,不知道学完之后有什么用……就像我在开篇写的,图的应用太广泛了,以至于现在觉得图“没什么用”——很奇怪的逻辑,只有仔细体味才能觉察到写教科书的人的无奈。不同于前面的链表和树,在图这里,储存方法不是重点,我们更多的注意力放在了算法上。我在写程序的时候,也尽量做到了算法和储存方法无关。然而算法实际上就是现实问题的抽象,如果我们的常识所不及,
原创
5204阅读
3评论
0点赞
发布博客于 18 年前

数据结构学习(C++)——图【4】(最短路径)

最短路径恐怕是图的各种算法中最能吸引初学者眼球的了——在地图上找一条最短的路或许每个人都曾经尝试过。下面我们用计算机来完成我们曾经的“愿望”。在图的算法中有个有趣的现象,就是问题的规模越大,算法就越简单。图是个复杂的结构,对于一个特定问题,求解特定顶点的结果都会受到其他顶点的影响——就好比一堆互相碰撞的球体,要求解特定球体的状态,就必须考虑其他球体的状态。既然每个顶点都要扫描,如果对所有的顶点
原创
8022阅读
1评论
0点赞
发布博客于 18 年前

数据结构学习(C++)——图【3】(无向图)(下)

最小生成树说人是最难伺候的,真是一点不假。上面刚刚为了“提高可靠性”添加了几条多余的边,这会儿又来想办法怎么能以最小的代价把所有的顶点都连起来。可能正是人的这种精神才使得人类能够进步吧——看着现在3GHz的CPU真是眼红啊,我还在受500MHz的煎熬,然后再想想8086……正如图的基本元素是顶点和边,从这两个方向出发,就能得到两个算法——Kruskal算法(从边出发)、Prim算法(从顶点
原创
1823阅读
0评论
0点赞
发布博客于 18 年前

数据结构学习(C++)——图【3】(无向图)(上)

要是在纸上随便画画,或者只是对图做点示范性的说明,大多数人都会选择无向图。然而在计算机中,无向图却是按照有向图的方法来储存的——存两条有向边。实际上,当我们说到无向的时候,只是忽略方向——在纸上画一条线,难不成那线“嗖”的就出现了,不是从一头到另一头画出来的?无向图有几个特有的概念,连通分量、关节点、最小生成树。下面将分别介绍,在此之前,先完成无向图类的基本操作。无向图类templat
原创
1734阅读
0评论
0点赞
发布博客于 18 年前

数据结构学习(C++)——图【1】(基本储存方法)

首先告诉大家一个好消息,数据结构到这里就要结束了!然后再来一个坏消息,这里是数据结构中“最没有意义”的部分和最难的部分。图的应用恐怕是所有结构中最宽泛的了,但这也注定了在讲“数据结构的图”的时候没什么好讲的——关于图的最重要的是算法,而且相当的一部分都是很专业的,一般的人几乎不会接触到;相对而言,结构就显得分量很轻。你可以看到关于图中元素的操作很少,远没有单链表那里列出的一大堆“接口”。——一个结
原创
1903阅读
0评论
0点赞
发布博客于 18 年前

数据结构学习(C++)——图【2】(DFS和BFS)

对于非线性的结构,遍历都会首先成为一个问题。和二叉树的遍历一样,图也有深度优先搜索(DFS)和广度优先搜索(BFS)两种。不同的是,图中每个顶点没有了祖先和子孙的关系,因此,前序、中序、后序不再有意义了。仿照二叉树的遍历,很容易就能完成DFS和BFS,只是要注意图中可能有回路,因此,必须对访问过的顶点做标记。最基本的有向带权网#ifndef Graph_H#define Graph_H
原创
2437阅读
0评论
0点赞
发布博客于 18 年前

数据结构学习(C++)——树(总结)

才刚开了个头,就要说再见了——在树这里,除了二叉树,别的都还没有讲。为什么可以总结了呢?因为前面已经涉及到了树的两个基本用途,而如果再讲B+、B-,就不能不提到搜索,如果是胜者树就不能不提到排序。为此,把这部分放到后面。我前面所做的努力,只是让你有个基本概念,什么时候记得用树。树的两个基本用途,可以用物质和精神来比喻。一个用途是做为数据储存,储存具有树结构的数据——目录、族谱等等。为了在实
原创
2012阅读
0评论
0点赞
发布博客于 18 年前

数据结构学习(C++)——平衡二叉树(AVL树)【1】 ——请孟岩审

    这个恐怕是整个《数据结构》教科书里面最难的和最“没用”的数据结构了(现在的教科书还有部分算法内容)。说它没用,恰恰是因为它太有用——有着和普通的二叉搜索树完全一样的接口界面,绝大多数情况下比普通的二叉搜索树效率高(很多)。因此,通常情况下,人们都是一劳永逸的——写完后就重用,而不会再写了。所以说,你虽然学完了平衡二叉树,但很可能你永远也不会亲自写一个。你现在随便在身边拉个人,让他来写一个,
原创
16660阅读
13评论
0点赞
发布博客于 18 年前

数据结构学习(C++)——平衡二叉树(AVL树)【2】

平衡化    显然的,平衡化后的子树应该是平衡的,以此为原则,很容易得知在各种情况下应该怎么旋转。private:       void L_Balance(BTNode* &p)       {              if (p->right->bf == 1) R_Rotate(p->right);             L_Rotate(p); current
原创
7123阅读
13评论
0点赞
发布博客于 18 年前

数据结构学习(C++)——二叉树【2】

线索化二叉树这是数据结构课程里第一个碰到的难点,不知道你是不是这样看,反正我当初是费了不少脑细胞——当然,恼人的矩阵压缩和相关的加法乘法运算不在考虑之列。我费了不少脑细胞是因为思考:他们干什么呢?很欣喜的看到在这本黄皮书上,这章被打了*号,虽然我不确定作者是不是跟我一个想法——线索化二叉树在现在的PC上是毫无用处的!——不知我做了这个结论是不是会被人骂死,^_^。为了证明这个结论,我们来看
原创
2121阅读
2评论
0点赞
发布博客于 18 年前

数据结构学习(C++)——二叉树【3】

递归遍历与非递归遍历前面写过一些关于递归的文章,因为那时还没有写到树,因此也举不出更有说服力的例子,只是阐述了“递归是一种思想”,正像网友评价的,“一篇入门的文章”。但只要能能让你建立“递归是一种思想”这个观念,我的努力就没有白费。现在,讲完了二叉搜索树,终于有了能说明问题的例子了。按照前面提供的代码,应该能调试通过下面的程序。#include using namespace std;
原创
1812阅读
1评论
0点赞
发布博客于 18 年前

数据结构学习(C++)——二叉树【1】

这些天参与了CSDN论坛的讨论,改变了我以前的一些看法。回头看我以前的东西,我虽对这本书很不满,但我还是按照它的安排在一点点的写;这样就导致了,我过多的在意书中的偏漏,我写的更多是说“这本书怎样”,而偏离了我写这些的初衷——给正在学习数据结构的人一些帮助。正像我在前面所说的,虽然现有的教科书都不是很合理,但如果仅仅是抱怨这点,那无异于泼妇骂街。虽然本人的水平连初级都够不上,但至少先从我做一点尝试,
原创
2548阅读
0评论
0点赞
发布博客于 18 年前

数据结构学习(C++)——递归【3】(1)

迷宫关于迷宫,有一个引人入胜的希腊神话,这也是为什么现今每当人们提到这个问题,总是兴致勃勃(对于年青人,估计是RPG玩多了),正如虽然九宫图连小学生都能做出来,我们总是自豪的说那叫“洛书”。这个神话我不复述了,有兴趣的可以在搜索引擎上输入“希腊神话 迷宫”,就能找到很多的介绍。迷宫的神话讲述了一位英雄如何靠着“线团”杀死了牛头怪(玩过《英雄无敌》的朋友一定知道要想造牛头怪,就必须建迷宫,也
原创
1216阅读
0评论
0点赞
发布博客于 18 年前

数据结构学习(C++)——递归【1】

按照黄皮书的安排,到了该讲递归的时候了。上网查了查,关于“递归”的文章可以说“汗牛充栋”——请原谅我在这里犯酸,我的意思是,写别人都写臭的东西让大家看,只是浪费大家的时间,所以我下面的东西应该是一些至少我看起来是新的东西,如果觉得有什么不清楚的,请参阅相关的文章(太多了)。即使这样,这篇文章还是不能把我想说的写完,看来我这人真的有废话的习惯。看过这样一道题,问,“程序结构化设计的三种基础结构,
原创
3009阅读
0评论
0点赞
发布博客于 18 年前

数据结构学习(C++)——递归【2】(1)

汉诺塔的非递归解法(真的很抱歉,由于CSDN能贴的长度有限,所以分成了4部分,让您麻烦了。——我用表格拼成的盘子,导致HTML代码数量激增,虽然看起来不长,但是实际上相当的长。)似乎这个问题的最佳解法就是递归,如果你想用栈来消解掉递归达到形式上的消除递归,你还是在使用递归的思想,因此,他本质上还是一个递归的算法。我们这本黄皮书在谈论到“什么情况使用递归”的时候,在“3.问题的解法是递归的”
原创
1519阅读
1评论
0点赞
发布博客于 18 年前

数据结构学习(C++)——递归【2】(2)

                                      
原创
1099阅读
0评论
0点赞
发布博客于 18 年前

数据结构学习(C++)——递归【2】(3)

                            1         
原创
997阅读
0评论
0点赞
发布博客于 18 年前

数据结构学习(C++)——递归【2】(4)

#include #include using namespace std;class Needle{public:       Needle() { a.push_back(100); }//每一个柱子都有一个底座       void push(int n) { a.push_back(n); }       int top() { return a.back(
原创
987阅读
0评论
0点赞
发布博客于 18 年前

数据结构学习(C++)——线性链式结构总结(代后记)【2】

在开始写这些文章之前,我曾经有个想法,能不能以单链表为基础,完成所有的线性链式结构?实践证明,是可以的,就像你看到的这样。我做这个尝试的起因是,看不惯现在教科书凌乱的结构:罗列了一大堆ADT或者是templat class,好像这些都要你去记似的。殊不知,只有提取共性,突出个性,才能更明显的表现出各种数据结构的差异,显示数据结构的进化发展的过程,看出变化的内在需求。借用《C++沉思录》作者的一句话
原创
1146阅读
0评论
0点赞
发布博客于 18 年前

如何在一个容器中放入不同对象(续)

上一次,用多态解决了这个问题,对自己转换指针类型的做法仅仅提到了一下。后来想想,这种讲解不令人满意,因为,用多态解决的前提是,想放入的多个对象必须派生自同一个基类,必须有统一的接口。这也说明了,为什么在面向对象的设计中必须有一个公有的基类,任何类必须由它派生,哪怕你仅仅写一个“Hello World”。太死板了,不是吗?但是,任何人都有考虑不周的时候,假设现在你的程序写了一半了,突然发现,你需
原创
933阅读
0评论
0点赞
发布博客于 18 年前

数据结构学习(C++)——线性链式结构总结(代后记)【1】

看到这个标题,有些人一定松了一口气——这小子可算白话完了,当然了,你要是略有惋惜之情,我真是受宠若惊。但不论你怎么想,写到这里只是告一段落,并没有完,后面还有很大一部分呢,比如树、图、查找、排序——这么多年了,还是这点东西。代后记的意思是,我觉得对前面线性链式结构的总结,对后面的学习有指导意义:从前面的学习中,你能得出如何学习数据结构,以及如何正确看待这门课——如果你能从重复建设中看到这样做的价值
原创
960阅读
0评论
0点赞
发布博客于 18 年前

代码优化试验——短循环优化(上)

上次比较队列性能,SGI-STL比我的高了一倍还多(是我的2.3倍,还是夹杂在一堆别的代码中的,估计实际上3倍都挡不住),于是下决心改善代码质量。但这需要不断的积累,现在只能一点点的来——哎,什么时候才能看见大师的背影呢。就从短循环开始吧,这个对CPU的开销是非常大的,而程序中出现的几率比较大,因此,对其的优化,能带来效率的大幅提升。为了说明问题,做了如下的测试:(我把我写的Timer.h拷到In
原创
736阅读
0评论
0点赞
发布博客于 18 年前

代码优化试验——短循环优化(下)

测试程序2#include #include void sum4(){       int j = 0;       for (unsigned i = 1; i        {              j += i++;              j += i++;              j += i++;              j +=
原创
731阅读
0评论
0点赞
发布博客于 18 年前

数据结构学习(C++)——栈和队列(定义和实现)

栈和队列是操作受限的线性表,好像每本讲数据结构的数都是这么说的。有些书按照这个思路给出了定义和实现;但是很遗憾,这本书没有这样做,所以,原书中的做法是重复建设,这或许可以用不是一个人写的这样的理由来开脱。顺序表示的栈和队列,必须预先分配空间,并且空间大小受限,使用起来限制比较多。而且,由于限定存取位置,顺序表示的随机存取的优点就没有了,所以,链式结构应该是首选。栈的定义和实现#ifnd
原创
1908阅读
1评论
0点赞
发布博客于 18 年前

数据结构学习(C++)——稀疏矩阵(十字链表【2】)

如果你细想想,就会发现,非零元节点如果没有指示位置的域,那么做加法和乘法时,为了确定节点的位置,每次都要遍历行和列的链表。因此,为了运算效率,这个域是必须的。为了看出十字链表和单链表的差异,我从单链表派生出十字链表,这需要先定义一种新的结构,如下:class MatNode{public:       int data;       int row, col;      
原创
2219阅读
1评论
0点赞
发布博客于 18 年前

数据结构学习(C++)——栈应用(表达式求值)

栈的应用很广泛,原书只讲解了表达式求值,那我也就只写这些。其实,栈的最大的用途是解决回溯问题,这也包含了消解递归;而当你用栈解决回溯问题成了习惯的时候,你就很少想到用递归了,比如迷宫求解。另外,人的习惯也是先入为主的,比如树的遍历,从学的那天开始,就是递归算法,虽然书上也教了用栈实现的方法,但应用的时候,你首先想到的还是递归;当然了,如果语言本身不支持递归(如BASIC),那栈就是唯一的选择了——
原创
1725阅读
0评论
0点赞
发布博客于 18 年前

数据结构学习(C++)——队列应用(事件驱动模拟)

我看的两本教科书(《数据结构(C语言版)》还有这本黄皮书)都是以这个讲解队列应用的,而且都是银行营业模拟(太没新意了)。细比较,这两本书模拟的银行营业的方式还是不同的。1997版的《数据结构(C语言版)》的银行还是老式的营业模式(毕竟是1997年的事了),现在的很多地方还是这种营业模式——几个窗口同时排队。这种方式其实不太合理,经常会出现先来的还没有后来的先办理业务(常常前面一个人磨磨蹭蹭,别的队
原创
1051阅读
1评论
0点赞
发布博客于 18 年前

浅谈指针

此文仅适合初学C语言的朋友,凡是学了几个月以上的不要对此文内容嗤之以鼻。C语言最具特色的是什么?指针。这个答案好像是公论,无论高手还是低手,菜鸟还是老鸟,学过的还是没学过的,但凡是听说过C的,都能回答出来。正是因为C引入了指针的概念,使得他是最接近机器真实模型的高级语言,以至于得到了“中级语言”的称号;象我这样有时候汇编比C用的还多的人体会的更深——单片机编程,我只会汇编,虽然现在开始学C,还
原创
720阅读
0评论
0点赞
发布博客于 18 年前

数据结构学习(C++)——稀疏矩阵(十字链表【1】)

先说说什么叫稀疏矩阵。你说,这个问题很简单吗,那你一定不知道中国学术界的嘴皮子仗,对一个字眼的“抠”将会导致两种相反的结论。这是清华2000年的一道考研题:“表示一个有1000个顶点,1000条边的有向图的邻接矩阵有多少个矩阵元素?是否稀疏矩阵?”如果你是个喜欢研究出题者心理活动的人,你可以看出这里有两个陷阱,就是让明明会的人答错,我不想说出是什么,留给读者思考。姑且不论清华给的标准答案是什么,那
原创
2159阅读
0评论
0点赞
发布博客于 18 年前

数据结构学习(C++)——单链表(定义与实现)

节点类#ifndef Node_H#define Node_H template class Node    //单链节点类{public:       Type data;       Node *link;       Node() : data(Type()), link(NULL) {}               Node(const Typ
原创
2766阅读
0评论
0点赞
发布博客于 18 年前

数据结构学习(C++)——单链表应用(一元多项式【1】)

总算到了这里,这时,你会很得意的说,辛辛苦苦学的单链表总算知道能干点什么了。但是很不幸,如果你和我一样看的是那本书,到这里,你可能比学双向链表时还要痛苦。如果你是按照书上的介绍一步一步做到这里,你能把书上的多项式加法函数调试出来,我对你致以十二分的敬意。说到这里,我想起来我发单链表的时候,有人给我建议说:最好把链表和链表位置这两个分开。没错,C++标准库是这么做的,而我也不是什么专家,也不能证
原创
3511阅读
0评论
0点赞
发布博客于 18 年前

数据结构学习(C++)——单链表应用(一元多项式【2】)

按照原书的安排,对多项式的讲解到上一篇就应该结束了,但我还想做一些延伸。比如说,你很清楚多项式的系数肯定不总是整数,但为什么用整型呢?我看到原书用的是整型,我也有这个疑问。但是,一旦动起手来,就会发现改成浮点不仅仅只是在定义Term时把int coef;改成float coef;很多的细节都要考虑到(给个提示,你知道浮点零是多少吗)。我试了一下,最后放弃了;理由是,写这些只是为了学习,没必要搞的那
原创
2129阅读
0评论
0点赞
发布博客于 18 年前

数据结构学习(C++)——双向链表

原书这部分内容很多,至少相对于循环链表是很多。相信当你把单链表的指针域搞清楚后,这部分应该难不倒你。现在我的问题是,能不能从单链表派生出双向链表?你可以有几种做法:一种就是先定义一个双链节点——但是,它的名字必须叫Node,这是没办法的事;不然你就只好拷贝一份单链表的实现文件,把其中的Node全都替换成你的双链节点名字,但是这就不叫继承了。另一种做法就是先定义一种结构例如这样的:t
原创
1465阅读
0评论
0点赞
发布博客于 18 年前

数据结构学习(C++)——循环链表

原书对循环链表的介绍很简略,实现部分也不完整(当然了,如果完整就又是重复建设)。而我也没觉得循环链表有什么别的用,他更应该是为了一个特殊的问题而产生的,这只是个人的看法。我从链表类派生出了循环链表,这需要注意几个细节。1.        构造函数:派生类实例化时,先调用基类的构造函数;因此,初始化循环链表的工作就是将带表头的空链表的表头节点的link指向表头节点,从而构成一个圈。2.   
原创
1821阅读
0评论
0点赞
发布博客于 18 年前

数据结构学习(C++)——如何在一个链表中链入不同类型的对象

似乎你也注意到了,不管怎么定义,好像一个链表中的对象都是同一类型的。而实际上,这也是必须的,否则,返回节点中的数据这样的函数的返回值的类型是什么呢?但是,人的要求是无止境的……(省略本人感慨若干百字)。把不同的对象链在一个链表中的目的是为了方便使用,现在一定记住这个原则,后面的讨论都是基于这个原则的,否则,我们就是技术狂人了——偏偏实现一些看起来不可能的事情。达到这个目标的原理其实很简单,只要
原创
2054阅读
2评论
0点赞
发布博客于 18 年前

字符串指针与字符数组

很多刚从C转C++的人都不明白,在C中这样的代码char *pChar="hELLO!";   //定义字符指针pChar,指向一个字符数组首元素即h*pChar=H;             //问题所在行到了C++中怎么就不行了?你翻遍参考书,都会说,pChar指向的是常量,怎么能允许改变呢?你又问了,怎么我在C中运行的好好的?没人回答你。于是,你只好自我安慰,这就是C++的保
原创
1147阅读
0评论
0点赞
发布博客于 18 年前

数据结构学习(C++)——序言

题外话:先前有一篇文章叫《用C++模板描述的链表、栈、队列(声明与实现)》,当时是第一次发表文章(我才注册没几天),很不成熟,改了又改不说,还弄的老长,不利于阅读。于是我重写了一下,并且想做成一个系列,这从我的标题可以看出来。好,言归正传。本篇为后面一系列文章的序言,旨在说明写作的目的,以及写作的风格;或者说是为自己可能的错误,预先给个托词。如果您不想听我在这废话,请跳过本篇,直接阅读后面的文
原创
1842阅读
0评论
0点赞
发布博客于 18 年前