链表
空链表:
注意:函数不能返回局部变量的地址
操作:
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 0
float s = 0;
float r = 6;
float C = 0;
scanf ("%f",&r);
printf ("s = %.2f C = %.2f\n",Pi*r*r,2*Pi*r);
#endif
int a=0;
int b=0;
scanf("%d%d",&a,&b);
printf ("Max = %d\n",Max(a,b));
return 0;
}
宏定义
#define 宏名
预处理过程:文本的原样替换
带参宏:
文本替换 --- 有可能导致,
源代码的体积变大 。
快 --预处理阶段干
编译之后,对应的代码就已经在可执行代码中了
函数:
调用 ---- 只有一份代码
会有时空开销。
可以选择带参宏,功能小,代码量少。