C语言+数据结构总结

一、C语言部分

1、数据类型:

Int      	整形               4字节

Short	   短整形              2字节

Long	   长整形              4字节

Float 	  单精度浮点型         4字节

Double     双精度浮点型        8字节

Char         字符型            1字节

2、变量

  1. 全局变量:作用于全局的变量。即生命周期为程序的开始到程序的结束。
  2. 局部变量:作用于中指定区域的变量。main()函数中的局部变量生命周期等同于全局变量
  3. 当全局变量与局部变量的变量名相同时,局部变量优先使用

3、常用关键字

  1. static:用static修饰的变量不会因函数的结束而被释放。
  2. break:结束整个循环,当循环多层嵌套时,运用break只能结束一层循环;跳出switch语句,如果不用break,在运行完当前case语句后继续运行下一条case语句。
  3. continue:结束本次循环,即本次循环中continue后的语句不执行。
  4. sizeof:计算数据结构或类型所占空间大小。

4、if…else语句:

if(表达式)
{
   语句a;
}
else
{
   语句b;
}

如果表达式结果为真,则执行语句a,反之执行语句b。

5、switch…case语句:

switch(i)
{
 case a:语句1;break;
case b:语句2;break;
case c:语句3;break;
defluat:语句4break;
}

如果i等于a,则执行语句1,等于b时,执行语句2,如果没有与i对应的case语句,就执行default语句。

6、while循环:

While(表达式)
{
   循环体;
}

While循环先判断表达式的结果真假,为真就执行循环体,直到条件表达式的结果为假时跳出循环。

7、do…while循环:

do
{
   循环体;
}while(表达式)

无条件先执行循环体,在进行表达式结果真假性判断。

8、for循环

for(表达式1;表达式2;表达式3)
{
   循环体;
}

先执行表达式1,只执行一次,再进行表达式2真假性判断,为真时执行循环体,接着执行表达式3,在对表达式2进行判断,当表达式2为假时跳出for循环。

9、goto语句:

//跳转标记:
//语句段;
//goto 
//跳转标记;

int c=0;
scanf("%d",&c);
aa:
	a=0;
	b=0;
	if(c>10)
		goto aa;

当执行到goto语句时,跳转到跳转标记处,开始执行跳转标记后的语句段。执行goto语句时无条件跳转,可跳出多层循环,这是break所不具备的。goto语句也可构成一个循环。

10、函数的参数

(1)实际参数(实参):

真实传给函数的参数,叫实参。实参可以是:常量、变量、表达式、函数等。无论实参是何种类型的量,在 进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。

(2)形式参数(形参):

形式参数是指函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才实例化(分配内存单 元),所以叫形式参数。形式参数当函数调用完成之后就自动销毁了。

11、函数递归

(1)概念:
程序调用自身的编程技巧称为递归。

(2)递归的两个必要条件 :
存在限制条;每次递归调用之后越来越接近这个限制条件

12、数组

(1)一维数组

int arr[10];

数组是一组相同类型元素的集合。arr[10]数组从arr[0]开始到arr[9]共10个元素,没有arr[10]这个元素。数组是数组,不是指针,只是数组名具有指针的特性。

关于一维数组名的运用:

arr               arr数组
arr+0             arr数组首元素
*arr              arr数组首元素值
&arr              arr数组的地址
&arr+1            下一个数组的地址(越界)
&arr[0]           arr[0]的地址
&arr[0]+1         arr[1]的地址

(2)二维数组

int arr[3][4];

二维数组不要理解成3列4行的矩阵的样式,应该理解为有3组元素个数为4的一维数组的集合,例:

arr[3][4]={
   {0,1,2,3};
   {4,5,6,7};
   {8,9,10,11}
};

关于二维数组名的运用:

arr[0][0]               arr数组首元素的值
arr[0]               arr数组中第一个一维数组
arr[0]+1             arr数组中第二个一维数组
*(arr[0]+1)        arr数组中第一个一维数组第二个元素的值
&arr[0]+1             arr数组中第二个一维数组的地址

(3)数组作为参数传参时传的是数组首元素的地址。

13、指针

指针是一个变量,存放着某一指定的变量单元的地址。例:

int a=10;
int *p=&a;

定义一个整形变量a,并初始化为10,在定义一个指向整形变量a的指针变量p,用于存放a的地址。因为存放着a的地址,故而可以通过指针p来访问a,对其解引用操作: printf(“%d”,*p);输出结果为10,。也可通过指针p来修改a的值,如:*p=12;printf(“%d”,a);输出结果为12。

指针的大小在32位平台的大小为4个字节,与其指向的数据类型无关。

指针的运算一般与数组相结合,指针加1表示指针向后移动其指向数据类型大小个字节。p+1就表示指针p向后移动4个字节。

14、结构体

Struct A
{
   int a;
   int b[10];
   char  *arr;
};

结构体是一些变量的集合,可以是单个的变量,数组,指针,也可以是结构体,结构体传参一般传结构体的地址,效率是最高的。

(1)结构体内存对齐:

**

原因:

不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址 处取某些特定类型的数据,否则抛出硬件异常。

数据结构(尤其是栈)应该尽可能地在自然边界上对齐。
原因在于,为了访问未对齐的内存,处理 器需要作两次内存访问;而对齐的内存访问仅需要一次访问。

规则:

第一个成员在与结构体变量偏移量为0的地址处。

其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。 VS中默认的值为8

结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。

如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是
所有最大对齐数(含嵌套结构体的对齐数)的整数倍

(2)结构体数组

Struct A a[10];

定义一个结构体数组a[10],该数组每个元素都代表一个结构体变量,共10个元素。

15、枚举

enum Day
{    
	Mon,
	Tues,
	Wed,    
	Thur,   
	Fri,   
	Sat,   
	Sun 
}

定义一个枚举类型Day,其内容为所有取值可能,也叫枚举常量,如果没有对枚举常量赋值,则第一个枚举常量的值默认为0,后面依次加1。

16、动态内存你分配

(1)void malloc (size_t size);*

这个函数向内存申请一块连续可用的空间,并返回指向这块空间的指针。如果开辟成功,则返回一个指向开辟好空间的指针。 如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查。 返回值的类型是 void* ,所以malloc函数并不知道开辟空间的类型,具体在使用的时候使用者自己来决定。
如果参数 size 为0,malloc的行为是标准是未定义的,取决于编译器。

(2) void calloc (size_t num, size_t size);*

该函数的功能是为 num 个大小为 size
的元素开辟一块空间,并且把空间的每个字节初始化为0。 与函数
malloc 的区别只在于 calloc 会在返回地址之前把申请的空间的每个字节初始化为全0

(3)void realloc (void ptr, size_t size);**

ptr 是要调整的内存地址 size 调整之后新大小 返回值为调整之后的内存起始位置。
这个函数调整原内存空间大小的基础上,还会将原来内存中的数据移动到 新 的空间。

(4)void free (void ptr);*

free函数用来释放动态开辟的内存。 如果参数 ptr 指向的空间不是动态开辟的,那free函数的行为是未定义的。 如果参数 ptr 是NULL指针,则函数什么事都不做。

17、文件

(1)文件指针

缓冲文件系统中,关键的概念是“文件类型指针”,简称“文件指针”。

每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名字,文件状态
及文件当前的位置等)。这些信息是保存在一个结构体变量中的。该结构体类型是有系统声明的,取名FILE.

(2)打开、关闭一个文件

//打开文件
FILE* fopen ( const char * filename, const char * mode ); 
//关闭文件
int fclose ( FILE * stream );

(3)文件打开方式

 “r”         只读
“w”          只写
“a”          向文本文件尾添加数据 
“rb”         二进制形式读文件(只)
“wb”         二进制形式写文件 
“ab”         向一个二进制文件尾添加数据
“r+”         为了读和写,打开一个文本文件
“w+”         为了读和写,建议一个新的文件
“a+”         在文件尾进行读写 
“rb+”        为了读和写打开一个二进制文件
“wb+”        新建一个新的二进制文件读和写
“ab+”        打开一个二进制文件,在文件尾进行读和写

(4)sprintf(buf,”%d”,a);

把变量a以十进制的形式打印给字符型数组buf。

Sscanf(buf,“%c”,&a);

从字符型数组中获取一个字符并赋给a。

fprintf(fp,%d”,a);

fp是指向一个文件的文件指针,该函数是将a以十进制形式写入fp指向的文件中。

fscanf(fp,%d”,&a);

fp是一个指向文件的指针,该函数是从fp指向的文件中以十进制形式读取数据并赋给a。

二、数据结构

1、单链表

概念:
链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链
接次序实现的。

Typedef struct List
{
   Int data;
   struct List *next;
}ListNode;

插入一个节点:

ListNode *tem=(ListNode*)malloc(sizeof(ListNode));
tem->data=data;
tem->next=head->next;
head->next=tem;

删除一个节点:

ListNode *tem=head;
for(;tem->next!=NULL;tem=tem->next)
{
   if(tem->data==data)
   {
      tem->next=tem->next->next;
	break;
}
}

删除链表头:

ListNode *tem=*head)->next;
Free(*head);
*head=tem;

2、栈

概念:
一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端
称为栈顶,另一端称为栈底。遵循先入后出的规则。

3、队列

概念:
只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出入队列:进行插入操作的一端称为队尾
出队列:进行删除操作的一端称为队头。

4、二叉树

概念 :
一棵二叉树是结点的一个有限集合,该集合或者为空,或者是由一个根节点加上两棵别称为左子树和右子树
的二叉树组成。

二叉树的特点:

  1. 每个结点最多有两棵子树,即二叉树不存在度大于2的结点。
  2. 二叉树的子树有左右之分,其子树的次序不能颠倒。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值