指针

Jan 09 - Remove Linked List Elements; Linked List; Pointer operation;

自闭症网瘾萝莉.ら 提交于 2020-03-22 22:15:24
数据结构:单向链表。指针操作,注意Null Pointer的情况 以及链表头指针的操作 代码: /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ public class Solution { public ListNode removeElements(ListNode head, int val) { ListNode cur = head; while(head != null && head.val == val){ head = head.next; cur = cur.next; } while(cur != null && cur.next != null){ if(cur.next.val == val) cur.next = cur.next.next; else cur = cur.next; } return head; } } 来源: https://www.cnblogs.com/5683yue/p/5117812.html

DS博客作业02--栈和队列

旧巷老猫 提交于 2020-03-22 20:11:35
0.PTA得分截图 1.本周学习总结 1.1总结栈和队列内容 栈的顺序存储结构及其基本运算 栈是限制插入和删除只能在一个位置上进行的表,采用顺序存储结构的栈称为顺序栈。 顺序栈的结构体定义: typedef struct { ElemType data[MaxSize] ;//存放栈中的数据元素 int top;//栈顶指针,即存放栈顶元素在data数组中的下标 }SqStack;//顺序栈类型 初始化栈 该运算创建一个空栈,由s指向它。实际上就是分配-一个顺序栈空间,并将栈顶指针设置为-1。 void InitStack(SqStack * &s) { s= (SqStack * )malloc( sizeof(SqStack)); //分配一个顺序栈空间, 首地址存放在s中 s-> top=-1;//栈顶指针置为-1 } 判断栈是否为空 该运算实际上用于判断条件s-> top==-1是否成立。 bool StackEmpty(SqStack *s) { return(s-> top==-1); } 进栈Push(&s,e) 该运算的执行过程是,在栈不满的条件下先将栈顶指针增1,然后在该位置上插人元素e,并返回真;否则返回假。 bool Push(SqStack * &s, ElemType e) { if (s-> top==MaxSize- 1)//栈满的情况,即栈上溢出

C++ Virtual 完美诠释

半腔热情 提交于 2020-03-22 18:03:43
解答了我的一些疑问,觉得写的不错!!!转载一下。 virtual在英文中表示“虚”、“虚拟”的含义。c++中的关键字“virtual”主要用在两个方面:虚函数与虚基类。下面将分别从这两个方面对virtual进行介绍。 1.虚函数 虚函数源于c++中的类继承,是多态的一种。在c++中,一个基类的指针或者引用可以指向或者引用派生类的对象。同时,派生类可以重写基类中的成员函数。这里“重写”的要求是函数的特征标(包括参数的数目、类型和顺序)以及返回值都必须与基类中的函数一致。如下所示: 可以在基类中将被重写的成员函数设置为虚函数,其含义是:当通过基类的指针或者引用调用该成员函数时,将根据指针指向的对象类型确定调用的函数,而非指针的类型。如下,是未将test()函数设置为虚函数前的执行结果: 在将test()函数设置为virtual后,执行结果如下: 如此,便可以将基类与派生类的同名方法区分开,实现多态。 说明: 1.只需将基类中的成员函数声明为虚函数即可,派生类中重写的virtual函数自动成为虚函数; 2.基类中的析构函数必须为虚函数,否则会出现对象释放错误。以上例说明,如果不将基类的析构函数声明为virtual,那么在调用delete p2;语句时将调用基类的析构函数,而不是应当调用的派生类的析构函数,从而出现对象释放错误的问题。 3.虚函数的使用将导致类对象占用更大的内存空间

数据结构之线性表、栈、队列

删除回忆录丶 提交于 2020-03-22 15:04:03
线性表 一、定义 线性表是n个数据元素的有限序列。 二、线性表的顺序表示和实现 即用一组地址连续的储存单元依次存储线性表的数据元素。以元素在计算机内“物理位置相邻”来表示线性表中数据元素之间的逻辑关系。即是用我们熟悉的C/C++中的数组存储数据元素。只要确定了数据元素的起始位置,就可随机地访问数据元素。但是这种表示方法不便于插入和删除元素,每插入或删除一个元素,都要移动插入或删除位置之后的数据元素在连续储存单元中的位置,而且除了重新分配内存,否则在程序运行过程中不能动态地增加储存单元的数量。 三、线性表的链式表示和实现 即用一个链表来储存数据元素。这种储存结构的特点是用一组任意的存储单元存储线性表的数据元素(可连续可不连续),它包括两个域:数据域和指针域,指针域储存下一个或上一个元素的内存地址,从而使这些元素连成一个线性表。线性表有单链表、双向链表和循环链表。 双向链表的结点中有两个指针域,其一指向直接后继,另一指向直接前继,克服了单链表的单向性缺点。 循环链表是表中最后一个结点的指针域指向头结点,整个链表形成一个环。从表中任一结点出发均可找到表中其他结点。 线性表的链式表示非常方便插入或删除元素,而且效率比较高,因为元素并不是储存在物理位置相邻的存储单元中,插入或删除元素只对表中逻辑上相邻的两个(在两端时为一个)元素有影响,对其他元素无影响。而且可在程序运行过程中“无限制

C#实现平衡多路查找树(B树)

有些话、适合烂在心里 提交于 2020-03-22 05:59:22
写在前面:搞了SQL Server时间也不短了,对B树的概念也算是比较了解。去网上搜也搜不到用C#或java实现的B树,干脆自己写一个。实现B树的过程中也对很多细节有了更深的了解。 简介 B树是一种为辅助存储设计的一种数据结构,在1970年由R.Bayer和E.mccreight提出。在文件系统和数据库中为了减少IO操作大量被应用。遗憾的是,他们并没有说明为什么取名为B树,但按照B树的性质来说B通常被解释为Balance。在国内通常有说是B-树,其实并不存在B-树,只是由英文B-Tree直译成了B-树。 一个典型的 B树如图1所示。 图1.一个典型的B树 符合如下特征的树才可以称为B树: 根节点如果不是叶节点,则至少需要两颗子树 每个节点中有N个元素,和N+1个指针。每个节点中的元素不得小于最大节点容量的1/2 所有的叶子位于同一层级(这也是为什么叫平衡树) 父节点元素向左的指针必须小于节点元素,向右的指针必须大于节点元素,比如图1中Q的左指针必须小于Q,右指针必须大于Q 为什么要使用B树 在计算机系统中,存储设备一般分为两种,一种为主存(比如说CPU二级缓存,内存等),主存一般由硅制成,速度非常快,但每一个字节的成本往往高于辅助存储设备很多。还有一类是辅助存储(比如硬盘,磁盘等),这种设备通常容量会很大,成本也会低很多,但是存取速度非常的慢,下面我们来看一下最常见的辅存--硬盘。

内核IS_ERR宏解析

放肆的年华 提交于 2020-03-22 04:44:09
最近在使用 filp_open 打开文件时遇到到一个问题,当打开一个并不存在的文件时, filp_open 返回值值为 0xfffffffe ,而并不是 0 ( NULL ),这是因为内核对返回指针的函数做了特殊处理。内核中的函数常常返回指针,通常如果调用出错,会返回 NULL 空指针,但 linux 做了更精妙的处理,能够通过返回的指针体现出来。 对任何一个指针,必然有三种情况:一种是有效指针,一种是 NULL ,空指针 , 一种是错误指针,或者说无效指针。而所谓的错误指针就是指其已经到达了最后一个 page ,比如对于 32bit 的系统来说 , 内核空间最高地址 0xffffffff, 那么最后一个 page 就是指的 0xfffff000~0xffffffff( 以 4K 大小页为例 ) 。这段地址是被保留的,如果超过这个地址,则肯定是错误的。 在 linux/err.h 中包含了这一机制的处理,主要通过 IS_ERR, PTR_ERR, ERR_PTR 几个宏。 /* * Kernel pointers have redundant information, so we can use a * scheme where we can return either an error code or a dentry * pointer with the same return

C++ 虚函数列表与多态 —— 多态的简单用法

社会主义新天地 提交于 2020-03-22 03:56:01
首先看下边的代码,先创建一个父类,然后在来一个继承父类的子类,两个类中都有自己的 play() 方法,在代码的第35-37行,创建一个父类指针,然后将子类地址引用赋值给父类,这时调用 P 指针的 play() 方法会打印出什么呢。开始我以为会是调用子类的 play() 方法,因为第36行给引用了,但打印结果是:    这是个父类的play 1 #include <iostream> 2 3 class Father 4 { 5 public: 6 void play() 7 { 8 std::cout << "这是个父类的play" << std::endl; 9 } 10 }; 11 12 class Son : public Father 13 { 14 public: 15 void play() 16 { 17 std::cout << "这是个子类的Play" << std::endl; 18 } 19 }; 20 21 22 void party(Father** men, int num) 23 { 24 for (int i = 0; i < num; i++) 25 { 26 men[i]->play(); 27 } 28 } 29 30 int main() 31 { 32 Father father; 33 Son son; 34 35 Father* p;

C语言文件读写命令

折月煮酒 提交于 2020-03-22 03:11:10
C语言把磁盘文件看成是字符(或字节)的序列,按照存储信息的形式来说,文件主要是有文本文件和二进制文件。文本文件由一个个字符组成,每个字节存放一个ASCII码制,代表一个字符。二进制文件把内存中的数据按其在内存中的存储形式原样放入磁盘空间。 二进制文件以及文本文件都可以看做是“数据流”。 流文件的特点是,处理时不需考虑文件中的数据的性质、类型和存放格式。访问时只是以字节为单位对数据进行存取,没有记录的概念,而将对数据结构的分析、处理等工作都交给后续程序区处理。系统会自动为这在使用的每个文件开辟一个缓存区,从内存向磁盘输出数据必须先送到内存中的缓存区,装满缓存后才一起送到磁盘。 一、文件的打开与关闭 文件在进行读写操作之前要先打开,使用完毕要关闭。所谓打开文件,实际上是建立文件的各种有关信息,并使文件指针指向该文件,以便进行其它操作。关闭文件则断开指针与文件之间的联系,也就禁止再对该文件进行操作。 fopen函数用来打开一个文件,其调用的一般形式为: 文件指针名=fopen(文件名,使用文件方式); 其中: “文件指针名”必须是被说明为FILE 类型的指针变量; “文件名”是被打开文件的文件名; “使用文件方式”是指文件的类型和操作要求。 “文件名”是字符串常量或字符串数组。 使用文件的方式共有12种,下面给出了它们的符号和意义。 “r” 只读打开一个文本文件,只允许读数据 “w”

汇编基础——常用寄存器及其用途

早过忘川 提交于 2020-03-21 23:31:47
通用寄存器的主要用途 寄存器的分类 寄存器 主 要 用 途 通 用 寄 存 器 数据 寄存器 AX 乘、除运算,字的输入输出,中间结果的缓存 AL 字节的乘、除运算,字节的输入输出,十进制算术运算 AH 字节的乘、除运算,存放中断的功能号 BX 存储器指针 CX 串操作、循环控制的计数器 CL 移位操作的计数器 DX 字的乘、除运算,间接的输入输出 变址 寄存器 SI 存储器指针、串指令中的源操作数指针 DI 存储器指针、串指令中的目的操作数指针 变址 寄存器 BP 存储器指针、存取堆栈的指针 SP 堆栈的栈顶指针 指令指针 IP/EIP 标志位寄存器 Flag/EFlag 32位 CPU的 段寄存器 16位CPU的 段寄存器 ES 附加段寄存器 CS 代码段寄存器 SS 堆栈段寄存器 DS 数据段寄存器 新增加的 段寄存器 FS 附加段寄存器 GS 附加段寄存器 来源: https://www.cnblogs.com/javawebsoa/archive/2013/05/14/3078478.html

内存池

元气小坏坏 提交于 2020-03-21 19:57:59
http://blog.csdn.net/neustar1/article/details/7478311 利用C/C++开发大型应用程序中,内存的管理与分配是一个需要认真考虑的部分。 本文描述了内存池设计原理并给出内存池的实现代码,代码支持Windows和Linux,多线程安全。 内存池设计过程中需要考虑好内存的分配与释放问题,其实也就是空间和时间的矛盾。 有的内存池设计得很巧妙,内存分配与需求相当,但是会浪费过多的时间去查找分配与释放,这就得不偿失; 实际使用中,我们更多的是关心内存分配的速度,而不是内存的使用效率。基于此,本文按照如下思想设计实现内存池。 主要包含三个结构:StiaticMemory, MemoryChunk和MemoryBlock,三者之间的关系如下图所示: 1.内存的分配: (1)如果分配大小超过1024,直接采用malloc分配,分配的时候多分配sizeof(size_t)字节,用于保存该块的大小; (2)否则根据分配大小,查找到容纳该大小的最小size的MemoryChunk; (3)查找MemoryChunk的链表指针pList,找到空闲的MemoryBlock返回; (4)如果pList为NULL,临时创建MemoryBlock返回; (5)MemoryBlock头部包含两个成员,pChunk指向的所属的MemoryChunk对象,size表明大小