linux单向循环链表源码分析
发表于:2025-12-02 作者:千家信息网编辑
千家信息网最后更新 2025年12月02日,本篇内容介绍了"linux单向循环链表源码分析"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!exte
千家信息网最后更新 2025年12月02日linux单向循环链表源码分析
本篇内容介绍了"linux单向循环链表源码分析"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
extern inline void add_wait_queue(struct wait_queue ** p, struct wait_queue * wait){unsigned long flags;#ifdef DEBUGif (wait->next) {unsigned long pc;__asm__ __volatile__("call 1f\n""1:\tpopl %0":"=r" (pc));printk("add_wait_queue (x): wait->next = x\n",pc,(unsigned long) wait->next);}#endifsave_flags(flags);cli();// 队列为空,头指针指向待插入的节点wait,末节点的next指针指向自己if (!*p) {wait->next = wait;*p = wait;} else {/*在第一个节点后面插入节点,形成单向循环链表 thanks to zym.插入第二个节点的时候,是在第一个节点后面插入,后面在插入的时候,是在第一个第二个节点中间插入,然后是从第一第三个直接插入,如此类推*p指向第一个节点,(*p)->next指向第一个节点的下一个,插入第二个节点的时候,第一个节点的下一个节点是自己。wait->next即新节点的next指向第一个节点的下一个节点,(*p)->next = wait;即第一个节点的next指针指向新加入的节点。传统的头插法只能形成单链表,不能循环,因为循环需要拿尾指针的next指向第一个节点,但是随着链表的变成,无法找到尾节点。p -> head -> nullp -> head -> node1next|------->p -> head -> node1 node2<-------nextnext next|-------> |------->p -> head -> node1 node3 node2<------------------next测试代码#includestruct wait_queue {int task;struct wait_queue * next;};void add_wait_queue(struct wait_queue ** p, struct wait_queue * wait){if (!*p) {//printf("%d", 1);wait->next = wait;*p = wait;} else {// 头插法,形成单向链表wait->next = (*p)->next;(*p)->next = wait;//printf("%d", wait->next == *p);}}int main(){struct wait_queue wait = { 1, NULL };struct wait_queue wait1 = { 2, NULL };struct wait_queue wait2 = { 3, NULL };struct wait_queue * head = NULL;add_wait_queue(&head, &wait);add_wait_queue(&head, &wait1);add_wait_queue(&head, &wait2);int c = 5;while(c--) {printf("%d", head->task);head = head->next;}}*/wait->next = (*p)->next;(*p)->next = wait;}restore_flags(flags);}extern inline void remove_wait_queue(struct wait_queue ** p, struct wait_queue * wait){unsigned long flags;struct wait_queue * tmp;#ifdef DEBUGunsigned long ok = 0;#endifsave_flags(flags);cli();// 删除的是第一个节点并且只有一个节点了则头指针指向NULLif ((*p == wait) &&#ifdef DEBUG(ok = 1) &&#endif((*p = wait->next) == wait)) {*p = NULL;} else {// 从自己开始遍历单向循环链表,找到next指向自己的,然后更新指针tmp = wait;while (tmp->next != wait) {tmp = tmp->next;#ifdef DEBUGif (tmp == *p)ok = 1;#endif}tmp->next = wait->next;}wait->next = NULL;restore_flags(flags);#ifdef DEBUGif (!ok) {printk("removed wait_queue not on list.\n");printk("list = x, queue = x\n",(unsigned long) p, (unsigned long) wait);__asm__("call 1f\n1:\tpopl %0":"=r" (ok));printk("eip = x\n",ok);}#endif}
"linux单向循环链表源码分析"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!
节点
指向
指针
单向
环链
时候
源码
分析
内容
是在
更多
知识
循环
实用
学有所成
接下来
三个
代码
传统
只有
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
数据库一个字段对应多个值
网站的网络安全隐患
世界互联网大会方正科技
MCAFEE下载软件开发
汨罗软件开发学校
万得的金融终端是什么数据库
合肥计算机网络技术培训
读国家网络安全的读后感
为什么在软件开发中需要需求
关于网络安全保障监管
分布式数据库的概念以及特性
福建好的软件开发创新服务
海康威视视频管理服务器’
英灵神殿加入服务器ip
西西软件开发平台
睿渥杯网络安全
锐思数据库是权威的吗
db2数据库节点数量
数据库管理系统选修课
大数据软件开发怎么样
真正的网络安全大赛视频
上海市码头网络技术有限公司
大望路软件开发区
网络安全宣传周2020日程
根据什么定位数据库
幼儿园网络安全家长建议
国家大豆数据库
浅谈网络安全技术 800字
怎么ping 数据库地址
网络安全研究方向有哪些