结构体--共用体--枚举 之难点——链表 奋力学习嵌入式的第十六天

2024-02-02 14:28

本文主要是介绍结构体--共用体--枚举 之难点——链表 奋力学习嵌入式的第十六天,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

结构体

注意:

1.结构体类型 可以定义在 函数里里面 但是此时作用域就被限定在该函数中

2.结构体定义形式

//形式一 限定一类型 后定义变量

struct stu
{
...
};

struct stu s;
//形式二 定义类型的同时 定义变量

struct stu
{
...
}s1,s2,*s3,s4[10];

struct stu s;

//形式三  省略了类型名-----只在使用一次的时候使用

struct 
{
...
}s1,s2,*s3,s4[10];

考点:

自然边界对齐

int ------四字节------能被4整除的地址编号

shout----二字节-----能被2整除的地址编号

char-----一字节------能被1整除的地址编号

共用体

union  共用体名

{

      成员列表   

};  //表示定义一个共用体类型

注意:

1.初始化时 只能能给到一个值  默认是给到第一个成员变量的

2.共用体成员辅助

  共用体用的数据最终储存的------是最后一次给到的值

  但是只能影响到 自己数据类型对用空间中的数据

3.可以判断大小端

#include <stdio.h>union dome
{int a;short b;char c;
};int main (void)
{union dome s;s.a=0x12345678;s.b=0x1298;s.c='c';printf ("a=%#x\n",s.a);printf ("b=%#x\n",s.b);printf ("c=%#hhx\n",s.c);return 0;
}
a=0x12341263
b=0x1263
c=0x63

4.实际用途:节约空间  、  进行数据转换

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

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

  共用体,结构体类型定义出来之后:

a.定义变量;

b.定义数组;

c.定义指针;

d.做函数参数,返回值类型

枚举

一枚一枚的列举

逐个列举

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

eg:

//从键盘输入l~7
打印出对应的英文的星期
声明枚举类型用enum开头。

例如:

enum weekday     //枚举类型名
{

    sun ,        //名字---代表一个值-----符号常量

    mon ,

    tue ,

    wed ,

    thu ,

    fri,

    sat

};
enum //关健词---枚举

注意:

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

2.枚举本质上是int型

    枚举与整型互相兼容

3.不足:因为枚举类型本质上是一个整型类型  所以枚举类型的变量的值  并不能真正限定在指定的那些范围中

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

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

#include <stdio.h>enum Flight_status
{flying,stop,holding
};int main (void)
{int a;printf ("intput number : \n");scanf ("%d",&a);switch (a){case flying:printf ("flying\n");break;case stop:printf ("stop\n");break;case holding:printf ("holding\n");break;}return 0;
}

链表

数据结构:

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

数组:连续性  有序性 单一性

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

数组的优点://随机访问很方便

            缺点://增加数据就会很不方便  删除数据也不方便

链表:链式的数据表

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

   缺点:找数据很不太方便

计算机中如何体现来来链式数据结构?

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

  [数据 | 另一个节点的指针]

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

操作:

1.创建一个链表----空链表

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

   //无头链表

c语言阶段:有头单向列表

相关概念:

   1.节点

   2.头节点---数据域值随机

   3.首节点---第一个保存有效数据的节点

   4.尾节点---链表的最后一个有效节点 NULL  

空链表:

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

strcut Node head = {0,NULL};
struct Node *p = &head;  

2.链表的插入

  创建一个新的节点 将节点连接起来

尾插:

头插:

#include <stdio.h>
#include <stdlib.h>//****************************************
#if 1 
struct Node
{int data;struct Node *next;
};void pushBack(struct Node *head,int data)    //尾插形式链表
{struct Node *pNew = malloc (sizeof (struct Node)); //开辟一个新节点的空间放在堆区pNew->data=data;       //将定义的数值放在新节点的数值域中struct Node *p = head;   // 定义一个结构体指针p指在头节点处 while (p->next != NULL){p = p->next;   //让p指向下一个节点 直到指到尾节点}p->next = pNew;pNew->next = NULL;   //将尾节点的指针域定义为空
}int isPuanduan (struct Node *head)
{if (head->next==NULL)   //判断头节点是否为空 空则返回1 不是空则返回0{return 1;}else{return 0;}
}void PrintLinklist(struct Node *head)        //打印整个链表的数据函数
{struct Node *p = head;           //定义一个结构体指针p指在头节点处 if (isPuanduan(head)==0)   // 如果头链表不是空 则将头链表的指针域给到p{p = head->next;while(p != NULL)  // 判断指针域是否为空  {printf ("%d\n",p->data);    // 不是空就打印出每个链表中数据域的元素p = p->next;}}
}int lens(struct Node *head)          //统计链表长度
{int cont=0;                            struct Node *p = head->next;        //定义一个结构体指针p  指向头结点的地址while(p->next != NULL)        //判断每个链表的指针域是否为空{cont++;p = p->next;      //是则进入循环 并记录次数 指针p则继续指向下一个链表继续判断}return cont;  
}void Head_insert(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;                        //再将新节点本身的地址放到首节点的指针域中}int main (void)
{struct Node head;head.next = NULL;   //定义一个空链表pushBack(&head,1);   //将想要打印的数组值传到尾插链表函数中pushBack(&head,2);pushBack(&head,3);pushBack(&head,4);pushBack(&head,5);pushBack(&head,6);pushBack(&head,7);//   PrintLinklist(&head);printf ("len=%d\n",lens(&head));        //打印整个链表的长度Head_insert(&head,8);Head_insert(&head,9);           //将想要打印的数组值传到头插链表函数中Head_insert(&head,10);Head_insert(&head,11);Head_insert(&head,12);Head_insert(&head,13);PrintLinklist(&head);        //将整个链表的数据打出来return 0;
}
#endif

这篇关于结构体--共用体--枚举 之难点——链表 奋力学习嵌入式的第十六天的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/670981

相关文章

Java枚举类实现Key-Value映射的多种实现方式

《Java枚举类实现Key-Value映射的多种实现方式》在Java开发中,枚举(Enum)是一种特殊的类,本文将详细介绍Java枚举类实现key-value映射的多种方式,有需要的小伙伴可以根据需要... 目录前言一、基础实现方式1.1 为枚举添加属性和构造方法二、http://www.cppcns.co

使用Java实现通用树形结构构建工具类

《使用Java实现通用树形结构构建工具类》这篇文章主要为大家详细介绍了如何使用Java实现通用树形结构构建工具类,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录完整代码一、设计思想与核心功能二、核心实现原理1. 数据结构准备阶段2. 循环依赖检测算法3. 树形结构构建4. 搜索子

利用Python开发Markdown表格结构转换为Excel工具

《利用Python开发Markdown表格结构转换为Excel工具》在数据管理和文档编写过程中,我们经常使用Markdown来记录表格数据,但它没有Excel使用方便,所以本文将使用Python编写一... 目录1.完整代码2. 项目概述3. 代码解析3.1 依赖库3.2 GUI 设计3.3 解析 Mark

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

mysql通过frm和ibd文件恢复表_mysql5.7根据.frm和.ibd文件恢复表结构和数据

《mysql通过frm和ibd文件恢复表_mysql5.7根据.frm和.ibd文件恢复表结构和数据》文章主要介绍了如何从.frm和.ibd文件恢复MySQLInnoDB表结构和数据,需要的朋友可以参... 目录一、恢复表结构二、恢复表数据补充方法一、恢复表结构(从 .frm 文件)方法 1:使用 mysq

nginx配置多域名共用服务器80端口

《nginx配置多域名共用服务器80端口》本文主要介绍了配置Nginx.conf文件,使得同一台服务器上的服务程序能够根据域名分发到相应的端口进行处理,从而实现用户通过abc.com或xyz.com直... 多个域名,比如两个域名,这两个域名其实共用一台服务器(意味着域名解析到同一个IP),一个域名为abc

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

Python中顺序结构和循环结构示例代码

《Python中顺序结构和循环结构示例代码》:本文主要介绍Python中的条件语句和循环语句,条件语句用于根据条件执行不同的代码块,循环语句用于重复执行一段代码,文章还详细说明了range函数的使... 目录一、条件语句(1)条件语句的定义(2)条件语句的语法(a)单分支 if(b)双分支 if-else(

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

使用Navicat工具比对两个数据库所有表结构的差异案例详解

《使用Navicat工具比对两个数据库所有表结构的差异案例详解》:本文主要介绍如何使用Navicat工具对比两个数据库test_old和test_new,并生成相应的DDLSQL语句,以便将te... 目录概要案例一、如图两个数据库test_old和test_new进行比较:二、开始比较总结概要公司存在多