链表
空链表:
注意:函数不能返回局部变量的地址
操作:
1.创建空链表
2.头插
3.尾插
4.链表遍历
5.链表的长度
free:释放
删除:
头删
void popFront(struct Node *head)
{
//1.p指针变量指向首节点
//2.断开链表
head->next = p->next;
//3.释放p所在的节点
free (p);
}
void popFront (struct Node *head) //头删函数{if(isPuanduan(head==0)){struct Node *p = head->next; //定义一个结构体指针指向首节点head->next = p->next; //将下一个节点的地址给到头结点的指针域free(p);}}
尾删:
void popBake(struct Node *head)
{
//1.p定位到尾节点的前一个节点
while (p->next->next != NULL)
{
p = p->next;
}
//2.释放 p->next
//3.p所在节点成为了新的尾节点
p->next = NULL;
}
void popBake (struct Node *head) //尾删函数
{if (isPuanduan(head)==0) { struct Node *p = head; //定义一个结构体指针指向首节点while (p->next->next != NULL) //判断这个链表的指针域的下个指针域是否为空{p = p->next; //不是继续指向下一个}free(p->next); //删除尾节点p->next = NULL; //给现在指的节点的指针域为空}
}
位运算
位运算——0 1
用途
1、控制硬件,硬件的操作,往往都是操作对应的寄存器的位来实现的。
2、操作系统的某些文件信息的存储,通常也是用位来描述的。
比如: ls -l命令看到的关于文件的一些信息
3、许多压缩和加密操作都是直接处理的单独的位。
运算说明
& --- 有一个位为0,则结果为0,只有两个位都为1时,结果才为1
//逻辑运算中的规则:一假则假
l---有一个位为1,则结果为1 ,只有两个位都为0时,结果才为0
//逻辑运算中的规则:一真则真
~--- 0,1相反/逻辑运算中的规则:一假则假
^ ---相同为0相异为1
//同假异真
<<-----左移运算 数值<<位数 左移一次相当于乘二
>>-----右移运算 数值>>位数
偶数位置0:
#include <stdio.h>int main (void)
{int a = 0xffffffff;int i = 0;while(i<32){i+=2;a = a&(~(1<<i));}printf ("%#x\n",a);return 0;
}
基数位置1:
#include <stdio.h>int main (void)
{int a = 0x55555555;int i = 0;while (i<32){i++;if (i%2 != 0){a = a | (1<<i);}}printf("%#x\n",a);return 0;
}
异或运算:
//同假异真
int a = 0x33;
a ^ 0x55;
0011 0011
0101 0101 ^
----------
0110 0110 //0x66
<<
数值<<位数
int a = 0x33;
a<<1
0110 0110
6 6 //左移一位相当于乘以2
>>
右移:较为特殊
注意:看数据类型 有符号类型的数据,此时右移,最高位补符号 //算数右移
无符号类型数据 默认补零 //逻辑右移
统计int类型中1的个数
int a = 1213; //二进制中1的个数
#include <stdio.h>int main (void)
{unsigned int a = 1213;int i = 0;int cat=0;for (i = 0;i<32;++i){if(a>>i & 1){cat++;}}printf ("%d\n",cat);return 0;
}
预处理
不是c语言的一部分
编译过程的一部分
#include
#define N 10
预处理命令:
都是以 # 开头的
编辑程序 --vi
编译程序 --gcc
运行文件
. c———>可执行文件的过程
#include <stdio.h>
#define Pi 3.1415926
#define Max(a,b) (a)>(b)?(a):(b)int main (void)
{
#if 0float s = 0;float r = 6;float C = 0;scanf ("%f",&r);printf ("s = %.2f C = %.2f\n",Pi*r*r,2*Pi*r);
#endifint a=0;int b=0;scanf("%d%d",&a,&b);printf ("Max = %d\n",Max(a,b));return 0;
}
宏定义
#define 宏名
预处理过程:文本的原样替换
带参宏:
文本替换 --- 有可能导致,
源代码的体积变大 。
快 --预处理阶段干
编译之后,对应的代码就已经在可执行代码中了
函数:
调用 ---- 只有一份代码
会有时空开销。
可以选择带参宏,功能小,代码量少。