当前位置: 首页 > news >正文

增光路网站建设网页设计全部代码

增光路网站建设,网页设计全部代码,莆田有哪几家做网站设计的,泰州seo网络公司链表是C语言编程中常用的数据结构#xff0c;比如我们要建一个整数链表#xff0c;一般可能这么定义#xff1a; struct int_node {int val;struct int_node *next;}; 为了实现链表的插入、删除、遍历等功能#xff0c;另外要再实现一系列函数#xff0c;比如#xff1a…链表是C语言编程中常用的数据结构比如我们要建一个整数链表一般可能这么定义 struct int_node {int val;struct int_node *next;}; 为了实现链表的插入、删除、遍历等功能另外要再实现一系列函数比如 void insert_node(struct int_node **head, int val);void delete_node(struct int_node *head, struct int_node *current);void access_node(struct int_node *head){struct int_node *node;for (node head; node ! NULL; node node-next) {// do something here}} 如果我们的代码里只有这么一个数据结构的话这样做当然没有问题但是当代码的规模足够大需要管理很多种链表难道需要为每一种链表都要实现一套插入、删除、遍历等功能函数吗 熟悉C的同学可能会说我们可以用标准模板库啊但是我们这里谈的是C在C语言里有没有比较好的方法呢 在本文中我们把目光投向当今开源界最大的C项目--Linux Kernel看看Linux内核如何解决这个问题。 Linux内核中一般使用双向链表声明为struct list_head这个结构体是在include/linux/types.h中定义的链表的访问是以宏或者内联函数的形式在include/linux/list.h中定义。 struct list_head {struct list_head *next, *prev;}; Linux内核为链表提供了一致的访问接口。 void INIT_LIST_HEAD(struct list_head *list)void list_add(struct list_head *new, struct list_head *head)void list_add_tail(struct list_head *new, struct list_head *head)void list_del(struct list_head *entry);int list_empty(const struct list_head *head) 以上只是从Linux内核里摘选的几个常用接口更多的定义请参考Linux内核源代码。 我们先通过一个简单的实作来对Linux内核如何处理链表建立一个感性的认识。 #include stdio.h#include list.hstruct int_node {int val;struct list_head list;};int main(){struct list_head head, *plist;struct int_node a, b;a.val 2;b.val 3;INIT_LIST_HEAD(head);list_add(a.list, head);list_add(b.list, head);list_for_each(plist, head) {struct int_node *node list_entry(plist, struct int_node, list);printf(val %d\n, node-val);}return 0;} 看完这个实作是不是觉得在C代码里管理一个链表也很简单呢 代码中包含的头文件list.h是我从Linux内核里抽取出来并做了一点修改的链表处理代码现附在这里给大家参考使用的时候只要把这个头文件包含到自己的工程里即可。 代码 list_head通常是嵌在数据结构内使用在上文的实作中我们还是以整数链表为例int_node的定义如下 struct int_node {int val;struct list_head list;}; 1 2 3 4 使用list_head组织的链表的结构如下图所示 遍历链表是用宏list_for_each来完成。 #define list_for_each(pos, head) \for (pos (head)-next; prefetch(pos-next), pos ! (head); \pos pos-next) 在这里pos和head均是struct list_head。在遍历的过程中如果需要访问节点可以用list_entry来取得这个节点的基址。 #define list_entry(ptr, type, member) \container_of(ptr, type, member) 我们来看看container_of是如何实现的。如下图所示我们已经知道TYPE结构中MEMBER的地址如果要得到这个结构体的地址只需要知道MEMBER在结构体中的偏移量就可以了。如何得到这个偏移量地址呢这里用到C语言的一个小技巧我们不妨把结构体投影到地址为0的地方那么成员的绝对地址就是偏移量。得到偏移量之后再根据ptr指针指向的地址就可以很容易的计算出结构体的地址。 list_entry就是通过上面的方法从ptr指针得到我们需要的type结构体。 Linux内核代码博大精深陈莉君老师曾把它形容为“覆压三百余里隔离天日”摘自《阿房宫赋》可见其内容之丰富、结构之庞杂。内核里有着众多重要的数据结构具有相关性的数据结构之间很多都是用本文介绍的链表组织在一起看来list_head结构虽小作用可真不小。 Linux内核是个伟大的工程其源代码里还有很多精妙之处值得C/C程序员认真去阅读即使我们不去做内核相关的工作阅读精彩的代码对程序员自我修养的提高也是大有裨益的。
http://www.w-s-a.com/news/884495/

相关文章:

  • 如何承接网站建设外包wordpress产品布局
  • 洛阳建站洛阳市网站建设视觉设计专业
  • 婚恋网站建设分析网站建设硬件需求
  • 北京做网站电话wordpress如何换图片
  • 电影网站做cpa深圳信息网
  • 单县网站建设优化大师电脑版官网
  • 番禺区住房和建设局物业网站浦东新区网站设计
  • 外贸网站外包WordPress仿牌
  • 如何设计网站logohtml5开发
  • 金坛建设银行总行网站网站开发费用如何记账
  • 贵阳企业网站设计制作湛江知名网站建设电话
  • 网站建设安全性高清效果图网站
  • 上海网站排名推广黄山公司做网站
  • 全国网站建设公司实力排名单页面网站建设
  • 网站建设方案 规划wordpress 要备案吗
  • 一个完整的网站 技术网站建设中 敬请期待.
  • 如何建一个公司的网站网上怎么推广公司产品
  • 十大旅游电子商务网站影楼网站制作
  • 深圳网站建设代理商网业打开慢的原因
  • 旅游网站经营模式在屈臣氏做网站运营
  • 做管理信息的网站com域名查询
  • 免费推广网站推荐外贸推广平台哪个好
  • 腾宁科技做网站399元全包企业校园网站建设
  • 海外医疗兼职网站建设公司取名字大全免费
  • 龙口市规划建设局网站vi设计和品牌设计的区别
  • 企业网站的总体设计网站建设评审验收会议主持词
  • 网站建设完成推广响应式网站设计开发
  • 电商网站用php做的吗网站开发流程可规划为那三个阶段
  • flash网站怎么做音乐停止深圳网站建设金瓷网络
  • 哪个网站可以做房产信息群发怎么做国内网站吗