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

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

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

csu1329(双向链表)

题意:给n个盒子,编号为1到n,四个操作:1、将x盒子移到y的左边;2、将x盒子移到y的右边;3、交换x和y盒子的位置;4、将所有的盒子反过来放。 思路分析:用双向链表解决。每个操作的时间复杂度为O(1),用数组来模拟链表,下面的代码是参考刘老师的标程写的。 代码如下: #include<iostream>#include<algorithm>#include<stdio.h>#

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

hdu 2489 (dfs枚举 + prim)

题意: 对于一棵顶点和边都有权值的树,使用下面的等式来计算Ratio 给定一个n 个顶点的完全图及它所有顶点和边的权值,找到一个该图含有m 个顶点的子图,并且让这个子图的Ratio 值在所有m 个顶点的树中最小。 解析: 因为数据量不大,先用dfs枚举搭配出m个子节点,算出点和,然后套个prim算出边和,每次比较大小即可。 dfs没有写好,A的老泪纵横。 错在把index在d