我要成为嵌入式高手之2月1日第十六天!!

结构体 、共用体、枚举

一、结构体的对齐规则:

1.在32位的平台上,默认都是按4字节对齐的。  64位的平台 默认是8字节

2.对于成员变量,各自在自己的自然边界上对齐。//整个结构体的对齐 

3.如果 成员变量中有比4字节大。此时 整个结构体按照4字节对齐。

4.如果 成员变量中没有有比4字节大。 此时 整个结构体按照最大的那个成员对齐。

注意:

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];

二、公用体

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

2、注意:

1.共用体初始化 --- 只能给一个值,默认是给到第一个成员变量的

2.共用体成员变量赋值—共用体用的数据最终存储的 --- 应该是最后一次给到的值。
  但是只能影响到 自己数据类型对应的空间中的数据

3.可以判断大小端 

4.实际用途:a.节省空间  b.进行数据转换 

5.共用体的大小  --是成员变量中最大的那个成员的大小

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

我要成为嵌入式高手之2月1日第十六天!!_第1张图片我要成为嵌入式高手之2月1日第十六天!!_第2张图片 

三、枚举

枚举:一枚一枚列举 、逐个列举 

        如果一个变量只有几种可能的值,则可以定义为枚举类型(如一周的七天)。所谓“枚举”是指将变量的值一一列举出来,变量的值只限于列举出来的值的范围内。

语法:声明枚举类型用enum 开头。

如:打印出对应的英文的星期

        enum weekday
        {
        sun,
        mon,
        tue,
        wed,
        thu,
        fri,
        sat
        };

注意:

1.枚举  提高了代码可读性

2.枚举 本质上是int类型 、枚举 与 整型 类型兼容

3.不足

        因为枚举类型 --- 本质上是个整型类型,所以枚举类型的变量的值,并不能真正限定在指定的哪些值范围中

4.枚举类型 可以做函数 形参 和 返回值,定义数组也可以,本质上就是整型数据

练习: 
   无人机的状态
   0 --flying 
   1 --stop
   2 --holding 
  从键盘输入0~2 打印无人机的状态 

#include

enum plain
{
    flying,
    stop,
    holding
};

int main(void)
{
    int i;
    printf("Input a num to decide the airplina condition: \n");
    scanf("%d",&i);

    switch (i)
    {
        case flying:
            printf("The airplina is flying!\n");
            break;
        case stop:
            printf("The airplina stoped.\n");
            break;
        case holding:
            printf("The airplina holds on flying.\n");
            break;
    }

    return 0;
}

四、链表

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

1、数组: 顺序表

        优点:随机访问 方便 

        缺点:增加数据 不方便,删除数据 不方便 

2、链表:链式的数据表 

        优点:增加 删除数据很方便

        缺点:找数据不大方便

3、计算机如何体现链式数据结构?

 存放链式数据的结构: 节点:[数据|另外一个节点指针]

例如:学生信息

节点:

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

4、操作

(1)创建一个链表 -- 空链表

        strcut Node head = {0,NULL} 

        struct Node *p = &head

空链表的特点:

只有头节点,并且头节点的指针域 为NULL。   // 相当于是尾节点

(2).插入

创建一个新的节点 、节点链接起来

尾插

思路:

s1.创建一个新的节点

s2.找到尾节点

s3.链接到尾节点后面

void pushBack(struct Node *head,int data)
{
    //1、创建一个新的节点
    struct Node *pNew = malloc(sizeof(struct Node));//堆区开辟空间放入
    pNew->data = data;
    //2、找到尾节点
    struct Node *p = head;//此时p在头节点

    while (p->next != NULL)//找空地址所在的节点就是尾节点
    {
        p = p->next;//让p指向下一个节点,再次判断
    }
    //3、连接到找到的尾节点后面
    p->next = pNew;
    pNew->next = NULL;//设置为尾节点
}

练习:统计有效节点个数
 

#include 
#include 

struct Node
{
    int data;
    struct Node *next;
};

int isEmpty(struct Node *head)
{
    if (head->next == NULL)
    {
        return 1;
    }else
    {
    return 0;
    }
}

int len(struct Node *head)
{
    struct Node *p = head->next;
    int cnt = 0;
    
    while (p != NULL)
    {
        cnt++;
        p = p->next;
    }
    return cnt;
}

int main(void)
{
    struct Node head;
    head.next = NULL;//空链表
    pushBack(&head,1);
    pushBack(&head,2);
    pushBack(&head,3);
    pushBack(&head,4);
    pushBack(&head,5);
    
    printf("%d\n",len(&head));

    return 0;
}


头插 

1.创建新节点

2.链接

void pushFront(struct Node *head,int data)
{
    struct Node *pNew = malloc(sizeof(struct Node));
    pNew->data = data;

    struct Node *p = head;
    pNew->next = head->next;
    p->next = pNew;
}

你可能感兴趣的:(linux,c语言)