链表

Linux USB 鼠标驱动程序解析

大憨熊 提交于 2020-03-07 04:41:21
USB 总线引出两个重要的链表!   一个 USB 总线引出两个重要的链表,一个为 USB 设备链表,一个为 USB 驱动链表。设备链表包含各种系统中的 USB 设备以及这些设备的所有接口,驱动链表包含 USB 设备驱动程序(usb device driver)和 USB 驱动程序(usb driver)。   USB 设备驱动程序(usb device driver)和 USB 驱动程序(usb driver)的区别是什么?   USB 设备驱动程序包含 USB 设备的一些通用特性,将与所有 USB 设备相匹配。在 USB core 定义了:struct usb_device_driver usb_generic_driver。usb_generic_driver 是 USB 子系统中唯一的一个设备驱动程序对象。而 USB 驱动程序则是与接口相匹配,接口是一个完成特定功能的端点的集合。   设备是如何添加到设备链表上去的?   在设备插入 USB 控制器之后,USB core 即会将设备在系统中注册,添加到 USB 设备链表上去。   USB 设备驱动程序(usb device driver)是如何添加到驱动链表上去的?   在系统启动注册 USB core 时,USB 设备驱动程序即将被注册,也就添加到驱动链表上去了。   接口是如何添加到设备链表上去的?   在 USB

C语言实现单循环链表

泪湿孤枕 提交于 2020-03-07 04:13:17
第一次在CSDN这边写博客,主要是为了记录自己学习的历程,望诸位共勉。 首先循环链表是神魔恋?其实就是为了解决单链表只能从头开始过于麻烦诞生的,我愿称之为单链表2.0。(所以如果搞不清楚的话建议先学一下单链表。) 那么它和单链表之间是什么关系,单链表的结尾指向的是一个空节点,存着NULL这个空值。那么他在索引的时候出现的问题显而易见,如果你不从头结点开始那你就无法访问全部结点。 循环链表的设计者明显就很鬼才了,我把最后一个结点的指向变成头节点不就可以了,这样我就可以从想开始的地方开始索引,而且都能保证索引到全部结点,然后这个链表就像贪吃蛇咬到自己尾巴一样闭环了,就叫(单)循环链表。 下面贴出代码的具体实现,如有不对欢迎指正。 # define _CRT_SECURE_NO_WARNINGS # include <stdio.h> # include <stdlib.h> # include <time.h> # define ERROR 0 # define OK 1 typedef int EleType ; typedef struct CLinkNode { EleType data ; struct CLinkNode * next ; } CLinkNode , * CLinkList ; //初始化循环链表 int InitCLinkList ( CLinkList *

力扣——翻转链表

[亡魂溺海] 提交于 2020-03-07 04:01:09
原题如下 206.反转链表 我先试试手撸一遍代码试试,没有任何提示的那种 😀 //这是给出的节点信息 /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } * */ class Solution { public ListNode reverseList ( ListNode head ) { //遍历前 创建一个前驱节点pre为null,一个当前节点curr为传入的头节点head ListNode pre = null ; ListNode curr = head ; //在循环中当前节点curr在不断向后走,当当前节点curr指向了之前链表的末尾null时,反转完毕 while ( curr != null ) { //创建一个临时节点next,用来保存当前节点的后继节点 ListNode next = curr . next ; //将当前节点的后继节点变为前驱节点pre,因为怕丢了之前的后继,所以前面才把它提出了 curr . next = pre ; //本次循环的目的已经达到了,下面进行下一次循环的准备 //前驱节点pre指向了当前节点curr pre = curr

线性表之单链表

混江龙づ霸主 提交于 2020-03-07 00:10:43
单链表的形式:   单链表的每节点中除了 数据域 外,还包含一个 指针域,用来指向下一个节点,主要有带头结点和不带头结点两种 。   单链表定义如下: //单链表结构体定义 typedef struct LNode { int data; struct LNode* next; }LNode; 单链表中的两种基本算法: 插入操作:   .不妨设在节点A和节点B直间插入节点S,则具体分两步实现:   节点S指向节点B, //让节点S指向B S->next = A->next;   节点A指向S //节点A指S A->next = S   注意,这两步的顺序不能弄反,否则会丢失数据; 删除操作:   同理,不妨设删除节点B,则只需要找到前一个节点A即可,具体实现如下: //p是要删除的节点 p = A->next; A->next = A->next->next; //释放节点B的空间 free(p); 具体的相关算法实现: 头插法建立单链表:   插入的新节点在表头,旧的节点在新节点之后,不妨设已有头节点B,现插入节点A,则形式为A->B,关键代码如下所示:    A->next = B->next; B->next=A;   具体实现如下:    //插入的节点在表头 STATUS CreateListOfF(LNode *&P, int a[], int n) { /

C语言中实现通用双链表(类似C++模版的功能)

只愿长相守 提交于 2020-03-06 23:36:23
这篇文章,本来写了快两个小时了,可是提交的时候,居然博客园崩溃了。信息全部都丢失了。 既然这样,那就不啰嗦了,直接拷贝代码。 插入代码的功能也坏了,那就直接复制把: /** * C 和 C++ 的谁好谁坏的争论还在不断的继续,C语言的使用非常的广范,很多大型的系统都是用C 语言来写的。 * C++ 似乎有更好的编程范式。支持面向对象,模版,省去了很多处理。 * C++ 最好不要滥用,具体问题,具体分析。 * */ #include <stdio.h> #include <stdlib.h> /** * 通用链表声明部分 */ struct list_head { struct list_head *next, *prev; }; #define LIST_HEAD_INIT(name) { &(name), &(name) } #define LIST_HEAD(name) \ struct list_head name = LIST_HEAD_INIT(name) #define INIT_LIST_HEAD(ptr) do { \ (ptr)->next = (ptr); (ptr)->prev = (ptr); \ } while (0) static void __list_add(struct list_head * new, struct list_head *

c语言实现单链表的就地逆置

我怕爱的太早我们不能终老 提交于 2020-03-06 21:20:20
` 有几个需要注意的地方 为链表赋值不要用头插法,头插法先插入的结点后输出,不用你去逆置,输出的时候就会逆序输出了 遍历输出链表结点不要用移动头指针去遍历,应为头指针有定位链表作用,应该另外设置一个指针去遍历 List item #include<stdio.h> #include<stdlib.h> #define ERROR 0; #define OK 1; typedef int ElemType; typedef int Status; typedef struct LNode{ ElemType data; struct LNode *next; }LNode, LinkList; //创建空链表,由于链表所占用的空间可以不连续,可以不用判断是否分配成功 Status InitLinkList(LinkList &L) { //生成一个新节点作为头结点,头指针指向头结点,头结点指针域置空 L=(LinkList)malloc(sizeof(LNode)); L->next=NULL; return OK; } //给链表各元素赋值,即生成新结点 Status assign(LinkList &L,int n) { int i,e; LinkList u=L; for(i=0;i<n;i++) { //创建一个结点,让s指向它,注意是用尾插法

LRU算法实现(最少使用缓存淘汰机制)

杀马特。学长 韩版系。学妹 提交于 2020-03-06 18:03:39
1、LRU算法描述 LeetCode上有一道LRU算法设计的题目,让你设计一种数据结构,首先构造函数接受一个capacity参数作为缓存的最大容量,然后实现两个API: 一个是 put(key, val) 方法插入新的或更新已有键值对,如果缓存已满的话,要删除那个最久没用过的键值对以腾出位置插入。 另一个是 get(key) 方法获取 key 对应的 val,如果 key 不存在则返回 -1。 需要注意的是, get 和 put 方法必须都是 O (1) 的时间复杂度 ,我们举个具体例子来看看 LRU 算法怎么工作。 2、代码实现 很多编程语言都有内置的哈希链表或者类似 LRU 功能的库函数,但是为了帮大家理解算法的细节,我们用 Java 自己造轮子实现一遍 LRU 算法。 首先,我们把双链表的节点类写出来,为了简化,key 和 val 都认为是 int 类型: class Node { public int key, val; public Node next, prev; public Node ( int k, int v) { this .key = k; this .val = v; } } 然后依靠我们的 Node 类型构建一个双链表,实现几个要用到的 API,这些操作的时间复杂度均为 O (1) : class DoubleList { // 在链表头部添加节点 x

【LeetCode】21. 合并两个有序链表(JAVA)

ⅰ亾dé卋堺 提交于 2020-03-06 17:21:45
原题地址: https://leetcode-cn.com/problems/merge-two-sorted-lists/ 题目描述: 将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例: 代码: 递归: /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ class Solution { public ListNode mergeTwoLists ( ListNode l1 , ListNode l2 ) { if ( l1 == null ) return l2 ; if ( l2 == null ) return l1 ; if ( l1 . val < l2 . val ) { l1 . next = mergeTwoLists ( l1 . next , l2 ) ; return l1 ; } else { l2 . next = mergeTwoLists ( l1 , l2 . next ) ; return l2 ; } } } 迭代:用了一个虚头节点 /** * Definition for

LinkedList源码分析和实例应用

孤街浪徒 提交于 2020-03-06 17:06:23
1、 LinkedList介绍 LinkedList 是继承于 AbstractSequentialList 抽象类,它也可以被当作堆栈、队列或者双端队列 使用。 LinkedList 实现了 Deque 接口, 即能将LinkedList当作双端队列使用 。 LinkedList 实现 List 接口,能对它进行队列操作。 LinkedList 实现了 Cloneable 接口,即覆盖了函数clone(),能克隆。 LinkedList 实现 java.io.Serializable 接口,这意味着LinkedList支持序列化,能通过序列化去传输。 LinkedList 是非同步的。 AbstractSequentialList 实现了get(int index)、set(int index, E element)、add(int index, E element) 和 remove(int index)这些函数。 这些接口都是随机访问List的 ,LinkedList是双向链表;既然它继承于AbstractSequentialList,就相当于已经实现了“get(int index)这些接口 ” 。 2、 LinkedList数据结构 1 java.lang.Object 2 ↳ java.util.AbstractCollection<E> 3 ↳ java.util

PTA 02-线性结构3 Reversing Linked List 题目解析

房东的猫 提交于 2020-03-06 17:04:17
Given a constant K and a singly linked list L , you are supposed to reverse the links of every K elements on L . For example, given L being 1→2→3→4→5→6, if K =3, then you must output 3→2→1→6→5→4; if K =4, you must output 4→3→2→1→5→6. Input Specification: Each input file contains one test case. For each case, the first line contains the address of the first node, a positive N (≤10^5) which is the total number of nodes, and a positive K (≤ N ) which is the length of the sublist to be reversed. The address of a node is a 5-digit nonnegative integer, and NULL is represented by -1. Then N lines