嵌入式学习16-结构体及链表

1.结构体的常用形式及注意事项

注意:
1.1结构体类型,可以定义在 函数里面,但是此时作用域就被限定在改函数中
1.2结构体的定义的形式:
形式1 先定义类型,后定义变量 
struct stu
{
...
};

struct stu s;
形式2 定义类型的同时定义变量
struct stu
{
...
}s1,s2,*s3,s4[10];

struct stu s;
 
形式3 省略了类型名 --如果只用一次,可以这样写

struct 
{
...
}s1,s2,*s3,s4[10];
------------------------------
自然边界对齐 
int -- 4字节 --- 能被4整除的地址编号上 
short -- 2字节 --- 能被2整除的地址编号上 
char -- 1字节 --- 能被1整除的地址编号上

结构体整体对齐
一般是以结构体 
2.共用体概念及注意事项

union 共用体名
{
  成员列表; //各个变量 
}; //表示定义一个共用体类型 


注意:
1.共用体 
  初始化 --- 只能给一个值,默认是给到第一个成员变量
2.共用体成员变量辅助 
  共用体用的数据最终存储的 --- 应该是最后一次给到的值
  但是只能影响自己数据类型对应的空间中的数据
3.可以判断大小端 
4.实际用途 
  a.节省空间 
  b.进行数据转换 

  192.168.1.169 //ip本质是个 32位的数值 
  
5.共用体的大小  --是成员变量中最大的那个成员的大小

 6.共用体类型可以是函数参数,也可以是函数返回值类型 。
 

   共用体,结构体类型定义出来之后,
    a.定义变量
    b.定义数组
    c.定义指针 
    d.做函数参数,返回值类型 

3.枚举

在使用 case1 表示 星期一时,会出现代码可读性差,出现魔数幻数,不知其含义

所以需要用枚举功能,做到名称替换。

enum  枚举类型名 
{
    sun,  //名字 --- 代表一个值 --- 符号常量 
    mon,
    tue,
    wed,
    thu,
    fri,
    sat
};

注意:
1.枚举  提高了代码可读性 
2.枚举 本质上是 int类型 
  枚举 与 整型 类型兼容 
3.不足
  因为枚举类型 --- 本质上是个整型类型,
  所以枚举类型的变量的值,并不能真正限定在指定的哪些值范围中  
4.枚举类型 
  可以做函数 形参 和 返回值 
  定义数组也可以,本质上就是整型数据 

4.链表

链表
数据结构:
   数据的组织形式 (逻辑上理解的形式)
   

数组:
int a[10] = {1,2,3,4,5,6,7,8,9,10}; //连续性,有序性,单一性 


数据组织形式 ---会决定使用数据的算法 


数组: //顺序表 
   优点:
     随机访问 方便 
   缺点:
     增加数据 不方便 
     删除数据 不方便 
     
    
链表 狗链  找数据

链式的数据表 
 优点:
    增加 删除数据很方便 
 缺点:
    找数据不大方便 
    
计算机中:
   计算机如何体现链式数据结构
   [数据1]
   [数据2]


   存放链式数据的结构:
   节点 

   [数据|另外一个节点指针] 
   
                                             [数据1|指针]   ------->节点 
                                              [数据2|指针]
                                              [数据3|指针]


                                                                                    ------->[数据域|指针域]

学生信息

节点:
struct Node
{
//数据域 
  struct stu s;
//指针域
  struct Node *p; //指针类型 
}; 

//一个节点 
数据结构对应算法  --- 操作 


2.增加数据 方便
3.删除数据 方便 

操作:
1.创建一个链表 -- 空链表 

  //有头链表  --可以更方便的处理链表
  //无头链表 
  

 c语言阶段: 
 有头 单向链表 
 
 空链表:
 特点:
  只有头节点
  并且头节点的指针域 为NULL //相当于是尾节点

struct Node head = {0,NULL};
struct Node *p = &head;  
2.插入 
  创建一个新的节点 
  节点链接起来                 
尾插 
  
  思路:
     s1.创建一个新的节点
       struct Node *pNew = malloc(sizeof(struct Node)); 
       //放在了堆区 
      
     s2.找到尾节点 
       struct Node *p = &head;  //此时p在头节点 
       while( p->next != NULL )
       {
          p = p->next; //让p指向下一个节点 
       }
     s3.链接到尾节点后面
      p->next  = pNew;    
      pNew->next = NULL; //尾节点 
    
   void pushBack(struct Node *head)
   {
       s1.创建一个新的节点
       struct Node *pNew = malloc(sizeof(struct Node)); 
       //放在了堆区 
       //
     s2.找到尾节点 
       struct Node *p = head;  //此时p在头节点 
       while( p->next != NULL )
       {
          p = p->next; //让p指向下一个节点 
       }
     s3.链接到尾节点后面
      p->next  = pNew;    
      pNew->next = NULL; //尾节点 
   }
   
   
   int length(struct Node *head)
   {
      //统计有效节点的个数 
   }
                                                                                      //头插 
    
   void pushFront(struc Node *head,int data)
   {
      //1.创建新节点
      pNew 
      //2.链接 
      pNew->next = p->next;
      p->next = pNew;
   }
 

  • 10
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值