指针

数据结构-线性表-单链表

|▌冷眼眸甩不掉的悲伤 提交于 2020-03-01 03:58:32
不带头结点的 单链表 (链式存储) 不要求逻辑上相邻的两个数据元素逻辑上也相邻,他们是通过"链",建立起数据元素之间的逻辑关系。因此对线性表的插入、删除 不需要移动数据元素,只需要修改"链" 。 例如:画出26个字母的链式存储结构 逻辑结构:(a,b,c,…,x,y,z) 链式存储结构: 结点由两个域组成: 数据域 :存储元素数值数据 指针域 :存储直接后继结点的存储位置 与链式存储有关的术语 结点:数据元素的存储映像。由数值域和指针域两部分组成。 链表:n个结点由链指针组成一个链表。他是线性表的链式存储映像,称为线性表的链式存储结构。 单链表:结点只有一个指针域的链表。 双链表:有两个指针域的链表。 循环链表:首尾相接的链表。 头指针、首元结点 头指针:指向链表中第一个结点的指针。 首元结点:链表中存储第一个数据元素a1的结点。 空表 非空表 单链表是由表头唯一确定,因此单链表可以用头指针的名字来命名。若头指针是head,则把链表称之为表head。 建立一个空的单链表 : node * init ( ) { return NULL ; } 遍历操作 工作指针后移,从首结点出发,通过工作指针的反复后移而将整个单链表"审视"一次的方法。 输出单链表中各个结点的值 void display ( linklist head ) { linklist p ; p = head ; if (

C中堆管理—浅谈malloc,free,calloc,realloc函数之间的区别

拥有回忆 提交于 2020-03-01 03:05:02
在进行C/C++编程的时候,需要程序员对内存的了解比较好清楚,经常需要操作的内存可分为下面几个类别: 堆栈区(stack):由编译器自动分配与释放,存放函数的参数值,局部变量,临时变量等等,它们获取的方式都是由编译器自动执行的 堆区(heap):一般由程序员分配与释放,基程序员不释放,程序结束时可能由操作系统回收(C/C++没有此等回收机制,Java/C#有),注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。 全局区(静态区)(static):全局变量和静态变量的存储是放在一块儿的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放。 文字常量区:常量字符串是放在这里的,程序结束后由系统释放。 程序代码区:存放函数体的二进制代码。 C 标准函数库提供了许多函数来实现对堆上内存管理,其中包括:malloc函数,free函数,calloc函数和realloc函数。使用这些函数需要包含头文件stdlib.h。它们的声明如下: void * malloc(int n); void free (void * p); void *calloc(int n,int size); void * realloc(void * p,int n); 1. malloc函数 malloc函数可以从堆上获得指定字节的内存空间

C中堆管理—浅谈malloc,free,calloc,realloc函数之间的区别

孤者浪人 提交于 2020-03-01 03:04:40
在进行C/C++编程的时候,需要程序员对内存的了解比较好清楚,经常需要操作的内存可分为下面几个类别: 堆栈区(stack):由编译器自动分配与释放,存放函数的参数值,局部变量,临时变量等等,它们获取的方式都是由编译器自动执行的 堆区(heap):一般由程序员分配与释放,基程序员不释放,程序结束时可能由操作系统回收(C/C++没有此等回收机制,Java/C#有),注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。 全局区(静态区)(static):全局变量和静态变量的存储是放在一块儿的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放。 文字常量区:常量字符串是放在这里的,程序结束后由系统释放。 程序代码区:存放函数体的二进制代码。 C 标准函数库提供了许多函数来实现对堆上内存管理,其中包括:malloc函数,free函数,calloc函数和realloc函数。使用这些函数需要包含头文件stdlib.h。它们的声明如下: 1 void * malloc ( int n); 2 void free ( void * p); 3 void * calloc ( int n, int size); 4 void * realloc ( void * p, int n); 1. malloc函数

AutoCAD_ ID 、指针、句柄和 ads_name的区别

不想你离开。 提交于 2020-02-29 22:20:07
访问实体的特性必须通过对象指针,但是一旦你获得了实体的ID、句柄或者ads_name,都能通过ID作中介而获得对象的指针。其中ID是一个桥梁。句柄是Windows编程一个常用的概念,在ObjectARX编程中一般指AcDbHandle类(也可指Windows编程的界面元素),该类封装了一个64位整形标识符,随DWG文件一同保存。ads_name则是在ADS编程中出现的一个概念,其实际上是一个二维数组,数组元素类型为长整型,在与用户交互的函数中经常用到。 ID、句柄和 ads_name 具有各自的 特点 : (1) AcDbObjectId:当dwg图形被打开后,数据库中的实体对象都会在内存中对应一个唯一的id(AcDbObjectId),AcDbObjectId也是与对象相关联的唯一标识符.AcDbObjectId仅存在于其所存在的数据库从内存中产生到数据库被删除之间.如果操作多个dwg,AcDbObjectId在多个数据库之间都是唯一的. (2) AcDbHandle:dwg文件中每一个实体都有一个唯一的标识符,用AcDbHandle表示,在一个AutoCAD中,不能保证每个实体的句柄都唯一。在autoCAD的两个Dwg中同一实体的句柄是相同的。实体的AcDbHandle可以随dwg文件被保存,所以即使dwg未被cad打开,也可以根据句柄搜索dwg文件获取对象信息. (3)

Delphi指针类型

不羁的心 提交于 2020-02-29 22:17:14
首先新建一个控制台项目:练习下指针类型的数据赋值和使用 program Project1; {$APPTYPE CONSOLE} uses SysUtils; type pint=^Integer;//定义指针类型 var a:Integer; b:Integer; c:Integer; pt:pint;//整形指针 p:Pointer;//无类型指针 begin a:=2; b:=3; pt:=@b;//整形指针指向整形数据 Writeln('pt=', pt^); p:=@a;//无类型指针指向整形数据 //Writeln('p=', p^);错误,无类型指针不能直接使用 Writeln('p=', Integer(p^)); //c:=p^;错误,无类型指针不能直接赋值给其他变量 c:=Integer(p^); Writeln('c=', c); pt:=p;//指针间赋值,可以不用类型转换 Writeln('pt=', pt^); Readln; end. 来源: https://www.cnblogs.com/qqook/p/3466872.html

常见的单链表题目

不羁岁月 提交于 2020-02-29 22:10:10
1、判断一个单链表中是否有环 思路:给定两个指针fast和low都指向头结点,然后low每次前进一步,fast每次前进两步,如果此单链表中有环,那么fast和low一定会相遇,否则fast一定会先遇到null。实现代码如下: bool isCircle(LinkList *head){ LinkList *fast = head;//快指针 LinkList *low = head;//慢指针 while(low->next != NULL && fast->next->next != NULL) { low = low->next; fast = fast->next->next; if (low == fast) { return true; } } return false;} 现在还有个问题需要思考, 为什么如果链表有环,fast和low就一定会相遇呢? 假设单链表长度为n,且该单链表是环状的。 ① 若low和fast的起点相同,那么第i次迭代时,low指向元素(i mod n),q指向(2i mod n)。因此当i≡2i(mod n)时,fast和low相遇。而i≡2i(mod n) → (2i-i)mod n=0 → (i mod n) = 0 →当i=n时,fast和low相遇。 ② 若low和fast的起点不同,假设第i次迭代时low指向元素(i mod n)

快速排序算法

孤街浪徒 提交于 2020-02-29 21:25:35
一、前言 快排是体现了分治法的经典算法,那么我们能从中获取的绝对不止是学到了一个排序算法,更重要的是分治法的核心思想—分。 快排的核心是如何分,然后才是治之。即分而治之。 二、快排的实现 快排的核心在于对待排序数组的划分,然后把小的都放在左边,大的都放在右边,不断的缩小划分的范围,最后出来的就是一个升序的数组。 一个元素是大还是小是相对于一个比较的值而言的,那这个值就叫主元。 例如: {4,3,1} 我们定3为主元,那么1应该放到3左边,4应该放到3的右边, 最后出来的就是 {1,3,4} 这样一个有序的数组。 一个长度为20的数组,第一次划分出左10个右10个元素(划分主元理想状态下) 然后左边的10个再5、5划分,右边的元素再5、5划分,依次进行,每次划分的范围都越来越小,重复着划分排序这一步骤,最后进行合并即可(其实都不用合并,因为当划分完后就是一个有序的数组了)。 很明显这是一个递归调用。划分,每次除了规模大小不一样之外,其他都是一样的。注意:主元也是会动态改变的,并不是固定的。 重点:划分 快排的核心在于划分,划分有三种算法。 掌握划分算法与思想,才是我们学习快排的目的。 划分算法有三种: 1、单向扫描法 思路: 三定一循环两交换 步骤 定义一个主元p, 默认为左边界第一个元素 定义一个左指针 left(起点,p+1) 定义一个右指针 right(终点

数组指针一些理解

安稳与你 提交于 2020-02-29 19:26:32
printf ( "%d" , * p ++ ) ; //注意此处是先进行后面的运算p++; printf ( "%d" , * ++ p ) ; printf ( "%d\n" , p [ i ] ) ; //此时指针就相当于数组名 printf ( "%-2d" , ( * p ) ++ ) ; //如果数组是a[6]={1,1,1,1,1} , 则应该打印 { 1 , 2 , 3 , 4 , 5 } printf ( "%-2d" , a [ 0 ] ++ ) ; //与上结果` 1 a 是数组首元素的地址,所以 a 的值和 & a [ 0 ] 的值相同,另一方面,a [ 0 ] 本身是 包含 4 个整数的数组,因此,a [ 0 ] 的值同其首元素的地址 & a [ 0 ] [ 0 ] 相同。简单的 讲,a [ 0 ] 是一个整数大小对象的地址,而 a 是 4 个整数大小对象的地址。因为整 数和 4 个整数组成的数组开始于同一个地址,因此 a 和 a [ 0 ] 的值是相同的。 2 , a 所指的对象大小是 4 个 int , 而 a [ 0 ] 所指的对象大小一个 int , 因此,a + 1 和 a [ 0 ] + 1 的结果是不同的。 3 ,二维数组名解引用,降维为一维数组名。 * ( a + 1 ) < > a [ 1 ] 4 , 一维数组名,对其引用

typedef函数指针用法

安稳与你 提交于 2020-02-29 16:45:49
1.简单的函数指针的应用 形式1:返回类型(*函数名)(参数表) [cpp] view plain copy char (*pFun)( int ); char glFun( int a){ return ;} void main() { pFun = glFun; (*pFun)(2); } 第一行定义了一个指针变量pFun。首先我们根据前面提到的“形式1”认识到它是一个指向某种函数的指针,这种函数参数是一个int型,返回值是char类型。只有第一句我们还无法使用这个指针,因为我们还未对它进行赋值。 第二行定义了一个函数glFun()。该函数正好是一个以int为参数返回char的函数。我们要从指针的层次上理解函数——函数的函数名实际上就是一个指针,函数名指向该函数的代码在内存中的首地址 然后就是main()函数了,它的第一句您应该看得懂了——它将函数glFun的地址赋值给变量pFun。main()函数的第二句中“*pFun”显然是取pFun所指向地址的内容,当然也就是取出了函数glFun()的内容,然后给定参数为2。 2.使用typedef更直观更方便 形式1:typedef 返回类型(*新类型)(参数表) [cpp] view plain copy typedef char (*PTRFUN)( int ); PTRFUN pFun; char glFun( int a){

c++指向结构体变量指针

爱⌒轻易说出口 提交于 2020-02-29 16:34:12
转自http://www.jb51.net/article/42140.htm 定义: 结构体变量的指针就是该变来那个所占据的内存段的起始地址。可以设一个指针变量,来指向一个结构体变量,此时该指针变量的值是结构体变量的起始地址。 设p是指向结构体变量的数组,则可以通过以下的方式,调用指向的那个结构体中的成员: (1)结构体变量.成员名。如,stu.num。 (2)(*p).成员名。如,(*p).num。 (3)p->成员名。如,p->num。 代码如下: #include<iostream> #include<string> using namespace std; struct Candidate{ string name; int count; }; int main(){ Candidate c_leader[2]={"Tom",5,"Marry",8}; Candidate *p1,*p2; p1=c_leader; cout<<(*p1).name<<":"<<(*p1).count<<endl; p2=&c_leader[1]; cout<<p2->name<<":"<<p2->count<<endl; return 0; }    说明,结构体数组也和其他数组一样,一维数组的数组代表首个元素的地址 我们了解到,结构体中可以包含很多类型的成员变量