当前位置: 首页 > news >正文

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

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

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

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

http://www.lryc.cn/news/294668.html

相关文章:

  • python_蓝桥杯刷题记录_笔记_全AC代码_入门5
  • 二叉树的详解
  • 【第三十五节】idea项目的创建以及setting和Project Structure的设置
  • 【c++】跟webrtc学引用计数
  • 开源免费的物联网网关 IoT Gateway
  • 华为OD机试真题C卷-篇3
  • [SWPUCTF 2021 新生赛]include
  • LeetCode、17. 电话号码的字母组合【中等,dfs回溯】
  • SSRF漏洞给云服务元数据带来的安全威胁
  • 【C++】强制类型转换
  • java日志框架总结(四 、JCL日志门面技术)
  • mfc140.dll丢失的几种修复方式,有效的解决文件丢失问题
  • 从一个小故事讲解观察者模式~
  • LeetCode、1137. 第 N 个泰波那契数【简单,动态规划】
  • Python爬虫urllib详解
  • Linux嵌入式开发+驱动开发-中断
  • android tv开发-1,leanback
  • chisel RegInit/UInt/U
  • 华为OD机试真题-田忌赛马-2024年OD统一考试(C卷)
  • QMUI_Android:提升Android开发效率与质量的利器
  • 如何部署Linux AMH服务器管理面板并结合内网穿透远程访问
  • C++文件操作(2)
  • Bootstrap5 图片轮播
  • WINDOWS搭建NFS服务器
  • LeetCode、216. 组合总和 III【中等,组合型枚举】
  • 支持534种语言,开源大语言模型MaLA-500
  • 面试 JavaScript 框架八股文十问十答第一期
  • 【发票识别】新增针对图片发票的识别(升级中)
  • 面试数据结构与算法总结分类+leetcode目录【基础版】
  • 音频二维码怎么制作出来的?支持多种格式音频生码的方法