c/c++
文章平均质量分 53
xyz-x
学无止境
展开
-
二叉树中两个节点的最近公共祖先节点
题目:求二叉树中两个节点的最近公共祖先节点一、该二叉树为搜索二叉树搜索二叉树的特点:任意一个节点的左子树的所有节点值都比该节点的值小,其右子树的所有节点值都比该节点的值大。解决该问题方法:从树的根节点开始和两个节点作比较,如果当前节点的值比两个节点的值都大,则这两个节点的最近公共祖先节点一定在该节点的左子树中,则下一步遍历当前节点的左子树;如果当前节点的值比两个节点的值都小原创 2016-08-04 23:43:47 · 53468 阅读 · 11 评论 -
实现日期类
题目:实现一个日期类,主要实现日期计算功能:日期+天数=日期;日期-天数=日期;日期-日期=天数;要实现该日期类,必须熟练掌握运算符重载的概念和实现方法。以下是编写的一个日期类: 头文件:#ifndef __DATE_H__#define __DATE_H__#includeusing namespace std;class Date{public: Date(int year =原创 2016-04-11 20:04:16 · 303 阅读 · 0 评论 -
c++实现复数类
主要是练习用运算符重载实现复数的一些基本运算,包括:复数加法(重载的运算符:+、+=、前置++、后置++);复数减法(重载的运算符:-、-=、前置--、后置--);复数乘法(重载的运算符:*、*=、);复数除法(重载的运算符:/、/=、);代码如下:#includeusing namespace std;class Complex{public: Complex(float real =原创 2016-04-11 20:04:13 · 1450 阅读 · 0 评论 -
用结构体数组实现通讯录
课题:实现一个通讯录可以用来存储1000个人的信息,每个人的信息包括:姓名、性别、年龄、电话、住址 该通讯录可以提供以下功能:1. 添加联系人信息2. 删除指定联系人信息3. 查找指定联系人信息4. 修改指定联系人信息5. 显示所有联系人信息6. 清空所有联系人7. 以名字排序所有联系人分析:首先我们可以定义出存储每个人的信息的结构体以及存储1000个联系人的结构数组。由于实现过程中我们需要知道联原创 2016-04-11 20:03:57 · 1060 阅读 · 0 评论 -
用冒泡排序的方法模拟实现qsort函数
分析:用冒泡排序的方法实现快速排序主要是用回调函数的知识,我们知道库函数中qsort的函数原型是: void qsort( void *base, size_t num, size_t width, int (__cdecl *compare )(const void *elem1, const void *elem2 ) );函数原型中qsort函数有四个参数,分别为base:是指目标数组的开始原创 2016-04-11 20:03:54 · 428 阅读 · 0 评论 -
用冒泡排序—整数序列、字符串序列
分析:冒泡排序原理:如果升序排序,将一组整数序列的第一个元素和第二个元素相比较,如果第一个元素大于第二个元素,那么交换这两个元素,如果不满足条件就不交换;然后将第二个元素和第三个元素比较,直到和最后一个元素和它前面的一个元素比较后,第一次排序完成,最大的一个数在最后。最多排序n-1次(设有n个元素),就可排序完成。过程如下图: 650) this.width=650;" style="width:原创 2016-04-11 20:03:51 · 1218 阅读 · 0 评论 -
一些常用函数模拟实现
我们库函数中提供给我们很多函数,我们虽然不需要自己去实现这些函数,但是我认为自己亲自去实现一下这些函数对我们有很大的好处。我们可以根据自己的想法实现这些函数的功能,然后再看一下库里面是怎么实现它们的,比较一下,看看函数的实现方式的异同之处,这样我们可以找出自己的不足之处,学习库函数的实现思维,帮助我们提升编程能力。下面是一些函数的实现: strstr函数的实现:char *my_strstr(co原创 2016-04-11 20:03:48 · 586 阅读 · 0 评论 -
用三种方法实现strlen函数
实现strlen函数有三种方法:一、计数器的方法二、递归的方法三、指针减指针的方法下面是三种方法的实现:计数器的方法:int my_strlen(const char *str){ assert(str); //对指向字符串指针的断言 int count = 0; while (*str) { count++; str++; } return coun原创 2016-04-11 20:03:46 · 791 阅读 · 1 评论 -
打印1到最大的n位数
打印1到最大的n位数即是:若n=1,则打印1到最大的一位数即是1,2,3,4,5,6,7,8,9;若n=2,那么打印1到最大的两位数1到99;虽然我们可以直接用printf输出,但是当n很大的时候,用整型和长整型都会溢出。为了表示一个大数字我们可以用数组或者字符串来表示,下面是用字符串解决大数的问题。分析:1.首先我们需要一个长度为n+1的字符串,用来表示数字的每一位。字符串的最后一个是'\0';原创 2016-04-11 20:03:43 · 416 阅读 · 0 评论 -
用可变参数列表模拟实现printf函数
用可变参数列表实现printf函数要实现printf函数,我们首先应该获取printf函数中由双引号中的字符串,若遇到不是%的字符,我们应该直接将其输出,若遇到%,我们应该判断它后面是什么字符,这里先只考虑%c,%s的情况,如果是%c那么我们应该将读到的字符输出来,若为%s,应该将读到的字符串通过指针解引用的方式依次输出,如果是%d%f我们暂且将它当做普通字符输出。实现的代码如下:#include原创 2016-04-11 20:03:39 · 1400 阅读 · 0 评论 -
旋转数组的最小数字
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转,输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}是数组{1,2,3,4,5}的一个旋转,该数组的最小值为1。题目分析:我们可以通过旋转以后的数组中的元素的分布方式找出其中的一些规律:数组{3,4,5,1,2}中,最左边的数字(3)大于最右边的数字(2),由于原数组是递增排序的,所以左边的原创 2016-04-11 20:04:19 · 295 阅读 · 0 评论 -
模拟new[]和delete[]操作符开辟内存空间及释放内存空间过程
在上一篇博客里我们知道了new[]和delete[]开辟空间和释放空间时过程,那么我们可不可以模拟实现一下它们的开辟内存和释放内存的过程呢?下面是我模拟new[]和delete[]的实现过程:650) this.width=650;" title="图片1.png" src="http://s5.51cto.com/wyfs02/M01/7C/F3/wKiom1bdHZ7hIvycAAAYY2bh原创 2016-04-11 20:04:24 · 589 阅读 · 1 评论 -
string类的两种实现方法及string的一些成员函数的实现
string的第一种实现方法:#includeusing namespace std;class String{public: String(char *str="")//构造函数 :_str(new char[strlen(str)+1]) { strcpy(_str, str); } String(const St原创 2016-04-11 20:04:27 · 1410 阅读 · 0 评论 -
二叉树的线索化
线索化意义:二叉树是非线性结构,遍历二叉树都是通过递归或者用栈辅助非递归来遍历的。如果我们知道一个节点的前驱和后继,那么我们就可直接遍历二叉树设置二叉树节点的前驱和后继,就是线索化二叉树,我们利用指向左右子树的空指针存放节点的前驱和后继线索化设计思路:遍历二叉树,当遍历到一个节点的左节点或右节点为空时,设置它的前驱和后继,那么访问时直接可根据节点的前驱和后继来进行访问代原创 2016-05-27 23:55:40 · 1423 阅读 · 0 评论 -
c++实现队列
队列的数据结构中一种特殊的线性表,特点是“先入先出,后入后出”,如下图:按照队列的特点我们可以自己实现队列,程序如下://Queue.hpp#pragma once#include#include#includeusing namespace std;templatestruct Node{ Node(const T& d) :_data(d) ,_next(原创 2016-04-13 18:44:21 · 758 阅读 · 0 评论 -
验证进栈出栈的合法性
题目:给两个序列,可以用数组来存储,一个数组存放进栈的顺序,一个数组存储出栈的顺序,要求检查这两个序列是否符合进栈和出栈匹配方法:(1)用一个辅助栈,将入栈序列的第一个元素压栈,看是否和出栈序列的第一个元素相等(2)相等则将辅助栈中的元素弹出,继续比较入栈序列的下一个元素和出栈序列的下一个元素是否相等,(3)若不想等则将继续将下一个入栈序列的元素压栈并且判断它是否与出栈序列的当原创 2016-04-16 23:36:46 · 991 阅读 · 0 评论 -
输出一个数的二进制数的奇数序列和偶数序列(三种方法)
一、#includeint main(){int a,i,j,m;int arr[32]={0};printf("输入一个整数:\n");scanf("%d",&a);printf("二进制数为:\n");for(i=0;i{m=a%2;j=a/2;a=j;arr[i]=m;}for(i=32;i>=0;i--){printf("%d",arr[i]);if(i%4==0)printf(" ");原创 2016-04-11 20:02:33 · 1445 阅读 · 0 评论 -
实现auto_ptr的两种方法
我们都知道,实现auto_ptr有两种方法:第一种方法:在上一篇博客中我已经实现了,主要思想是管理权转移。第二种方法:它是我们c++标准库中以前的一个版本,主要思想是在auto_ptr类中除了有一个指针的成员变量以外还有一个bool类型的成员变量_owner。构造函数中将_owner设为真,表示对象是指针所指向的内存的拥有者,当要赋值时(ap1=ap2),将ap1的_owner置为true,ap2原创 2016-04-11 20:04:44 · 2223 阅读 · 0 评论 -
模拟实现c++标准库和boost库中的智能指针
我们知道c++标准库中定义了智能指针auto_ptr,但是我们很少用它,因为虽然它能够自动回收动态开辟的内存,不需要程序员自己去维护动态开辟的内存,但是当用它去赋值或者是拷贝构造时有一个管理权转移的过程,这样我们就不能很方便的使用auto_ptr。下面是简单的auto_ptr的实现,我们可以看到在复制和赋值时它将转移管理权。templateclass AutoPtr{public:原创 2016-04-11 20:04:41 · 429 阅读 · 0 评论 -
c++模板实现双向链表
#include#includeusing namespace std;templatestruct Node{ Node(const T& d) :_data(d) ,_next(NULL) , _prev(NULL) {} T _data; Node* _next; Node* _原创 2016-04-11 20:04:38 · 405 阅读 · 0 评论 -
C++模板实现顺序表
#include#includeusing namespace std; templateclass SeqList{public: SeqList() :_size(0) , _capacity(0) { _CheckCapacity(); } void PushBack(const T& d);原创 2016-04-11 20:04:35 · 253 阅读 · 0 评论 -
string类的写时拷贝
由于浅拷贝使多个对象共用一块内存地址,调用析构函数时导致一块内存被多次释放,导致程序奔溃。实现string类的时候通常显示的定义拷贝构造函数和运算符重载函数。 由于释放内存空间,开辟内存空间时花费时间,因此,在我们在不需要写,只是读的时候就可以不用新开辟内存空间,就用浅拷贝的方式创建对象,当我们需要写的时候才去新开辟内存空间。这种方法就是写时拷贝。 650) this.width=650;" ti原创 2016-04-11 20:04:29 · 1424 阅读 · 0 评论 -
将一个字符串逆序(用递归实现不能使用库函数)
将两个字符串逆序可以设置两个指针,一个指向字符串首地址start,一个指向字符串末尾元素的地址(‘\0’前面的元素的地址)end,只要start实现代码如下:#include#includevoid reverse(char *str){ char tmp = 0; char *start; char *end; start = str;原创 2016-04-11 20:03:37 · 1854 阅读 · 0 评论 -
将两个矩阵相乘,A为x行y列的矩阵,B为y行z列的矩阵,A*B
m1*m2=m其中是一个x行z列的一个矩阵,例如代码如下: #includevoid matrix_multiply(int *m1, int *m2, int *m, int x, int y, int z){ int row = 0; //m矩阵的行 int col = 0; //m的列 int k = 0; int *m1p = m1; int *m2p = m2;原创 2016-04-11 20:03:34 · 1071 阅读 · 0 评论 -
检查机器是大端字节序还是小端字节序
#includeint check_sys(){ int a = 0x11223344; char *p = (char *)&a; if (*p == 0x11) return 1; if (*p==0x44) return 0;}int main(){ int ret; ret = check_sys(); if (ret == 1) printf("big\n"); if (ret =原创 2016-04-11 20:02:50 · 441 阅读 · 0 评论 -
a+aa+aaa+aaaa+aaaaa
#include int main(){ int num = 0; int count = 0; int sum = 0; scanf("%d%d", &num, &count); int i = 0; int tmp = num; for (i = 0; i { sum += num; num = num * 10 + tmp; } printf("%d\n", sum); sys原创 2016-04-11 20:02:47 · 780 阅读 · 0 评论 -
模拟密码登录
#include#include#include#includeint main(){ char *passwd = "abcde"; char input[10]; int i = 0; for (i = 0; i { printf("请输入密码:\n"); scanf("%s", input); if (strcmp(passwd, input) == 0) { printf("原创 2016-04-11 20:02:45 · 442 阅读 · 0 评论 -
可以一直接收键盘字符,并将大写转为小写,小写转为大写,数字不作处理
#includeint main(){ char ch; char ch1; while((ch=getchar()) != EOF) { if(ch>='a'&&ch { ch1=ch-32; putchar(ch1); continue; } if(ch>='A'&&ch { ch1=ch+32; putchar(ch1);原创 2016-04-11 20:02:39 · 533 阅读 · 0 评论 -
将十进制转换为二进制和十六进制
#includeint main(){int a,i,j,m;int arr[16]={0};printf("输入一个整数:\n");scanf("%d",&a);printf("十六进制=%x\n",a);printf("八进制=%o\n",a);printf("二进制数为:\n");for(i=0;i{m=a%2;j=a/2;a=j;arr[i]=m;}for(i=15;i>=0;i--){p原创 2016-04-11 20:02:31 · 316 阅读 · 0 评论 -
用正确的方式写if语句——与零值作比较
1.if语句中的布尔变量与零值作比较 不能用布尔变量与true,false,1,0直接作比较。布尔变量类型的语义是:零值为“假”,任何非零值都表示“真”。因为true的值并没有唯一的标准,因此不能用布尔变量与它直接进行比较。 假设布尔变量为flag,那么它与零值进行比较时if语句应该是 if(flag)\\表示如果flag为真 if(!flag)\\表示如果fla原创 2016-04-11 20:02:25 · 2970 阅读 · 0 评论 -
打印100—200之间的素数及优化
#includeint main(){ int i=0,count=0; int j=0; for(i=100;i { for(j=2;j{ if(i%j==0) {break; }} if(j==i) { printf("%d ",i); count++; } } printf("\ncount=%d\n",count); retu原创 2016-04-11 20:02:22 · 274 阅读 · 0 评论 -
栈求解迷宫问题
问题:假设下图是某迷宫的地图,问此迷宫是否有一条通路求解思想:用栈来实现解决问题,主要步骤是(1)从迷宫的原创 2016-04-11 23:16:53 · 11372 阅读 · 2 评论 -
二叉树的创建及成员函数的实现
本文实现了二叉树的创建及其成员函数的实现成员函数包括:1)构造函数2)拷贝构造函数3)赋值运算符重载4)先序遍历(先根遍历)5)中序遍历6)后序遍历(后根遍历)7)层序遍历8)节点个数9)叶子节点个数10)二叉树深度二叉树的实现:#pragma once#include#include#includeusing namespac原创 2016-04-20 18:04:23 · 5736 阅读 · 0 评论 -
利用union类型测试机器是大端还是小端(Big_endian or Little_endian)
#includeint check_sys(){ union check { int i; char ch; }c; c.i = 1; return (c.ch == 1);}int main(){ int ret = check_sys(); if (ret == 1) printf("Little_endian\n"); else printf("Big_endian\n");原创 2016-04-11 20:02:56 · 244 阅读 · 0 评论 -
二分查找
二分查找就是折半查找,主要思想:将要查找的数与表的中间的元素进行比较,若该数与中间值相等那么查找成功;如果该数大于中间的数,那么这个数一定在右子表中,继续对右子表进行折半查找;若该数比中间值小,那么这个数一定在左子表中,继续对左子表进行差找。知道查找成功或查找失败。二分查找的函数代码如下:void binary_search(int arr[], int size, int key){ int l原创 2016-04-11 20:03:02 · 608 阅读 · 0 评论 -
打印杨辉三角
实现过程:一、第一个for循环将对角线和第一列都置成1,即a[i][i]=1;a[i][1]=1;二、再用两个for循环给除对角线和第一列之外的其他元素赋值,由杨辉三角的规律可知除置1的元素以外的其他元素都是对应的同列的上一行元素与它前一列对应的上一行元素之和,即a[i][j]=a[i-1][j-1]+a[i-1][j]。三、用for循环嵌套打印出各元素。代码如下:#includeint main原创 2016-04-11 20:03:04 · 303 阅读 · 0 评论 -
将整数n这个数字转换为对应的字符串,保存到s中(两种方法)
方法一、用循环的方法取出每一位,存到字符数组中,最后将数组翻转。代码实现如下:#include#include#include#define MAX 20void reverse(char *left, char *right){ assert(left); assert(right); while (left < right) { int tmp = *left; *l原创 2016-04-11 20:03:31 · 969 阅读 · 0 评论 -
将一个字符串转换为对应的整数
例:将“1234”转换为数字1234。将“-1234”转换为数字-1234.将“+1234”转换为1234。分析:先设置一个标签sign=1,一个一个读取字符,读到第一个字符判断它是不是‘-’和‘+’;如果是‘-’那么令标记sign=-1,并且读取字符指针向后移一位,若果是‘+’,那么sign不变,指针向后移一位,将新读到的字符如‘1’,用‘1’-‘0’,得到的值是数字1,设置变量num=0,每次原创 2016-04-11 20:03:29 · 4375 阅读 · 0 评论 -
将一个字符串左旋n个字符(两种方法)
左移字符串有多种方法,这里只介绍两种方法。方法一、一个字符一个字符的左移,先将第一个字符保存起来,然后将后面的每一个字符都向前移一个字符,‘\0’不移,要想移n个字符,就这样循环n次就好了。方法二、先将左移的前n个字符翻转,然后将剩余的一串字符翻转,最后将所有的字符再翻转一次,用三次翻转就可以将n个字符左移。这种方法比前一种方法效率要好一些。方法一的代码如下:#include#include原创 2016-04-11 20:03:26 · 518 阅读 · 0 评论 -
将字符串中的空格变成%20如“we are happy ”变成“we%20are%20happy”
分析:将字符串中的空格替换成三个字符'%','2','0';一、创建另一个数组就太简单了,将字符串str的内容复制到新的数组中,当遇到‘ ’时就将输出%20;如果没有空格就将原字符串中的字符复制过来就好了;二、计算出字符串中的空格数,然后将代替后的字符串长度算出来,因为代替时会将原字符串中的字符覆盖掉,因此我们应该遍历时遇到空格就将它后面的字符向后移两位,这样就可以将%20放进去,但是由于每次遇到原创 2016-04-11 20:03:23 · 1503 阅读 · 0 评论