c语言学习day12 

单向链表学习

 

 

 

 

//单向链表学习
typedef struct TempHumiListNode_t
{
	uint8_t id;
	uint8_t humi;
	float temp;
	struct TempHumiListNode_t *next;
}TempHumiListNode;

static TempHumiListNode *g_header;//头指针变量

TempHumiListNode *InitSensorList(void)//头节点
{
	TempHumiListNode *header = (TempHumiListNode *)malloc (sizeof (TempHumiListNode ));
	if (header == NULL )
	{
		return NULL;
	}
	header ->id = 0;
	header ->next = NULL;
	
	return header;
}
//模拟检测温湿度
TempHumiListNode *FindTempHumiSensor(void)
{
	TempHumiListNode *node = (TempHumiListNode *)malloc(sizeof (TempHumiListNode ));
	if(node == NULL)
	{
		return NULL;
	}
	static uint8_t id = 100;
	node ->id  = id;
	id--;//每次调用find获取不一样的id
	node ->humi = 40;
	node ->temp = 20.5f;
	
	return node;
}
void AddSensor(TempHumiListNode *header,TempHumiListNode *node)//添加节点
{	TempHumiListNode *prev = header;//prev指向头节点
	TempHumiListNode *current = header ->next;//curret指向下一个节点
	while(current != NULL)//如果不为空
	{
		prev = current;//将prev指向这个节点
		current = current ->next;//current指向下个节点
	}
	prev ->next = node;//为空:将前一个节点(prev)的next指针指向新节点node,使其成为新的末尾节点
	node->next =NULL;//next赋值为空
}
void DelSensorNode(TempHumiListNode *header, uint8_t id)//删除节点
{
	//找到current对应id,如果没有找到相对应id,将prev,current向后移动,找到后退出循环,此时current指向的就是对应的id节点
	//接着将prev的next指向current的next中删除中间的current节点并且释放内存将指针置空防止野指针
	TempHumiListNode *prev = header;
	TempHumiListNode *current = header ->next;
	while(current != NULL)
	{
		if(current ->id == id)
		{
			break;
		}
		prev = current;
		current = current ->next;
	}
	if(current == NULL)
	{
		printf("Can not file id%d",id);
		return;
	}
	prev ->next = current ->next ;
	free(current);
	current = NULL;
}
void PrintSensorData (TempHumiListNode *header)//打印信息
{
	TempHumiListNode *current = header ->next ;
	while(current !=NULL)
	{
		printf ("\nSensor id = %d,temp = %.1f,humi = %d\n",current ->id, current ->temp, current ->humi);
	}
}
int main(void) 
	{
	g_header = InitSensorList();
	if(g_header == NULL)
	{
		return -1;
	}
	TempHumiListNode *node;
	for(uint8_t i = 0; i < 3; i++)
	{
		node = FindTempHumiSensor();
		if(node == NULL)
		{
			continue;
		}
		AddSensor (g_header ,node);
	}
	PrintSensorData(g_header);
	DelSensorNode(g_header,100);
	PrintSensorData(g_header);
	return 0;
}    

双向链表:

 

 

//双向循环链表学习
typedef struct TempHumiListNode_t
{
	uint8_t id;
	uint8_t humi;
	float temp;
	struct TempHumiListNode_t *next;//指向下一个节点
	struct TempHumiListNode_t *prev;//指向上一个节点
}TempHumiListNode;

static TempHumiListNode *g_header;//头指针变量

TempHumiListNode *InitSensorList(void)//头节点
{
	TempHumiListNode *header = (TempHumiListNode *)malloc (sizeof (TempHumiListNode ));
	if (header == NULL )
	{
		return NULL;
	}
	header ->next = header;
	header ->prev = header;
	
	return header;
}
//模拟检测温湿度
TempHumiListNode *FindTempHumiSensor(void)
{
	TempHumiListNode *node = (TempHumiListNode *)malloc(sizeof (TempHumiListNode ));
	if(node == NULL)
	{
		return NULL;
	}
	static uint8_t id = 100;
	node ->id  = id;
	id--;//每次调用find获取不一样的id
	node ->humi = 40;
	node ->temp = 20.5f;
	
	return node;
}
void AddNode(TempHumiListNode *oldNode,TempHumiListNode *newNode)//添加节点
{	
	newNode ->next = oldNode ->next;//将新节点的下一个指向节点2的首地址
	newNode ->prev = oldNode;//将新节点的上一个指向老节点
	oldNode ->next ->prev = newNode;//将老节点的下一个就是节点2的上一个指向新节点
	oldNode ->next =newNode;//将老节点的下一个指向新节点
}
void AddNodeToHead(TempHumiListNode *header,TempHumiListNode *node)//在头节点插入新节点
{
	AddNode(header, node);
}
void AddNodeToTail(TempHumiListNode *header,TempHumiListNode *node)//在尾节点添加新节点
{
	AddNode(header ->prev,node);
}

void PrintSensorData (TempHumiListNode *header)//循环遍历
{
	TempHumiListNode *current = header ->next ;
	if(current == header)
	{
		printf ("LIst has no node!\n");
		return;
	}
	while(current !=header)
	{
		printf ("\nSensor id = %d,temp = %.1f,humi = %d\n",current ->id, current ->temp, current ->humi);
		current = current ->next;//如果current不等于头节点current向后移指向后面节点
	}
}
void DelNode(TempHumiListNode *node)//删除节点2
{
	node ->prev ->next = node ->next;//将节点2上一个的节点1next指向修改为节点的下一个节点3的首地址
	node ->next ->prev = node ->prev;//将节点的下一个节点3的prev指向节点1的首地址
}
void DelSensorNode(TempHumiListNode *header, uint8_t id)
{
	//根据id来删除节点,如果没有找到对应的id,current向后移,找到了对应id
	//退出循环,调用删除节点函数,传入current,释放内存空间
	TempHumiListNode *current;
	current = header ->next ;
	while(current != NULL)
	{
		if(current ->id == id)
		{
			break;
		}
		current = current ->next ;
	}
	if(current == header)
	{
		printf("Can not find %d\n",id);
		return;
	}
	DelNode(current);
	free(current);
	current = NULL;
}
int main(void) 
	{
	g_header = InitSensorList();
	if(g_header == NULL)
	{
		return -1;
	}
	TempHumiListNode *node;
	for(uint8_t i = 0; i < 3; i++)
	{
		node = FindTempHumiSensor();
		if(node == NULL)
		{
			continue;
		}
		AddNodeToHead(g_header ,node);
	}
	PrintSensorData(g_header);
	node = FindTempHumiSensor();
	AddNodeToTail(g_header,node);
	PrintSensorData(g_header);
	
	DelSensorNode(g_header,97);
	PrintSensorData(g_header);

	return 0;
}    

 

 

电路原理day2

电压源和电流源

  1. 电源两端电压由电源本身决定,与外电路无关;与流经他的电流方向、大小无关
  2. 通过电压源的电流由电源及外电路共同决定

电压源的功率

  • 电压、电流参考方向非关联;电流(正电荷)由低电位向高电位移动,外力客服点成立做功,电源发出功率
  • P=Usi
  • 发出功率起电源作用;电压、电流的参考方向关联,
  • 电场力做功,电源吸收功率

理想电流源:其暑促电流总能保持定值或一定的时间函数,其值与它的两端电压u无关的元件叫做理想电流源

电流源的输出电流由电源本身决定,与外电路无关,其两端电压方向、大小无关

受控电源(非独立电源):电压或电流的大小和方向不是给定的时间函数,而是受电路中某个地方的电压或电流控制的电源,称受控源

  1. 当被控制量是电压时,用受控电压源表示,当被控制量是电流时,用受控电流源表示CCCS
  2. 电压控制的电流源:i = gUi(g转移电导)
  3. 电压控制的电压源:U2 = uU1(u电压放大倍数)

受控源与独立源比较:

  • 独立电源电压或电流有电源本身决定,与电路中其他电压、电流无关,而受控源电压或电流由控制量决定
  • 独立源在电路中起“激励”作用,在电路中产生电压,电流,而受控源是反映电路中某处的电压或电流对另一处的电压或电流的控制关系,在电路中不能作为“激励”

基尔霍夫电流定律:在集总数电路中,任意时刻对任意结点流出或流入该结点电流的代数和等于0

流进的电流等于流出的电流( i进=i出)

  1. KCL是电荷守恒和电流连续性原理在电路中任意结点的反映
  2. KCL是对结点处支路电流加的约束,与支路上接的是什么元件无关,与电路是线性还是非线性无关
  3. KCL方程是按电流参考方向列写的,与电流实际方向无关

基尔霍夫电压定律(KVL):在集总参数电路中,任一时刻,沿任意回路,所有支路电压的代数和恒等于零(Uba=Us+U2+U1)

  1. KVL的实质反映了电路遵循能量守恒定律
  2. KVL是对回路中的支路电压加的约束,与回路各支路上届的是什么元件无关,与电路是线性还是非线性无关
  3. KVL方程是按照电压参考方向列写,与电压实际方向无关

KCL、KVL小结:

  • KCL是对支路电流的线性约束,KVL是对回路电压的线性约束
  • KCL、KVL与组成支路的元件性质及参数无关,
  • KCL表明在每一结点上的电荷是守恒的,KVL是能量守恒的具体表现(电压与路径无关)
  • 他俩只适用于集总参数的电路

电路的等效变换:

1.两端电路(网络)

任何一个复杂的电路,向外引出两个端钮,且从一个端子流入的电流等于从另一个端子流出的电流;

两个两端电路,端口具有相同的电压、电流关系、参考方向也相同的称他们是等效的电路

电路等效变换的条件:两电路具有相同的VCR

电路等效变换的对象:未变化的外电路A中的电压、电流和功率;(即对外等效,对内不等效)

电路等校变换的目的:化简电路,方便计算

电阻的串联:

  1. 串联电路电流相等
  2. 总电阻等于分电阻之和
  3. 总电压等于分电压之和
  4. 电压之比等于电阻之比

电阻的并联:

  1. 并联电路电压相等
  2. 并联电路总电流等于分电流之和
  3. 求总电阻的方法 R1*R2/R1+R2
  4. 电流之比为电阻的反比(并联分流)

电阻的混联及粗粒电阻等效问题的思路及方法:

电阻混联:在电路中包含了复杂的串联,混连,还有一些特殊的结构,这样的情况下需要特殊的方法:标点法(看看电阻的两个结点分别对应那个电压标点重新连线)

惠斯通电桥——电桥平衡

电路中还存在一种特殊的结构:当满足R1*R4 = R2*R3,可将中间的桥短或断,进而简化电路

从三角形变为星形:

R1 = R12*R21/R12+R23+R31

要求的电阻等于所有电阻的和除以要求的电阻的两边电阻

独立电压源串联电阻 = 独立电流源并联电阻(参考方向在转换的时候要相反)

之后可以进行计算简化电路

看图b将电流转化成 并联的电压虚拟的电压就等于转换的电压加上R2+R3串联*电流i1

总的电压还等于流过R1的电流i2*R1,根据i=i1+i2可得下面公式

 

 

 将a的电路简化成b每个电阻是一条线,电压与电阻串联一条线,电流与电阻并联一条线

树的概念:两个结点中的线就是一个

n个结点,b条支路,有L = b-(n-1)=b-n+1

L= 连枝数 = 独立方程数

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐