C 语言设计模式(三) 双链表
来源:互联网 发布:魔兽争霸3mac原生版 编辑:程序博客网 时间:2024/06/12 07:11
在C 语言中双链表的实现,已经有很多经典的实现,下面的代码,从 android 中摘取,事实上这段代码可能 google 的人最初从linux 的代码中学得,其实设置到了极限,都达到了设计的完美,那么大家几乎说就是一样了,因我完美是唯一的,对于同一个事物的抽线,最完美的表达是唯一的。
struct listnode{ struct listnode *next; struct listnode *prev;};#define node_to_item(node, container, member) \ (container *) (((char*) (node)) - offsetof(container, member))#define list_declare(name) \ struct listnode name = { \ .next = &name, \ .prev = &name, \ }#define list_for_each(node, list) \ for (node = (list)->next; node != (list); node = node->next)#define list_for_each_reverse(node, list) \ for (node = (list)->prev; node != (list); node = node->prev)void list_init(struct listnode *list);void list_add_tail(struct listnode *list, struct listnode *item);void list_remove(struct listnode *item);#define list_empty(list) ((list) == (list)->next)#define list_head(list) ((list)->next)#define list_tail(list) ((list)->prev)
摘录一段参考代码:
void service_for_each(void (*func)(struct service *svc)){ struct listnode *node; struct service *svc; list_for_each(node, &service_list) { svc = node_to_item(node, struct service, slist); func(svc); }}
struct service *service_find_by_name(const char *name){ struct listnode *node; struct service *svc; list_for_each(node, &service_list) { svc = node_to_item(node, struct service, slist); if (!strcmp(svc->name, name)) { return svc; } } return 0;}
- C 语言设计模式(三) 双链表
- C语言-设计模式
- C语言-设计模式
- C语言-设计模式
- C语言设计模式
- C语言-设计模式
- c语言设计模式
- C语言和设计模式
- C语言和设计模式
- C语言设计模式:迭代器
- C语言设计模式:备忘录
- C语言和设计模式
- C语言与设计模式
- C语言设计模式:单件模式
- C语言设计模式:原型模式
- C语言设计模式:组合模式
- C语言设计模式:模板模式
- C语言设计模式:外观模式
- 多对一Hibernate自动建表问题
- zencart 1.3.9
- 黑马程序员---深入解析String、StringBuilder
- 十诫
- HDU-1097A hard puzzle
- C 语言设计模式(三) 双链表
- shell 循环语句while的使用
- HDU 2010
- Zen Cart 1.5.1 英文版
- 一个挺好用的数据库操作类
- zoj 3448(最大流)
- Trie树(字典树、字母树)
- zencart 1.5.1 中文版
- 血的教训,一定不要再4.0以后在主线程里面访问网络NetworkOnMainThreadException