Day 17------C语言收尾之链表的删除、位运算、预处理、宏定义

链表

空链表:

注意:函数不能返回局部变量的地址

操作:

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 

int main (void)
{
	
   int a = 0xffffffff;

	int i = 0;
	while(i<32)
	{
		i+=2;
		a = a&(~(1<

基数位置1:

#include 

int main (void)
{
    int a = 0x55555555;

	int i = 0;
	while (i<32)
	{
		i++;
		if (i%2 != 0)
		{
			a = a | (1<

异或运算:

  //同假异真
   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 

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 
运行文件 

Day 17------C语言收尾之链表的删除、位运算、预处理、宏定义_第1张图片

 . c———>可执行文件的过程
Day 17------C语言收尾之链表的删除、位运算、预处理、宏定义_第2张图片

Day 17------C语言收尾之链表的删除、位运算、预处理、宏定义_第3张图片

#include 
#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   宏名

预处理过程:文本的原样替换

 带参宏:
       文本替换 --- 有可能导致,
       源代码的体积变大 。
       快 --预处理阶段干 
       编译之后,对应的代码就已经在可执行代码中了
 函数:
       调用 ---- 只有一份代码
       会有时空开销。

 可以选择带参宏,功能小,代码量少。

Day 17------C语言收尾之链表的删除、位运算、预处理、宏定义_第4张图片

Day 17------C语言收尾之链表的删除、位运算、预处理、宏定义_第5张图片

你可能感兴趣的:(开发语言,c语言,学习,数据结构)