- 博客(19)
- 资源 (1)
- 收藏
- 关注
原创 链表面试题(二)
8. 查找链表的中间节点,要求只能遍历一次链表 使用指针追赶的方法。定义快慢指针,快指针一次走2步,慢指针一次走1步,当快指针走到尾时,慢指针刚好走到一半。 注意当FastNode–>_next==NULL时,表示链表有偶数个节点,其中间节点有两个SListNode* FindMidNode(SListNode* head){ SListNode* ...
2018-08-02 23:53:39 167
原创 链表面试题(一)
从尾到头打印单链表 1)定义end先走到空,通过第一层循环先找到第1个要打印的数,每次找end的前一个数打印。再定义cur,end中的数据打印完后,把cur赋给end,让cur从头走void PrintTailToHead(SListNode* head){ SListNode* end = NULL; while (end != head) { ...
2018-08-02 20:38:12 181
原创 顺序表&链表
1.线性表概念:有n(n >= 0)个数据元素组成的有限序列性质: 1)可以在其任意位置上进行插入和删除操作的线性数据结构 2)线性表中的数据存在一对一的关系,即除第1个元素和最后一个元素外,每个元素都有唯一的直接前驱和后继。而第1个元素没有前驱,最后一个元素没有后继。2.顺序表概念:用一段地址连续的存储单元依次存储数据元素的线性结构模型图: 动态...
2018-07-29 17:06:07 1314
原创 排序算法总结
1. 直接插入排序 基本思想: 将一个记录插入到已经 排序好的有序表中,从而得到一个新的,记录数增1的有序表。即:先将序列的第1个记录看成是一个有序的子序列,然后从第2个记录逐个进行插入,直到整个序列有序为止。 示意图: 代码实现:void InsertSort(int *a, size_t n){ //[0,end]是...
2018-07-24 15:40:14 114
原创 基础I/O
一. 练习open/read/write/close等文件相关系统调用接口,纵向对比fd与FILE结构体1. open//头文件#include<stdio.h>#include<stdlib.h>#include<sys/types.h>#include<fcntl.h>//函数原型int open(const cha...
2018-03-26 23:29:10 182
原创 进程
一. 进程1. 进程定义1)进程是程序的一个执行实例,是正在执行的程序。2)进程担当着分配系统资源(CPU时间,内存)的实体。3)进程在内存中执行,是动态的,是程序执行的一个过程。4)从用户角度看,进程是程序的依次动态执行过程;从OS角度看,进程是操作系统分配资源的基本单位,也是最小单位。5)每个进程都有自己的独立地址和执行状态。
2018-03-19 23:11:35 1202
转载 使用命令安装gcc/g++, gdb
首先,在命令行中输入vi查看一下vim的信息: 输入ls -a查看是否存在.vimrc和.viminfo这样的配置文件,结果如下1.配置gcc/g++Centos中使用yum来配置gcc和g++,若要安装gcc,则在命令行中输入:yum -y install gcc,按回车键就能够进行gcc的安装,若要安装g++,则需要在命令行中输入:yum -y install
2018-03-16 21:29:56 1941
原创 yum入门
一. vim配置插件 1. vim配置文件在目录/etc/下,有个名为vimrc的文件,这是系统中公共的vim配置文件,对所有用户都有效。 2. 在每个用户的主目录下,都可以建立私有的配置文件,命名为:“.vimrc”。例如:/root目录下,通常已经存在一个.vimrc文件,如果不存在,则自己创建它。 3. 切换用户成为自己执行su,进入自己的主工作目录,执行cd ~
2018-03-16 21:14:25 231
原创 模板的分离编译问题
所谓的分离编译是指将声明和定义分开来写,即将一个函数的声明和定义放在.h和.cpp文件中。 写过模板的人应该都会发现当我们用上面的方式写一个函数的时候,只要在.cpp中包.h的头文件,就没什么问题,但是如果写模板的时候,就编译链接不过去,就如下面这个例子://func.h#includetemplate void func(const T&);//func.cpp#includ
2017-10-15 14:17:51 161
原创 数据结构之vector&list
一. vector & list的使用和区别 STL(标准模板库)是一个C++的软件库,也是C++标准程序库的一部分。vector和list相当于容器,这些容器应该都是STL里面的一个类。而vector封装数组,list封装链表。 vector如代码:#includevectora(10);//类型为int,数量为10a[1] = { 1 };//第二个元素
2017-10-15 13:31:24 328
转载 智能指针
一. 智能指针的发展历史 1. RAII(Resource Acquisition Is Initialization) 构造函数资源分配即初始化,定义一个类来封装资源的分配和释放,在构造函数完成资源的分配和初始化,在析构函数完成资源的清理,可以保证资源的正确初始化和释放。智能指针的最初动机是使得下面的代码更安全,最初使用:void Test1(){
2017-10-14 22:42:56 150
原创 菱形继承
一. 虚表 虚函数表是通过一块连续内存来存储虚函数的地址。这张表解决了继承、虚函数(重写)的问题。在有虚函数的对象实例中都存在一张虚函 数表,虚函数表就像一张地图,指明了实际应该调用的虚函数函数。二. 单继承对象模型#includeusing namespace std;class Base {public: virtual void func1()
2017-08-04 11:42:10 174
原创 继承和多态
一.继承 定义:继承是面向对象复用的重要手段,是类型之间的关系建模,共享共有的东西,实现各自本质不同的东西。 三种继承关系下基类成员在派生类发生的访问关系变化:
2017-08-01 10:54:33 179
原创 写时拷贝
1.写时拷贝的定义: 写时拷贝顾名思义,是在写的时候(即改变字符串的时候)才会真正开辟空间(深拷贝),如果只对数据读取时,只会对数据进行浅拷贝,称写时拷贝,引用计数器的写时拷贝,又称为延时拷贝。 写时拷贝技术是通过“引用计数”实现的,在分配空间的时候多分配4个字节,用来记录有多少个指针指向块空间,当有新的指针指向这块空间时,引用计数加一,当要释放这块空间时,引用计数
2017-07-25 11:00:43 582
原创 动态内存开辟
一.C的动态内存管理细节1、malloc 函数 a、该函数的原型:void *malloc(size_t size); b、该函数只有一个参数,且形参size是无符号整型,该参数代表申请空间的字节数。 c、返回值:如果内存池中的可用内存满足需求,malloc返回一个指向被分配内存块起始位
2017-07-21 11:54:43 237
原创 指针和引用
1.引用 引用是对象的别名,引用本身不是对象,它只是已经存在的对象的另一个名字。故所有对引用的操作均是对它所代表的对象的操作。 定义格式: 类型&引用变量名=已定义过的变量名; 特点: 1.一个变量可以取多个别名 2.引用必须初始化
2017-07-19 11:30:52 231
原创 c函数重载的实现
函数重载是C++中特有的,在C语言中没有。函数重载的定义:指在同一作用域内,可以有一组相同函数名,不同参数列表的函数,这组函数称为重载函数。 int Add(int a, int b) //?Add@@YAHHH@Z{return a + b;}double Add(double a, double b) //?Add@@YANNN@Z{return
2017-07-17 22:52:29 706
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人