找回密码
 立即注册
首页 业界区 业界 C 里面如何使用链表 list

C 里面如何使用链表 list

嗳诿 前天 17:35
c 的世界可能高频业务都依赖 list 增删改查. 这里简单交流下自己在 c 里面使用 list 
 
1. 学生时代, 那会学习 C 数据结构, 比较简单
  1. struct person {
  2.     int id;
  3.     char name[64+1];
  4.     struct person * next;
  5. };
复制代码
类似上面这样, 需要什么依赖 next 指针来回调整, 然后手工 print F5 去 debug 熬. 
 
2. 刚工作青年时代, 主要花活, 随大流
类似
structc/modular/test/list.h at master · wangzhione/structc
  1. #pragma once
  2. #include "struct.h"
  3. //
  4. // list.h 似魔鬼的步伐, 单链表库
  5. // $LIST 需要嵌入 struct 的第一行
  6. // void * list = nullptr;      //        create list
  7. // list_delete(list, fide); // [可选] delete list
  8. //
  9. struct $list {
  10.     struct $list * next;
  11. };
  12. #define $LIST struct $list $node;
复制代码
 
或者类似
ccan/ccan/list/list.h at master · rustyrussell/ccan
  1. /**
  2. * struct list_node - an entry in a doubly-linked list
  3. * @next: next entry (self if empty)
  4. * @prev: previous entry (self if empty)
  5. *
  6. * This is used as an entry in a linked list.
  7. * Example:
  8. *    struct child {
  9. *        const char *name;
  10. *        // Linked list of all us children.
  11. *        struct list_node list;
  12. *    };
  13. */
  14. struct list_node
  15. {
  16.     struct list_node *next, *prev;
  17. };
  18. /**
  19. * struct list_head - the head of a doubly-linked list
  20. * @h: the list_head (containing next and prev pointers)
  21. *
  22. * This is used as the head of a linked list.
  23. * Example:
  24. *    struct parent {
  25. *        const char *name;
  26. *        struct list_head children;
  27. *        unsigned int num_children;
  28. *    };
  29. */
  30. struct list_head
  31. {
  32.     struct list_node n;
  33. };
复制代码
 
杂技, 理解的心智负担稍微高一点, 但使用上对方有了单元测试, 比较成熟, list 结构问题较少, 除了业务的内存错位自己 debug 稍微麻烦点.  
 
3. 35岁中年之后, 又想起刚开始那会
skynet/skynet-src/socket_server.c at master · cloudwu/skynet
类似这样
  1. struct write_buffer {
  2.     struct write_buffer * next;
  3.     const void *buffer;
  4.     char *ptr;
  5.     size_t sz;
  6.     bool userobject;
  7. };
  8. struct write_buffer_udp {
  9.     struct write_buffer buffer;
  10.     uint8_t udp_address[UDP_ADDRESS_SIZE];
  11. };
  12. struct wb_list {
  13.     struct write_buffer * head;
  14.     struct write_buffer * tail;
  15. };
复制代码
需要 list , 还是直接 next 指针来回调整. 
 
当下各种 ai 加持, 这种方式可能是最简单最直接, 当然 c 写代码相对麻烦, 多做好单元测试.
人生也类似, 兜兜转转一个圈, 那种圈在时空维度看, 是螺旋上升的. 
不知道有没有人好奇, 为什么不直接一开始就上升呢, 可能生命不需要赶着投胎吧, 浪费不是时间, 也不是人生, 也可能是享受到了时间, 享受到了自己来回波动的人生. 

: ) Good luckly ~

4. 未来时代, 对于个人而言, C 融入自己思维一部分, 可能不再去主动写了. 
类似婴儿那会记忆, 与其说忘了, 已经存在于脑海最底层机制里面了. 
 

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册