指针数组

如何写出高效的链表代码

谁说胖子不能爱 提交于 2019-12-23 00:26:05
本篇文章将介绍下面这些内容,阅读预计15分钟。 文章目录 链表和数组区别 面试题常考的链表算法 LeetCode练习题索引 总结: 链表和数组区别  我们在问两个事物的区别时,我们实质是在问这两者分别是什么?而非真的关注差别本身。 数组: 数组是一种线性表数据结构。它用 连续的内存空间 ,存储 相同类型的数据 。  数组因为申请内的存是连续的内存空间,所以在知道First Index 的内存地址后,可以立即通过位置的 偏移 计算出其他任何位置(下标)的内存地址。也就是我们常说的随机访问的特性。 例如存储整数的一个Array,每个整数占4字节,在内存中的情况如下: 在知道arr[0]的内存地址是 0x100后,可以通过公式求取任意位置的内存地址: adrr[n] = 100+4*n 因为这个特性,可以利用CPU的高速缓存,在读取数组时,预读取一组数据,加快访问效率。 链表: 链表也是一种线性表数据结构,它通过 指针 把各个 零散 的节点串联起来。  将数组和链表放在一起看,可以发现,链表的内存地址不一定是连续的,系统不会预先分配给链表指定大小的内存空间。当向链表中存放数据,系统会寻找未使用的内存块,存放数据,然后把前一个节点的指针指向该内存。 所以当数组申请一个1G大小的空间时,系统可能因为没有足够的内存空间而创建失败。而链表不存在这样的问题,它使用的是系统中零散的内存。

STL vector简介

荒凉一梦 提交于 2019-12-22 11:34:27
STL vector简介 vector(向量): C++中的一种数据结构,确切的说是一个类.它相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间的目的. 用法: 1.文件包含: 首先在程序开头处加上#include<vector>以包含所需要的类文件vector 还有一定要加上using namespace std; 2.成员函数 1.push_back 在数组的最后添加一个数据 2.pop_back 去掉数组的最后一个数据 3.at 得到编号位置的数据 4.begin 得到数组头的指针 5.end 得到数组的最后一个单元+1的指针 6.front 得到数组头的引用 7.back 得到数组的最后一个单元的引用 8.max_size 得到vector最大可以是多大 9.capacity 当前vector分配的大小 10.size 当前使用数据的大小 11.resize 改变当前使用数据的大小,如果它比当前使用的大,者填充默认值 12.reserve 改变当前vecotr所分配空间的大小 13.erase 删除指针指向的数据项 14.clear 清空当前的vector 15.rbegin 将vector反转后的开始指针返回(其实就是原来的end-1) 16.rend 将vector反转构的结束指针返回(其实就是原来的begin-1)

数据结构图文解析之:数组、单链表、双链表介绍及C++模板实现

不打扰是莪最后的温柔 提交于 2019-12-22 05:32:25
0. 数据结构图文解析系列 数据结构系列文章 数据结构图文解析之:数组、单链表、双链表介绍及C++模板实现 数据结构图文解析之:栈的简介及C++模板实现 数据结构图文解析之:队列详解与C++模板实现 数据结构图文解析之:树的简介及二叉排序树C++模板实现. 数据结构图文解析之:AVL树详解及C++模板实现 数据结构图文解析之:二叉堆详解及C++模板实现 1. 线性表简介 线性表是一种线性结构,它是由零个或多个数据元素构成的 有限序列 。线性表的特征是在一个序列中,除了头尾元素,每个元素都有且只有一个直接前驱,有且只有一个直接后继,而序列头元素没有直接前驱,序列尾元素没有直接后继。 数据结构中常见的线性结构有数组、单链表、双链表、循环链表等。线性表中的元素为某种 相同 的抽象数据类型。可以是C语言的内置类型或结构体,也可以是C++自定义类型。 2. 数组 数组在实际的物理内存上也是连续存储的,数组有上界和下界。C语言中定义一个数组: 数组下标是从0开始的,a[0]对应第一个元素。其中,a[0]称为数组a的下界,a[6]称为数组a的上届。超过这个范围的下标使用数组,将造成 数组越界错误 。 数组的特点是: 数据连续,支持快速随机访问。 数组分为固定数组与动态数组。其中固定数组的大小必须在编译时就能够确认,动态数组允许在运行时申请数组内存。复杂点的数组是多维数组

数据结构基础概念篇

半城伤御伤魂 提交于 2019-12-21 23:46:01
数据结构基础概念篇 原创 小草莓lllll 发布于2017-11-14 13:44:24 阅读数 158267 收藏 更新于2017-11-14 13:44:24 分类专栏: 数据结构与算法 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/qq_31196849/article/details/78529724 展开 <h1 id="数据结构"><a name="t0"></a><a name="t0"></a>数据结构</h1> 一些概念 数据结构就是研究数据的 逻辑结构 和 物理结构 以及它们之间 相互关系 ,并对这种结构定义相应的运算,而且确保经过这些运算后所得到的新结构仍然是原来的结构类型。 数据:所有能被输入到计算机中,且能被计算机处理的符号的集合。是计算机操作的对象的总称。 数据元素:数据(集合)中的一个“个体”,数据及结构中讨论的 基本 单位 数据项:数据的不可分割的最小单位。一个数据元素可由若干个数据项组成。 数据类型:在一种程序设计语言中,变量所具有的数据种类。整型、浮点型、字符型等等 逻辑结构:数据之间的相互关系。 集合 结构中的数据元素除了同属于一种类型外,别无其它关系。 线性结构 数据元素之间一对一的关系 树形结构 数据元素之间一对多的关系

详解快速排序算法(Java版)

 ̄綄美尐妖づ 提交于 2019-12-21 19:18:46
前言 快速排序(Quick Sort)算法和冒泡排序算法类似,都是基于交换排序的思想。快速排序算法对冒泡排序算法进行了改进,从而具有更高的执行效率。而且也是面试常考的一种算法,不仅得会写,更主要的是理解其中的思想。 快速排序的流程 (1)首先设定一个分界值,通过该分界值将数组分为左右两部分 (2)将大于等于分界值的数据集中到数组的右边,小于分界值的数据集中到数组的左边,此时左边部分中各元素都小于等于分界值,右边部分中各元素都大于分界值 (3)然后,左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样将左边放置较小值,右边放置较大值。右侧的数组也做类似处理。 (4)重复上述过程,可以看出,这是一个递归定义。通过递归将左侧部分排好后,再递归排好右侧部分的顺序。当左、右两部分各数据排序完成后,整个数组的排序也就完成了 详细代码 上面的流程,一般看完后会懵懵懂懂,结合下面的代码,然后慢慢理解 public class MyQuickSort { static final int SIZE = 18; /** * @param arr 待排序的数组 * @param left 数组的左边界(例如,从起始位置开始排序,则left=0) * @param right 数组的右边界(例如,排序截至到数组末尾,则right=arr.length-1)

几百万数据放入内存不会把系统撑爆吗?

£可爱£侵袭症+ 提交于 2019-12-21 19:02:57
在公司有一个需求是要核对一批数据,之前的做法是直接用SQL各种复杂操作给怼出来的,不仅时间慢,而且后期也不好维护,就算原作者来了过一个月估计也忘了SQL什么意思了,于是有一次我就想着问一下之前做这个需求的人为什么不将这些数据查出来后在内存里面做筛选呢?直接说了你不怕把内存给撑爆吗?此核算服务器是单独的服务器,配置是四核八G的,配置堆的大小是4G。本着怀疑的精神,就想要弄清楚几百万条数据真的放入内存的话会占用多少内存呢? 计算机的存储单位 计算机的存储单位常用的有 bit 、 Byte 、 KB 、 MB 、 GB 、 TB 后面还有但是我们基本上用不上就不说了,我们经常将 bit 称之为比特或者位、将 Byte 简称为 B 或者字节,将 KB 简称为 K ,将 MB 称之为M或者兆,将 GB 简称为 G 。那么他们的换算单位是怎样的呢? 换算关系 首先我们得知道在计算机中所有数据都是由 0 1 来组成的,那么存储 0 1 这些二进制数据是由什么存放呢?就是由 bit 存放的,一个 bit 存放一位二进制数字。所以 bit 是计算机 最小的存储单位 。 大部分计算机目前都是使用8位的块,就是我们上面称之为的字节 Byte ,来作为计算机容量的基本单位。所以我们一般称一个字符或者一个数字都是称之为占用了多少字节。 了解了上面关于位和字节的关系后,我们可以看一下其他的单位换算关系 1B

C:指针数组

柔情痞子 提交于 2019-12-21 18:12:16
在这里插入代码片 # include <stdio.h> void help ( ) { printf ( "\t-t Ping 指定的主机,直到停止。\r\n" ) ; printf ( "\t-a 将地址解析为主机名。\r\n" ) ; } int main ( int argc , char * args [ ] ) { char * str [ ] = { "C" , "C++" , "ASM" , "PHP" , "JAVA" } ; char str1 [ ] [ 10 ] = { "C" , "C++" , "ASM" , "PHP" , "JAVA" } ; int i = 0 ; char arr [ 10 ] ; char * s = str [ 0 ] ; str [ 0 ] = str [ 1 ] ; str [ 1 ] = s ; for ( ; i < 5 ; i ++ ) { printf ( "%08x\r\n" , str [ i ] ) ; } for ( i = 0 ; i < 5 ; i ++ ) { printf ( "%08x\r\n" , str1 [ i ] ) ; } for ( i = 0 ; i < 5 ; i ++ ) { printf ( "%s\r\n" , str [ i ] ) ; } for ( i = 0 ; i

C:字符数组和字符指针

依然范特西╮ 提交于 2019-12-21 14:20:33
   C语言中没有string类型,字符串都是通过char字符数组来存储的   char * str = "Hello" (字符指针)   char str[6] = "Hello" (字符数组)   char line[10] = "Hello"  编译器编译后数组长度为6,自动生成\0都是{'H','e','l','l','o','\0'}   当用char *str 初始化字符串数组之后,该数组为只读数组(实际上是const常量,不可修改),在代码段中,不可以对其修改,如s[0] = ‘s’,否者报错      char * str = "Hello" 等价于char * str;  str = "Hello"   当用char str[6]初始化字符串数组之后,该数组是可以修改的      只能使用 char str[6] = "Hello",不可以char str[6];  str[6] = "Hello"     如果要构造字符串,用数组      如果要处理字符串,用指针    char *表示的是字符串或者是单个字符   要写入字符串数组,要开辟新的空间(以后补充)          对于逃逸字符,可以使用//来输出 字符串的输入和输出   char string[8];   scanf("%s",&string);   printf("%s",string);  

用指针方法排序数组

若如初见. 提交于 2019-12-20 13:50:09
#include <stdio.h> #include <stdlib.h> //将一维数组中10个数按大到小的顺序排列输出 int main() { void sort(int x[],int n); //void sort(int *x,int n) int i,x[10]; int *p; p=x; for(i=0;i<10;i++) scanf("%d",p++); p=x; sort(p,10); p=x; for(i=0;i<10;i++) printf("%d ",*(p++)); return 0; } void sort(int x[],int n) //void sort(int *x,int n) { int i,j,t; for(i=0;i<n;i++) { for(j=i;j<n;j++) { //if(*(x+j)>*(x+i)) { t=x[j],x[j]=x[i],x[i]=t; //t=*(x+j),*(x+j)=*(x+i),*(x+i)=t; } } } } *(x+j)就是x[j]; 来源: https://www.cnblogs.com/webmen/p/5739687.html

12月19号

…衆ロ難τιáo~ 提交于 2019-12-20 04:31:15
指针 1、定义 基类型 * 指针变量名 2、赋值 int a; int *pa=&a;// int a,*pa=&a; int *p2; p2=&a; 两个运算符 & 取地址,后面操作数必须是变量 指针运算符,后面的操作数必须是指针 int a=3; int *pa=&a; &a 正确,表示a的地址 &pa 正确,表示pa的地址 *a 不对 *pa 正确,表示的是pa指向的变量,即a *&a 正确, 表示的就是a *&pa 正确,表示的是pa &*a 不对 &*pa 正确,表示的是pa,即&a, & * 如果正确使用,则两个运算符可以相互抵消 void exchange(int *p1,int *p2) { int t; t=*p1; *p1=*p2; *p2=t; } void exchange(int *p1,int *p2) { int *t; t=p1; p1=p2; p2=t; } 利用指针访问(引用)数组 通过下标遍历数组元素 int a[]={1,2,3,4,5}; a表示的是数组首元素的地址,是一个地址常量,不能改变,等价&a[0] int * pa=a;//指针变量pa指向数组首地址 int *pa=&a[0]; 如果指针变量指向数组的首地址,此时指针变量可以使用下标,即指针变量等同于数组名 a[1]====>pa[1] 当指针变量指向数组的时候