IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 线程概念与双向链表粗略比划 -> 正文阅读

[数据结构与算法]线程概念与双向链表粗略比划

目录

一、线程简介

二、线程的创建

三、操作双向链表

3.1、初始化节点链表

3.2、在双向链表表头后插入一个节点

?3.3、双向链表尾部插入一个节点

?3,4、从双向链表中删除一个节点


一、线程简介

在多线程系统中我们根据功能的不同,把系统分为一个个独立的且无法返回的函数。此函数称为线程。

void DoSomeThing(void){

//  线程主体无限循环,且无法返回
while(1){
//  线程主体代码
}
}

二、线程的创建

  • 裸机系统中的全局变量,局部变量都存放在栈中。
  • 栈:单片机 RAM 里面一段连续的内存空间,栈的大小一般在启动文件或者链接脚本里 面指定,最后由 C 库函数_main 进行初始化。
  • 多线程中每个线程都是独立且互不干扰的,因此要为每个线程分配独立的栈空间。
  • 栈空间:预先定义的全局数组、动态分配的一段内存(存在于RAM中)都是栈空间。

三、操作双向链表

//  条件编译
#ifdef __CC_ARM 
  #define rt_inline static __inline 
  #define ALIGN(n) __attribute__((aligned(n))) 
	
#elif defined(__IAR_SYSTEMS_ICC__) 
  #define rt_inline static inline 
  #define ALIGN(n) PRAGMA(data_alignment=n) 
	
#elif defined (__GNUC__) 
  #define rt_inline static __inline 
  #define ALIGN(n) __attribute__((aligned(n))) 
#else 
  #error not supported tool chain 
#endif 

//  线程结构体
struct rt_thread {
 void *sp; /* 线程栈指针 */ 
 void *entry; /* 线程入口地址 */ 
 void *parameter; /* 线程形参 */ 
 void *stack_addr; /* 线程起始地址 */ 
 rt_uint32_t stack_size; /* 线程栈大小,单位为字节 */ 
 
 rt_list_t tlist; /* 线程链表节点 */
 };  
typedef struct rt_thread *rt_thread_t;   // 结构体别名

//  双向链表结构体
truct rt_list_node  { 
 struct rt_list_node *next; /* 指向后一个节点 */ 
 struct rt_list_node *prev; /* 指向前一个节点 */ 
}; 
typedef struct rt_list_node rt_list_t; 

3.1、初始化节点链表

//  初始化链表节点
rt_inline void rt_list_init(rt_list_t *l)
{
	// 初始表头下一个和上一个都指向自己
   l->next = l->prev=l;
}

3.2、在双向链表表头后插入一个节点

rt_inline void rt_list_insert_after(rt_list_t *l,rt_list_t *n)
{
	//  rt_list_t:节点的数据类型  l:节点名称
	//  next:节点指针,指向链表中的下一个节点
	//  prev:节点指针,指向链表中的上一个节点
    //  序号1
    l->next->prev=n;  //  插入节点时 原链表表头后一个节点的prev(钩子方向)就是要插入的节点
    //  序号2
	n->next=l->next;  //  插入节点时 要插入的节点(n)的下一个节点是原链表中表头的后一个节点
	
   //   序号3
	l->next =n;  //  插入后 链表头节点(l)下一个节点是要插入的节点(n)
   //  序号4
	n->prev =l;  //  插入后 新插入的节点(n)的上一个节点为链表头节点(l)
}

?3.3、双向链表尾部插入一个节点

//  双向链表表头前面插入一个节点(双向链表尾部插入节点)
rt_inline void rt_list_insert_before(rt_list_t *l,rt_list_t *n)
{
	  //  插入节点时,原链表表头前一个节点(原链表尾节点)的next就是要插入的节点(n)。
    l->prev->next=n;  //  序号1
	  //  插入节点时,要插入的节点的上一个节点是原链表表头的上一个节点。
	  n->prev=l->prev;  //  序号2
	  
	  //  插入后,链表的前一个节点为要插入的节点。
	  l->prev = n;      //  序号3
	  //  插入后,插入的节点的后一个节点为链表表头节点。
	  n->next =l;       //  序号4

}

?3,4、从双向链表中删除一个节点

//   从双向链表中删除一个节点
rt_inline void rt_list_remove(rt_list_t *n)
{
//  删除节点n时,删除节点n的节点指针prev,prev指向n的上一个节点
n->next->prev=n->prev;  // 序号1
//  删除节点n时,删除节点n的节点指针next,next指向n的下一个节点
n->prev->next=n->next;  // 序号2

//  删除n节点后,节点指针next与节点指针prev指向节点n本身
n->next  =  n->prev=n;  // 序号3

}

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-05-10 12:08:32  更:2022-05-10 12:08:35 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 3:37:06-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码