c指针

【C/C++】实现数据结构广义表

末鹿安然 提交于 2020-03-01 07:40:01
1. 广义表的定义 每个元素可以为Atom,原子,也可以为线性表。 线性表的推广。线性表元素有唯一的前驱和后继,为线性表,而广义表是多层次的线性表 表头:第一个元素,可能是原子,可能是广义表 表尾:除了第一个元素,剩余的元素,所构成的广义表 举例: A = (a,b,(c,d),e) head(A) = a tail(A) = (b,(c,d),e) 遍历操作: 取表头,取表尾 ,取表头.. 长度:最外层的元素数,即最外层的','+1 深度:括号层数 2. 广义表的两种存储结构(子表法) 2.1链式存储结构 - 每个数据元素可以用一个节点表示 元素可以为原子或列表 原子节点:标志域、值域 列表节点:标志域、指示表头的指针域、指示表尾的指针域 空表:A = NULL 除了空表,表头指针指向一个表节点,表节点再分表头、表尾... 最高层表节点(可能原子、子表)的个数就是表长度? A = (a,b,(c,d),e) 最高层表头是先a,表尾是(b,(c,d),e),表头是b,表尾((c,d),e)..就是第一层的表尾直到为空之前,有过的表尾指针+1 判断是否在同一层次? 是这样的: 最高层处于同一层,后继的tail指针指向的是同一层,否则,head指针,或者表头是Atom,都是下一层。 2.2扩展线性表存储结构 不是用表头表尾指针了,而是,每一个节点,不管是子表还是原子

c的详细学习(10)结构体与共用体的学习(二)

橙三吉。 提交于 2020-02-11 04:47:24
在c语言中,结构体数据类型与共用体数据类型都属于构造类型。共用体与结构体数据类型在定义上十分相似,但它们在存储空间的占用分配上有本质的区别。结构体变量是各种类型数据的集合,各成员占据不同的存储空间,而共用体变量的所有成员占用相同的存储空间,在某一时刻只有一个成员起作用。 (1)共用体类型的定义 定义共用体类型的一般形式: union 共用体类型名 { 数据类型 成员名1; 数据类型 成员名2; 数据类型 成员名3; ...... }; 以上定义了一个名为data的共用体类型。它说明该类型由三个不同类型的成员组成,这些成员共享同一块存储空间。 (2)共用体变量的定义 与结构体变量的定义类似; (3)共用体变量的引用和初始化 1.引用共用体变量中的一个成员 引用共用体变量的成员的一般形式 共用体变量名.成员名 共用体指针变量->成员名 第一种引用方式应用于普通共用体变量,第二种引用方式应用于共用体指针变量。 union data a,*p=&a; 2.共用体类型变量的整体引用 可以将一个共用体变量作为一个整体赋给另一个同类型的共用体变量。例如: union data a,b; ...... a=b; 3.共用体变量的初始化 在共用体变量定义的同时只能用第一个成员的类型值进行初始化,共用体变量初始化的一般形式: union 共用体类型名 共用体变量={第一个成员的类型名}; 例如:

【校招面试 之 C/C++】第20题 C++ STL(二)之Vector

痴心易碎 提交于 2020-01-30 00:52:05
1、vector的动态增长   当添加元素时,如果vector空间大小不足,则会 以原大小的两倍另外配置一块较大的新空间,然后将原空间内容拷贝过来 , 在新空间的内容末尾添加元素,并释放原空间 。vector的空间动态增加大小,并不是在原空间之后的相邻地址增加新空间,因为vector的空间是 线性连续 分配的,不能保证原空间之后有可供配置的空间。因此,对vector的任何操作,一旦引起空间的重新配置, 指向原vector的所有迭代器就会失效 。 vector的size(),capacity(),reserve(),resize()函数: vector对象的内存布局如下图所示: start迭代器指向已用空间的首元素,finish指向已用空间的尾元素的下一个位置,end_of_storage指向可用空间的末尾。 size()函数返回的是已用空间大小,capacity()返回的是总空间大小,capacity()-size()则是剩余的可用空间大小。当size()和capacity()相等,说明vector目前的空间已被用完,如果再添加新元素,则会引起vector空间的动态增长。 由于动态增长会引起重新分配内存空间、拷贝原空间、释放原空间,这些过程会降低程序效率。因此,可以使用reserve(n)预先分配一块较大的指定大小的内存空间,这样当指定大小的内存空间未使用完时

C(五)

不想你离开。 提交于 2020-01-27 22:16:12
文件 打开文件: fopen(char *s,“r”) : 返回文件指针,打开不成功返回NULL。 打开方式: r : 只读,文本文件。 w : 只写,文本文件,创建新的并打开文件,无论是否存在,都创建新的,不是在原文件上动手脚。 a : 只写,文本文件,文件位置指针到最后,在文件末尾写。 b : 与上面结合表示打开二进制文件。 (+) :与上边结合表示读写。 feof(fp) : 判断文件位置指针是否到文件末尾,读到末尾返回真值。 关闭文件 fclose§; FILE * p = fopen ( "D:\\demo.txt" , "r" ) ; //D:\\两个反斜杠因为转义字符 文件读写 文件有一个文件指针和一个不可见的读写位置指针,每读写多少文件位置指针就后移多少,文件的读写都是从文件位置指针处开始的,要手动移动文件位置指针可用 fseek ( file * p , long offset , int fromwhere ) ; 从formwhere处移动offset个字节,来指示下一个要读写的数据位置。 offset 为正向后移动,为负向前移动,规定为长整型数据。 fromwhere: SEEK_SET或0:起始位置 SEEK_CUR或1:当前位置 SEEK_END或2:文件结尾 rewind ( file * p ) ; 将文件位置指针指向文件头。 按字符读写 fgetc

C基础第26课--指针的本质分析

懵懂的女人 提交于 2020-01-25 09:25:03
学习自狄泰软件学院唐佐林老师C语言课程,文章中图片取自老师的PPT,仅用于个人笔记。 实验1 #include <stdio.h> int main() { int i = 0; int* pI; char* pC; float* pF; pI = &i; *pI = 10; printf("%p, %p, %d\n", pI, &i, i); printf("%d, %d, %p\n", sizeof(int*), sizeof(pI), &pI); printf("%d, %d, %p\n", sizeof(char*), sizeof(pC), &pC); printf("%d, %d, %p\n", sizeof(float*), sizeof(pF), &pF); return 0; } mhr@ubuntu:~/work/C$ mhr@ubuntu:~/work/C$ ./a.out 0x7ffe8ce0710c, 0x7ffe8ce0710c, 10 8, 8, 0x7ffe8ce07110 8, 8, 0x7ffe8ce07118 8, 8, 0x7ffe8ce07120 mhr@ubuntu:~/work/C$ 注意: 函数调用时候实参将复制给形参!!! 实验2 #include <stdio.h> int swap(int* a, int* b) { int c

C基础第28课--指针和数组分析(上)

南楼画角 提交于 2020-01-22 00:51:34
学习自狄泰软件学院唐佐林老师C语言课程,文章中图片取自老师的PPT,仅用于个人笔记。 实验1 #include <stdio.h> int main() { int a[5] = {0}; int* p = NULL; printf("a = 0x%X\n", (unsigned int)(a)); printf("a + 1 = 0x%X\n", (unsigned int)(a + 1)); printf("p = 0x%X\n", (unsigned int)(p)); printf("p + 1 = 0x%X\n", (unsigned int)(p + 1)); return 0; } mhr@ubuntu:~/work/C$ mhr@ubuntu:~/work/C$ ./a.out a = 0xCD11B2D0 a + 1 = 0xCD11B2D4 p = 0x0 p + 1 = 0x4 mhr@ubuntu:~/work/C$ mhr@ubuntu:~/work/C$ 实验2 #include <stdio.h> int main() { char s1[] = {'H', 'e', 'l', 'l', 'o'}; int i = 0; char s2[] = {'W', 'o', 'r', 'l', 'd'}; char* p0 = s1; char* p1 =

C和指针第一章

筅森魡賤 提交于 2020-01-16 10:11:34
1.逻辑上删除一段代码: 用/**/注释掉不用的代码是危险的,因为如果注释的这段代码中如果有/**/出现,就会出现问题 最佳方法:利用预处理命令,以下命令,由于if后边是0,即false,就永远不会执行这段预处理代码 #if 0 statement #endif 2.预处理代码 #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_CLOS 20 /*所能处理的最大列号*/ #define MAX_INPUT 1000 /*每个输入行的最大长度*/ 这是预处理器的工作,需要将头文件文件stdio.h等插入到源码的位置,然后把修改过的源代码交给编译器。 此处的预处理还定义了两个常量,在以后需要更改他们的值,只需要在此处更改一次,其他地方此变量的值都会更改。 3.声明函数原型 int read_column_numbers(int columns[], int max ); void rearrange(char *output, char const *input, int n_columns, int const columns[]) ; 这些声明被称为函数原型,这是告诉编译器在源代码中定义的函数特征,在调用这些函数的时候编译器会对其进行准确性检查 4.引用和值传递 int read

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-16 17:28:58
一、PTA实验作业(5分) 题目1:6-8 使用函数实现字符串部分复制 1. 本题PTA提交列表(要提交列表,不是结果) 2. 设计思路(伪代码或流程图) 伪代码: 函数定义void strmcpy( char *t, int m, char *s ) 定义i,n两个变量 for i=0 to *(t+i)!='\0' i++ end n=i //用循环记录字符的长度 判断输入的m是否小于长度n,若是进入循环{} for i=0 to *(t+m+i-1)!='\0' i++ { *(s+i)=*(t+m+i-1); end } *(s+i)='\0'; } 若m大于n则 *s='\0'; 流程图: 3.代码截图(注意,截图,截图,截图。不要粘贴博客上。不用用···语法去渲染) 4.本题调试过程碰到问题及PTA提交列表情况说明。 首先我遇到的情况是m=n时我没有将它考虑进去,我直接判断了m<n的情况,如上图所示。 还有就是我在判断从第m为开始输出时我是直接 p+m+i,其实是要 p+m+i-1,因为数组是从0开始的。 题目2:6-9 求子串在母串中最后一次出现的地址 1. 本题PTA提交列表(要提交列表,不是结果) 2. 设计思路(伪代码或流程图) 定义函数char *fun (char *s, char *t ){ 定义n,i,j,flag=0,l 5个变量 for i=0 to

C/C++ 智能指针线程池

二次信任 提交于 2019-12-05 01:56:58
ThreadPool.h { #ifndef __THREADPOOL_H__ #define __THREADPOOL_H__ #include <memory> #include <mutex> #include <iostream> #include <thread> #include <vector> typedef unsigned int THREADHANDLE; static THREADHANDLE ThreadHanle = -1; #define THREADBEGIN(var) if(var == ThreadHanle){return;} /* #include "ThreadPool.h" mutex m; void func(int threadID) { while (true) { THREADBEGIN(threadID); std::lock_guard<mutex> lg(m); static int time = GetTickCount(); static int index = 0; if (GetTickCount() - time >= 1000) { std::cout << index <<" threadNum: "<< threadID << std::endl; time = GetTickCount(); index++