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

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

结构体

注意:

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.lryc.cn/news/292713.html

相关文章:

  • 猜凶手
  • python-自动化篇-运维-实现读取日志文件最后一行的时间
  • QT SQL
  • C++(20):通过concept及nlohmann将数据转换为字符串
  • Transformer 自然语言处理(四)
  • BRAIN :帕金森病中与痴呆相关的动态功能连接改变
  • harmony os系统
  • 2024美赛数学建模A题思路源码——七鳃鳗性别比例和生态系统关系
  • C语言的基础学习
  • PostGIS教程学习二十二:使用触发器追踪历史编辑操作
  • 【PTA浙大版《C语言程序设计(第4版)》编程题】练习7-4 找出不是两个数组共有的元素(附测试点)
  • C++面试:数据库不同存储引擎的区别以及如何选择
  • HTML -- 常用标签
  • 【Qt】QInputDialog setGeometry: Unable to set geometry 问题
  • Flink问题解决及性能调优-【Flink rocksDB读写state大对象导致背压问题调优】
  • 代码随想录算法训练营第二十四天|● 理论基础 ● 77. 组合
  • 买保险如何填健康告知
  • 云贝教育 | 【技术文章】Oracle 19c RAC修改网络
  • Android SELinux:保护您的移动设备安全的关键
  • 第十三章认识Ajax(四)
  • 使用 Node.js 和 Cheerio 爬取网站图片
  • 2024美赛数学建模E题思路源码
  • 解决Docker AList本地挂载失效的问题。
  • Emmet常用语法总结
  • Android 12系统源码_页面管理(四)获取系统当前最上层的Activity信息
  • RK3588开发板Ubuntu与开发板使用U盘互传
  • 【BUG】golang gorm导入数据库报错 “unexpected type clause.Expr“
  • TCP/IP网络模型
  • github连不上
  • Excel计算表达式的值