链表

c的详细学习(10)结构体与共用体的学习(二)

橙三吉。 提交于 2020-02-11 04:47:24
在c语言中,结构体数据类型与共用体数据类型都属于构造类型。共用体与结构体数据类型在定义上十分相似,但它们在存储空间的占用分配上有本质的区别。结构体变量是各种类型数据的集合,各成员占据不同的存储空间,而共用体变量的所有成员占用相同的存储空间,在某一时刻只有一个成员起作用。 (1)共用体类型的定义 定义共用体类型的一般形式: union 共用体类型名 { 数据类型 成员名1; 数据类型 成员名2; 数据类型 成员名3; ...... }; 以上定义了一个名为data的共用体类型。它说明该类型由三个不同类型的成员组成,这些成员共享同一块存储空间。 (2)共用体变量的定义 与结构体变量的定义类似; (3)共用体变量的引用和初始化 1.引用共用体变量中的一个成员 引用共用体变量的成员的一般形式 共用体变量名.成员名 共用体指针变量->成员名 第一种引用方式应用于普通共用体变量,第二种引用方式应用于共用体指针变量。 union data a,*p=&a; 2.共用体类型变量的整体引用 可以将一个共用体变量作为一个整体赋给另一个同类型的共用体变量。例如: union data a,b; ...... a=b; 3.共用体变量的初始化 在共用体变量定义的同时只能用第一个成员的类型值进行初始化,共用体变量初始化的一般形式: union 共用体类型名 共用体变量={第一个成员的类型名}; 例如:

ConcurrentHashMap树化链表treeifyBin

▼魔方 西西 提交于 2020-02-11 01:22:59
private final void treeifyBin(Node<K,V>[] tab, int index) { Node<K,V> b; int n, sc; if (tab != null) { if ((n = tab.length) < MIN_TREEIFY_CAPACITY) tryPresize(n << 1); else if ((b = tabAt(tab, index)) != null && b.hash >= 0) { synchronized (b) { if (tabAt(tab, index) == b) { TreeNode<K,V> hd = null, tl = null; for (Node<K,V> e = b; e != null; e = e.next) { TreeNode<K,V> p = new TreeNode<K,V>(e.hash, e.key, e.val, null, null); if ((p.prev = tl) == null) hd = p; else tl.next = p; tl = p; } setTabAt(tab, index, new TreeBin<K,V>(hd)); } } } } } 其实就像是缝衣服,hd是线头,tl是线尾,首先,线头和线尾都插上第一个节点p,第二遍是p1的prev指向p

单链表

浪子不回头ぞ 提交于 2020-02-11 00:09:10
//单链表 //头指针 //1.头指针是指向链表的第一个节点的指针,若链表有头节点 //则是指向头节点的指针 //2.头指针具有标识作用,所以常用头指针冠以链表的名字 //3.无论链表是否为空,头指针均不为空,头指针是链表的必要元素 //头节点 /* *头节点是为了操作的统一和方便而设立的,放在第一元素的节点之前,其数据域一般无意义 *有了头节点,对于在第一元素节点前插入结点或者删除第一节点就变得与其他元素一样了 *头节点不一定是链表的必要元素 */ /*线性表的单链表定义*/ typedef struct node { elmentaye date; struct node *next;//c语言写法,要用自己来定义节点 } node; typedef struct node *linklist//定义一个指向结点的指针 /* 1.假设p是指向线性表第i个元素的指针,则节点a[i]的数据域可以用p->date来表示; 2.a[i]节点的指针域可以用p->next来表示,p->next是一个指针,指向下一个节点,p->next->data = a[i+1]; 3. */ //获得链表第i个数据的算法思路 /* 1.声明一个结点p指向链表的第一个结点,j从1开始 2.当j小于i时就让p指针向后移动,不断指向下一节点,j累加1 3.若链表尾p为空,就说明这个i元素不存在

px4中的mavlink协议

廉价感情. 提交于 2020-02-10 23:59:14
原文地址:http://blog.csdn.net/oqqENvY12/article/details/61615609 PX4 对Mavlink 协议提供了良好的原生支持。该协议既可以用于地面站(Ground ControlStation, GCS) 对无人机(UAV) 的控制,也可用于对地面站的信息反馈。其飞控场景一般是这样的: 也就是说,如果你想要实现地面站控制飞行,那么由你的地面站使用Mavlink 协议,通过射频信道(或wifi 等)给无人机发送控制指令就可以了。如果你想实现无人机自主飞行,那么就由你自己写的应用(运行在无人机系统上)使用Mavlink 协议给无人机发送本地的控制指令就可以了。 在PX4 中,并不鼓励开发者在自定义飞控程序中直接使用Mavlink ,而是鼓励开发者使用uORB微对象请求代理器消息机制。 在uORB 机制中,交换的消息被称之为主题(topic) ,一个主题仅包含一种消息类型(即数据结构)。每个进程(或驱动模块)均可“订阅”或“发布”多个主题,一个主题可以存在多个发布者,而且一个订阅者可也订阅多个主题。 Mavlink传输时的基本单位是消息帧。 协议设计的目标是传输速度和安全性。它允许消息内容检查、消息丢失检测,每个数据包需要6 字节报头。 每次发完一个消息,SEQ的内容会加1,加到255后会从0重新开始

[LeetCode] 2. Add Two Numbers

放肆的年华 提交于 2020-02-10 23:25:08
1. 原题链接: https://leetcode.com/problems/add-two-numbers/ 2. 解题思路 两个链表相加的解题思路比较直接 需要注意两个链表的长度不同,有些边界情况需要考虑周到 考虑进位的情况 3. 算法 首先,遍历两个链表长度相同的部分 然后,遍历长度较长的链表 4. 实现 struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {} }; class Solution { public: ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { ListNode header(-1); int value = 0; ListNode *prev = &header; while(l1 && l2){ int v1 = l1->val; int v2 = l2->val; int sum = v1 + v2 + value; int current_value = sum % 10; value = sum / 10; prev->next = new ListNode(current_value); l1 = l1->next; l2 = l2->next; prev = prev-

P1075 链表元素分类

十年热恋 提交于 2020-02-10 21:11:28
P1075 链表元素分类 转跳点: 🐏 1075 链表元素分类 (25分) 给定一个单链表,请编写程序将链表元素进行分类排列,使得所有负值元素都排在非负值元素的前面,而 [0, K] 区间内的元素都排在大于 K 的元素前面。但每一类内部元素的顺序是不能改变的。例如:给定链表为 18→7→-4→0→5→-6→10→11→-2,K 为 10,则输出应该为 -4→-6→-2→7→0→5→10→18→11。 输入格式: 每个输入包含一个测试用例。每个测试用例第 1 行给出:第 1 个结点的地址;结点总个数,即正整数N (≤10​5​​);以及正整数K (≤10​3​​)。结点的地址是 5 位非负整数,NULL 地址用 −1 表示。 接下来有 N 行,每行格式为: Address Data Next 其中 Address 是结点地址; Data 是该结点保存的数据,为 [−10​5​​,10​5​​] 区间内的整数; Next 是下一结点的地址。题目保证给出的链表不为空。 输出格式: 对每个测试用例,按链表从头到尾的顺序输出重排后的结果链表,其上每个结点占一行,格式与输入相同。 输入样例: 00100 9 10 23333 10 27777 00000 0 99999 00100 18 12309 68237 -6 23333 33218 -4 00000 48652 -2 -1 99999

单链表的基本操作

不羁的心 提交于 2020-02-10 20:09:25
单链表(C语言) # include <stdio.h> # include <stdlib.h> typedef int ELemType ; typedef struct Node # 定义一个单链表结构体变量 { ELemType data ; struct Node * next ; } LinkNode , * LinkList ; LinkList CreatListFromHead ( ) # 使用头插法创建单链表 { LinkNode * head , * s ; char Flag = 'Y' ; head = ( LinkNode * ) malloc ( sizeof ( LinkNode ) ) ; head -> next = NULL ; printf ( "开始用头插法创建单链表!\n" ) ; while ( Flag == 'Y' || Flag == 'y' ) { s = ( LinkNode * ) malloc ( sizeof ( LinkNode ) ) ; printf ( "请输入新节点数据:" ) ; scanf ( "%d" , & ( s -> data ) ) ; s -> next = head -> next ; head -> next = s ; getchar ( ) ; printf ( "是否继续插入?(Y/y

关于链表中指针的学习

女生的网名这么多〃 提交于 2020-02-10 19:28:46
  昨天晚上在学习数据结构关于链表的部分,理解链表没什么难度,但是当自己动手写程序的时候各种问题就出来了,感觉逻辑很正常但是总得不到正确的结果。 首先自己对C语言指针理解的不是很深入,在定义链表节点的结构体时,定义了一个指针类型的变量指向结构体如代码所示:    1 typedef int status; 2   typedef struct Node{ 3    status data; 4    Node *next; 5   }Node,*linklist;   然后在main函数中定义一个指向结构体的指针变量如 linklist L;   在main函数之外声明一个创建链表的函数    1 void Create_list(linklist L1,int n){ 2    linklist p; 3    L1 = (linklist)malloc(sizeof(Node)); 4    L1->next = NULL; 5    for(i = 0;i < n; i++){ 6    p = (linklist)malloc(sizeof(Node)); 7    p->data = i; 8    p->next = L1->next; 9    L1->next= p; 10   } 11   } Create_list函数采用的事头插法添加链表节点,经过main

ConcurrentHashMap 1.7/1.8比较

此生再无相见时 提交于 2020-02-10 19:04:10
ConcurrentHashMap JDK7中的实现 1.1 设计思路 1.2 并发度(Concurrency Level) 1.3 创建分段锁 1.4 put/putIfAbsent/putAll 1.5 rehash 1.6 remove 1.7 get与containsKey 1.8 size、containsValue JDK8中的实现 2.1 重要的类 2.2.1 Node 2.2.2 TreeNode 2.2.3 TreeBin 2.2.4 ForwardingNode 2.3 Unsafe与CAS 2.3.1 unsafe静态块 2.3.2 三个核心方法 2.4 初始化方法initTable 2.5 扩容方法 transfer 2.6 Put方法 2.6.1 helpTransfer方法 2.6.2 treeifyBin方法 2.7 get方法 总结 java容器可参见: 集合底层实现原理   并发编程实践中,相比于Hashtable以及Collections.synchronizedMap(),ConcurrentHashMap在线程安全的基础上提供了更好的写并发能力,但同时降低了对读一致性的要求。ConcurrentHashMap大量运用volatile,final,CAS等lock-free技术来减少锁竞争对于性能的影响。 JDK7中的实现 1.1 设计思路  

数据结构学习笔记-线性表

那年仲夏 提交于 2020-02-10 17:59:50
线性表 主要内容 2.1 线性表的定义和特点 2.2 线性表的顺序表示和实现 2.3 线性表的链式表示和实现 2.4 顺序表和链表的比较 补充知识点:参数的值传递 参数传递有两种方式 : (1)传值方式(参数为整型、实型、字符型等) (2)传地址 l 参数为指针变量 l 参数为引用类型 l 参数为数组名 参数的值传递: # include <iostream.h> void swap ( int m , int n ) { int temp ; temp = m ; m = n ; n = temp ; } void main ( ) { int a , b ; cin >> a >> b ; swap ( a , b ) ; cout << a << endl << b << endl ; } 能否实现预想功能? 形式参数的值的改变并不改变实际参数的值!! 参数的指针变量传递: # include <iostream.h> void swap ( int * m , int * n ) { int temp ; temp = * m ; * m = * n ; * n = temp ; } void main ( ) { int a , b , * p1 , * p2 ; cin >> a >> b ; p1 = & a ; p2 = & b ; swap ( p1 , p2 )