2013年6月19日
摘要: 二叉树的遍历分为前序遍历、中序遍历、后序遍历和层次遍历四种,下面分别进行简要的阐述并用C++实现:(1)前序遍历前序遍历首先访问结点,然后访问其左右子树,如果使用递归算法,那么具体的实现如下: 1 template<class T> 2 void Tree<T>::PreOrder(TreeNode<T>* root) 3 { 4 if(root != NULL) 5 { 6 cout<<root->data<<endl; 7 PreOrder(root->leftChild); 8 PreOrder(root->r 阅读全文
posted @ 2013-06-19 15:56 Sophia-呵呵小猪 阅读(242) 评论(0) 推荐(0) 编辑
摘要: 为了表示二叉树,定义两个类:TreeNode和Tree,其中TreeNode class是对结点信息的抽象,它包括结点的数据域和分别指向左子树和右子树的指针域;Tree class是对二叉树的抽象,一个二叉树由一个根结点确定,所以其成员变量为一个根结点指针,此外它也抽象了二叉树的各种操作,包括二叉树的遍历等。它的C++基本实现如下:TreeNode class: 1 /* TreeNode.h */ 2 #ifndef TREENODE_H 3 #define TREENODE_H 4 5 template<class T> class Tree; 6 7 template< 阅读全文
posted @ 2013-06-19 14:50 Sophia-呵呵小猪 阅读(307) 评论(0) 推荐(0) 编辑
摘要: 二叉树为什么那么重要?因为使用二叉树可以使查找与用数组查找一样快,同时在二叉树中添加、删除又能像链表中一样高效,因而掌握二叉树的相关知识是非常重要的。(1)二叉树的递归定义二叉树或者是一棵空树,或者是一棵由一个根节点和两棵互不相交的分别称作根节点的左子树和右子树所组成的非空树,左子树和右子树分别是一棵二叉树。结点的度:结点所拥有的子树的个数称为该结点的度;结点的层次:规定树的根节点的层数为1,其余结点的层数等于它的双亲结点的层数加1;树的深度:树中所有结点的最大层数称为树的深度;树的度:树中各结点度的最大值称为该树的度;满二叉树:所有分支结点都存在左子树和右子树,所有叶子结点都在同一层上,这样 阅读全文
posted @ 2013-06-19 14:18 Sophia-呵呵小猪 阅读(326) 评论(0) 推荐(0) 编辑
  2013年6月18日
摘要: (7)检测一个单链表是否有环单链表有环表示链表中的某个结点指向其前的某个结点从而构成一个环形,若要检测一个链表中是否有环,可以有以下三种方法:a. 指针数组:所谓指针数组,是指用一个数组存放指针变量。这个思路是在遍历单链表的过程中,将已经遍历的结点放到一个足够大的数组中,然后将当前结点与指针数组中的结点比较,如果已经存在说明单链表中存在环,如果遍历到最后一个结点时还没有得到重复的结点,说明单链表中没有环。b. 快慢指针:使用两个指针遍历单链表,一个一次走两步的快指针和一个一次走一步的慢指针,快指针每走一次都与慢指针比较,如果二者相等,那么单链表有环,如果快指针走到单链表尾部,即NULL,那么说 阅读全文
posted @ 2013-06-18 22:04 Sophia-呵呵小猪 阅读(199) 评论(0) 推荐(0) 编辑
摘要: 1 template 2 void swap(myList list, ListNode* node1, ListNode* node2) 3 { 4 if(node1 == node2) 5 return; 6 if(node1->next == node2) 7 { 8 ListNode* prev = list.FindPrev(node1); 9 node1->next = node2->next;10 node2->next = node1;11 prev->next = nod... 阅读全文
posted @ 2013-06-18 13:56 Sophia-呵呵小猪 阅读(241) 评论(0) 推荐(0) 编辑
  2013年6月17日
摘要: 这里以单链表为例阐述如何用C++实现表的基本表示:1)表的结构单链表的每一个结点都是由一个任意数据类型的元素和一个指向下一个元素的指针构成的,如下:通过开始结点A0可以访问整个表元素,最后的一个结点的指针为NULL。2)引入表头结点在实现中,为了实现对各个结点的处理的一致性,引入了一个头结点,头结点是指向链表开始结点A0的结点,这样一来链表的所有结点都有了前驱结点,开始结点(链表实际结点的第一个结点)的插入和删除也就不会特别处理,对空表或非空表的处理也是一致的。引入头结点后的结构如下:其中头结点的数据域可以不保存任何数据信息或者保存如链表长度这样的数据,头结点的指针指向链表的开始结点。3)链表 阅读全文
posted @ 2013-06-17 16:12 Sophia-呵呵小猪 阅读(466) 评论(0) 推荐(0) 编辑
摘要: 数组和链表是两种不同的数据存储方式,数组的存储需要一段连续的内存空间,而链表的存储则不需要连续存放,它是通过指针链接各个结点构成一个表结构。链表又分为单链表、双链表、单项循环链表和双向循环链表,单链表中每一个结点只需要保存当前结点的数据和一个指向下一个元素的指针,而双链表还需要保存一个指向上一个元素和指针,循环链表则还需要尾结点中保存一个指向第一个结点的指针。具体的讲,数组和链表的区别主要体现在以下几个方面:1)逻辑结构数组在内存中是连续顺序存储的,使用前必须指定数组大小以便为其分配内存空间,大小固定不能动态改变。对数组插入需要分配新的连续内存空间然后移动所有的数据元素,删除同样需要移动删除元 阅读全文
posted @ 2013-06-17 14:34 Sophia-呵呵小猪 阅读(324) 评论(0) 推荐(0) 编辑
  2013年6月8日
摘要: (1)sizeof操作符的返回值类型size_tsizeof操作符的作用是返回一个对象或类型名的长度,返回值的类型是size_t。size_t是标准库中的类型,定义在cstddef头文件中,该文件是C标准库的头文件stddef.h的C++版本,它是一个与机器相关的unsigned类型,其大小足以保证存储内存中的对象的大小。(2)sizeof操作符的用法sizeof的结果是编译时常量,它的使用有三种形式:a. sizeof (type name)b. sizeof (expr)c. sizeof expr以上返回的结果都不是expr的值,而是expr的结果的类型的长度,因此,对于sizeof * 阅读全文
posted @ 2013-06-08 11:41 Sophia-呵呵小猪 阅读(307) 评论(0) 推荐(0) 编辑
  2013年6月7日
摘要: (1)函数指针的声明所谓函数指针是指指向函数而非对象的指针,这个指针所指向的函数的类型由返回类型和参数表确定,与函数名无关。例如:bool (*pf)(const string& a, const string& b);pf是一个指向函数的指针,该函数的形参是两个const string&类型的字符串,返回值是一个bool类型的值。需要注意的是上面的声明中不等价于下面的写法:bool *pf(const string& a, const string& b);因为上面是一个普通的函数声明,它的形参也是两个const string&类型的字符串,返 阅读全文
posted @ 2013-06-07 17:19 Sophia-呵呵小猪 阅读(255) 评论(0) 推荐(0) 编辑
  2013年6月6日
摘要: 在C++模板使用中,通常会用到<typename T>和<class T>两种方式来标识T参数的类型,二者是可以互换的,其主要差别是在含有嵌套从属类型名称(指代码中的某些类型存在依赖关系,比如某些类型需要依赖于参数T)时,需要考虑前缀typename::,否则C++解析时未必会将之后的字符串当做一个类型,或者会将其看做一个变量名称等,例如:template<typename C>void print(C& container){ C::const_iterator* x;}上述代码中C::c onst_iterator未必会被编译器当做一个类型看待, 阅读全文
posted @ 2013-06-06 10:55 Sophia-呵呵小猪 阅读(249) 评论(0) 推荐(0) 编辑