- 博客(84)
- 收藏
- 关注
原创 AVL树的插入以及四种旋转解析
什么是AVL树呢?(概念)一棵AVL树或者是空树,或者是具有以下性质的二叉搜索树:1、它的左右子树都是AVL树2、左子树和右子树高度之差(简称平衡因子)的绝对值不超过1(-1、0、1)3、如果一棵二叉搜索树是高度平衡的,它就是AVL树。4、时间复杂度:如果它有n个结点,其高度可保持在O(lgn),平均搜索时间复杂度O(lg(n))首先,创建AVL树template<class K, clas...
2018-03-15 20:24:48
367
原创 一个函数可以求任意多个整数的平均值(使用可变参数列表)
那么,什么是可变参数列表呢?一般我们写的函数的参数列表都是固定的,那么,如果一个函数在不同的时候接受不同数目的参数到底可不可以实现呢?假如要写一个函数(求任意多个整数的平均值),参数列表不确定时,我们用平时的固定的参数列表是存在很多隐患的,所以,就有了stdarg宏---->可变参数列表是通过他来实现的,头文件stdarg.h,他是标准库的一部分,这个头文件声明了一个类型va_list和三个...
2018-03-13 15:46:23
4322
原创 堆排序的比较器实现
一、堆定义最小堆:任一结点的关键码均小于等于它的左右孩子的关键码,位于堆顶结点的关键码最小;最大堆:任一结点的关键码均大于等于它的左右孩子的关键码,位于堆顶结点的关键码最大。 堆存储在下标为0开始计数的数组中,因此在堆中给定下标为i的结点时:1、如果i=0,结点i是根节点,没有双亲节点;否则结点i的双亲结点为结点(i-1)/22、如果2*i+1>n-1,则结点i无左孩子
2018-01-30 14:36:16
253
原创 判断二叉搜索树是否是完全二叉树
二叉树的简单函数实现http://blog.csdn.net/dove1202ly/article/details/79133089 在前面也提到过什么是满二叉树什么是完全二叉树,在这再重复一遍 1.满二叉树:在一棵二叉树中,如果所有分支结点都存在左子树和右子树,并且所有叶子结点都在同一层 2.完全二叉树:如果一棵具有N个节点的二叉树的结构与满二叉树的前N个结点的结构相同,即就称为完全二叉
2018-01-23 20:22:16
2011
原创 二叉树的简单操作(c++实现)
什么是二叉树? 一棵二叉树是结点的一个有限集合,该集合或者为空,或者是由一个根节点加上两棵分别称为左子树和右子树的二叉树组成 二叉树的特点 1.每个结点最多有两棵子树,即二叉树不存在度大于2的结点(分支最大不超过2) 2.二叉树的子树有左右之分,其子树的次序不能颠倒 下面来介绍两种特殊的二叉树: 1.满二叉树:在一
2018-01-22 20:12:50
925
原创 c语言复习之模拟实现strlen函数、strcpy函数、strncpy函数、strcat函数、strncat函数
复习的时候发现重要的模拟函数的实现还是有点生疏,今天我就来概括的复习一波~我们一个一个的来实现一遍1.模拟实现strlen其实非常简单哦~ strlen函数原型:size_t strlen ( const char * str ); 功能:计算字符串长度,不包括’\0’;模拟实现strlen函数int my_strlen(const char* arr){ int c
2018-01-16 11:45:38
581
原创 c语言复习之判断机器的大小端存储
一、什么是大小端存储模式呢? 这个问题呢就像吃egg一样,那么到底是从小头剥还是从大头剥呢?那我们就来分析一下再剥喽~ 所谓大端模式,是指数据的高位,保存在内存的低地址中,而数据的低位保存在内存的高地址中; 小端模式则是指数据的高位存放在内存的高地址中,数据的低位则存放在内存的低地址中; 也许这样你还是有点迷糊,没关系,我刚开始也迷糊,总是记混,那么下面我们用图分析一下 二、那怎么用
2018-01-16 10:19:50
314
原创 linux中vim三种模式切换
命令模式:在Linux终端中输入“vim 文件名”就进入了命令模式,但不能输入文字。 编辑模式:在命令模式下按i就会进入编辑模式,此时就可以写入程式,按Esc可回到命令模式。 末行模式:在命令模式下按:进入末行模式,左下角会有一个冒号出现,此时可以敲入命令并执行。 下面是三种模式的简单分析图: 一、三种模式的切换(在虚拟机上试一下各种模式的转换,顺便熟悉一下命令): 1.首先进入roo
2017-12-06 11:57:58
28754
1
原创 二叉树的定义与基本操作
一、二叉树的定义把满足以下两个条件的树形结构叫做二叉树(1)每个节点的度都步大于2;(2)每个节点的孩子节点次序不能任意颠倒。所以,一个二叉树的每个节点只能含有0、1或者2个孩子,而且每个孩子有左右之分,位于左边的交左孩子,位于右边的叫右孩子。二、二叉树的基本操作#include#includeusing namespace std;//孩子表示法tem
2017-12-02 15:40:22
11535
原创 栈的应用之后缀表达式
#include #includeusing namespace std;enum Type{ _SYMBOL, //操作符 _NUM, //操作数 ADD, SUB, MUL, DIV,};struct Cell{ Type _type; //每个传进来的单元的类型 int _value; //操作数 };int Cou
2017-11-26 23:39:29
311
原创 栈的应用之括号匹配
1.什么是括号匹配问题设表达式包含三种括号:圆括号、方括号和花括号,他们可以互相嵌套,如[{()}]()或者{}()等均为正确的形式,而({)、{{}})、{[(])}等形式均为不正确的形式2.算法思想(1)检验算法可以设置一个栈:(2)每读入一个括号,若是左括号,则直接入栈,等待相匹配的同类的右括号;(3)若读入的是右括号,且与当前栈顶的左括号同类型,则两
2017-11-25 23:55:43
302
原创 c语言实现链表面试题
以前实现过链表的简单函数,详细见http://blog.csdn.net/dove1202ly/article/details/77168657 今天我们来看看链表涉及的面试题相信大家都知道单链表面试题的重要性,既然知道,我们就应该把思路捋清楚,然后多敲几遍多敲几遍多敲几遍(重要的事情说三遍),在我身边好多编程好的把这几个函数敲了不下十遍,而我太菜,这才是第一次下定决心把这个整...
2017-11-18 21:39:36
2905
原创 动态顺序栈的简单实现
实现代码#pragma once//防止文件重复包含#includeusing namespace std;templateclass Stack{public: Stack() :_pData(new T[3]) , _capacity(3) , _size(0) {} void Push(const T& data) { CheckCapacity();
2017-11-15 16:53:55
369
转载 const在c/c++的使用场景
具体参考http://blog.csdn.net/liyuefeilong/article/details/48900121##1
2017-11-11 16:55:18
1094
原创 函数栈帧创建与销毁那些事儿
程序的执行过程可看作连续的函数调用。当一个函数执行完毕时,程序要回到调用指令的下一条指令(紧接call指令)处继续执行。 函数调用过程通常使用堆栈实现,每个用户态进程对应一个调用栈结构(callstack)。编译器使用堆栈传递函数参数、保存返回地址、临时保存寄存器原有值(即函数调用的上下文)以备恢复以及存储本地局部变量就是所谓的保护现场。为了浅显易懂,直接抛代码看反汇编~int Add(in
2017-11-05 01:59:54
308
原创 迭代器实现Vector
vector模型是一个动态数组,它本身是“将元素至于动态数组中加以管理”的一个抽象概念,但是c++标准并未要求以动态数组实作vector。 在使用标准库里面的vector时,必须包含头文件#include<vector> 其中型别vector是一个定义于namespace std的template。namespace std{ template<class T,class Allocator
2017-10-30 18:54:36
643
原创 什么是函数模板?
一、模板是什么? 所谓模板(templates),就是针对“一个或者多个尚未明确的型别”所撰写的函数或者类别,使用模板时,可以显式地(explicitly)或隐式(implicitly)将型别当作参数来传递。下面是一个例子:template<class T>//T为任意类型inline const T& max(const T& left,const T& right)//可以定义为内联函数,
2017-10-22 20:36:17
2699
原创 双向链表(c++封装)
双向链表是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。结构图如下所示:其中_pPre是双向链表的前驱结点,_pNext是它的后继结点,_data是数据域代码实现:#define _CRT_SECURE_NO_WARNINGS 1#include<iostream>#include<ass
2017-10-21 20:25:47
624
原创 深入多态—虚表指针
上一篇就多态做了简单的介绍,但还是对多态的运行很迷,那我们就来虚函数内部是怎么操作的?(一)单继承中的虚函数(无虚拟继承)#include<iostream>using namespace std;class A{public: virtual void Funtest1() { cout<<"A::Funtest1()"<<endl; } v
2017-10-17 19:58:45
357
原创 初识多态
什么是多态? 顾名思义,多态就是一个事物多种形态; 在面向对象层次来说,多态解释为:向不同的对象发送同一个消息,不同的对象在接收时会产生不同的行为。 在c++中,多态性表现形式之一是:具有不同功能的函数可以用同一个函数名,这样就可以实现用一个函数名调用不同内容的函数;简单点说就是:“一个接口,多种方法” 多态性的分类: 所谓静态变量:编译器在编译期间完成的,编译器根据函数实参的类型(
2017-10-14 23:53:25
218
原创 继承(知识点汇总)
在c++中可重用性是通过“继承”这一机制来实现的。。。。。 1.那么什么是继承呢?用代码举个最简单的继承例子(单继承方式)class A{public: int _a; void Display1() { cout<<_a<<endl; }};class B:public A //B公有继承了A{public: int _b;
2017-10-03 13:52:35
358
原创 String类的实现(深拷贝or浅拷贝)
今天,我们来实现一个字符串String的拷贝(String用来管理字符串)~具体以浅拷贝和深拷贝的形式给出~ 那么问题来了?什么是浅拷贝呢?深拷贝又是什么呢? 浅拷贝就相当于你喜欢一个人的感觉,而深拷贝相当于你爱一个人的感觉 我们都知道say like很容易,因为可能是他/她的外表所吸引,但是,say love却很难,因为你只有深入了解了他的本质才会爱上他~ 浅拷贝:
2017-10-01 20:35:59
540
原创 类的六个默认成员函数(二)
上次看了前三个,这次我们来看看后面的几个有关操作数重载的成员函数四、赋值运算符重载 我们都知道赋值运算符“=“是用来给变量赋值的,那么类的对象之间的赋值是不是也是用它呢?但是”=“只能用来对单个的变量赋值的,所以我们就得对赋值运算符进行重新加工(专业点说就是对赋值运算符进行运算符重载) 对象赋值的一般形式为: 对象名1=对象名2; CDate d1,d
2017-09-30 22:36:17
273
原创 类的六个默认成员函数总结(一)
一、构造函数 什么是构造函数呢?? 看下图: 如图:构造函数的特性有: 1.函数名与类名相同; 2.没有返回值; 3.有初始化列表(可以不用) 4.新对象被创建,由编译器自动调用,且在对象的生命周期内仅调用一次 5.构造函数可以重载,实参决定了调用哪个构造函数 6.如果没有显示定义时,编译器提供一个默认的构造函数 7.无参构造函数和带有缺省值的构造函数都认为是缺省构造
2017-09-18 20:59:33
597
原创 类之this指针
什么是类呢?类就相当于c语言中的结构体一样~ 类将一组具有相关性数据包装在一体,这些数据称为类的成员变量或属性。 下面给出类的一般定义:class ClassName //类名字{ //类实现体};class为类的关键字,ClassName为类的名字,{}为类的主体,**尤其注意类定义结束后有个分号**今天我们主要来介绍一下类里面的this指针~ 什么是this指针呢???我们通
2017-09-18 17:22:19
754
原创 解析选择排序法与冒泡排序法的区别(数组实现和指针实现)
为了更好的理解两种方法的区别,我们分别用图解法和代码实现来区分一下~ 例如有一组数据arr[5]={9,5,7,3,0},分别用两种方法对其进行排序选择排序法图解说明 如图,数组arr有5个数,需要比较4次,如果按照从小到大排序的话;第一次比较:将数组的第一个元素与数组中从第二个数组以后的每个元素进行比较,找到最小的元素记录下来,再进行第二次比较;第二次比较,将数组中arr[1]与后面的每个元素
2017-08-19 20:14:28
4607
3
原创 单链表的简单函数实现
首先我们得了解一下什么是链表?什么是单链表 所谓链表其实就是一些包含数据的独立数据结构(通常称为结点)的集合,链表中的每个结点通过链或指针连接在一起,程序通过指针访问链表中的结点。 在单链表中,每个结点包含一个指向链表下一个结点的指针,链表最后一个结点的指针字段的值为NULL。 下图为单链表的具体实现方式图 下面我们用代码来简单实现一下~ LinkList.h //函数声明#ifnd
2017-08-14 20:17:01
1024
原创 通讯录(文件版本)
首先,我们来了解一下有关文件操作的相关函数~ fopen函数: 打开文件 FILE* fopen(const char *filename,const char *mode) 参数filename即欲打开的文件名或者文件路径,参数mode则代表流形态 那么mode有哪些形态呢??? r 打开只读文件,该文件必须存在 r+ 打开可读写的文件,该文件必须存在 w
2017-08-01 14:25:37
1304
原创 动态顺序表-c语言实现
上一篇实现了顺序表的静态实现,那么有没有一种更为优化的实现方式呢? 当然有,仿照之前实现的通讯录,接下来我们来实现一下动态的顺序表~SeqListD.h#ifndef __SEQLISTD_H__#define __SEQLISTD_H__#include <stdio.h>#include <assert.h>#include <string.h>#include <stdlib.
2017-07-28 16:28:06
286
原创 静态顺序表-c语言实现
要实现顺序表,那么首先我们得知道什么是顺序表,顺序表有什么作用等等。。。。 将表中元素一个接一个的存入一组连续的存储单元中,这种存储结构是顺序结构。 采用顺序存储结构的线性表简称为“顺序表”。顺序表的存储特点是:只要确定了起始位置,表中任一元素的地址都通过上一个位置确定。 下面我们来具体实现一下。。。。SeqListD.h //函数声明#ifndef __SEQLIST_H__
2017-07-28 16:15:49
286
原创 动态通讯录
上次实现了静态版本的通讯录,虽然能够初步满足我们的需求,但总归还是不够完美,那么下面我将次通讯录的静态版本改为动态版本。。。这就需要用到动态分配~所谓动态分配,就是需要的时候再分配,这是相对于静态分配而言的,静态分配就是一次分配完毕,不管你用多少。而动态分配则是按需分配。下面我们来具体实现一下呗~ contact.h#ifndef __CONTACT_H__#define __CONTACT
2017-07-26 16:43:16
854
2
原创 静态通讯录
实现一个简单的静态通讯录可以用来存储有限个人的信息其中每个人的信息包括:姓名、性别、年龄、电话、住址 具体实现成员的添加、删除、查找、修改、显示、清空、排序等功能根据要求,分别创建三个文件(contact.h<头文件>,contact.c<具体函数实现>,test.c<函数测试>)contact.h#ifndef __CONTACT_H__#define __CONTACT_H__#define
2017-07-20 14:19:38
359
原创 浅谈c语言—位段
关于结构,我们有必要提到它们实现位段的能力,下面我们就来就位段来讨论一下呗~一、位段的声明于结构的声明的不同:首先先看一下下面这个位段声明的例子struct CHAR{ unsigned ch : 7; unsigned font : 6; unsigned size : 19;}
2017-07-16 12:58:01
482
原创 模拟实现strcat函数
strcat函数原型:extern char *strncat(char *dest,char *src,int n); 用法:#include string.h 功能:把src所指字符串的前n个字符添加到dest结尾处(覆盖dest结尾处的‘‘)并添加‘‘. 说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。返回指向dest的指针。 以下是模拟实现
2017-07-10 17:25:03
426
原创 结构体基础知识
1.首先我们来认识一下什么是结构体~ 其实,结构体就是一些值的集合。我们把这些值称为它的成员,一个结构体的各个成员可能具有不同的类型。 结构体的形式如下: 第一种:只有结构体定义 struct 结构名 { 成员表列 }; 例如:struct Stu{ char name[20]; int age; char id[15]; };123456123
2017-07-10 17:19:58
568
原创 左旋
2.实现一个函数,可以左旋字符串中的k个字符。ABCD左旋一个字符得到BCDAABCD左旋两个字符得到CDAB#include#includeleft_move(char arr[], int k){while (k--){char tmp = arr[0];int len = strlen(arr);int i = 0;for (i = 0; i
2017-05-29 12:18:05
277
原创 杨氏矩阵
//杨氏矩阵有一个二维数组.数组的每行从左到右是递增的,每列从上到下是递增的.在这样的数组中查找一个数字是否存在。时间复杂度小于O(N);#includevoid find(int arr[3][3], int *px, int *py, int key){int row = 0;int col = *py - 1;while ((col>=0) &
2017-05-29 11:59:52
264
原创 按位与、或、异或的区别
1. 按位与运算按位与运算符"&"是双目运算符。其功能是参与运算的两数各对应的二进位相与。只有对应的两个二进位均为1时,结果位才为1 ,否则为0。参与运算的数以补码方式出现。 例如:5&7可写算式如下: 0000 0101 & 0000 0111 00
2017-05-20 18:09:21
2944
原创 1!+2!+.......+n!(c代码)
#includeint main(){int i = 0;int n = 0;int k = 1; int sum = 0;scanf("%d", &n);for (i = 1; i {int k = 1;//k的初始化int j = 0;for (j = 1; j {k = k*j;}sum += k;}printf(
2017-04-21 14:31:58
755
原创 逻辑判断
题目: 日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个。以下为4个嫌疑犯的供词。A说:不是我。B说:是C。C说:是D。D说:C在胡说。已知3个人说了真话,1个人说的是假话。现在请根据这些信息,写一个程序来确定到底谁是凶手。代码程序#include "stdio.h"void main(){char killer
2017-04-16 20:20:31
455
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人