链表
空链表:
注意:函数不能返回局部变量的地址
操作:
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 宏名
预处理过程:文本的原样替换
 带参宏:
        文本替换 --- 有可能导致,
        源代码的体积变大 。
        快 --预处理阶段干 
        编译之后,对应的代码就已经在可执行代码中了
  函数:
        调用 ---- 只有一份代码
        会有时空开销。
可以选择带参宏,功能小,代码量少。





















