我们还可以使用宏使代码更易于读写。例如,我们可以foreach为一些数据结构(如单链接列表和双链接列表,队列等)实现宏以在C中实现该构造。
这是一个小例子。
#include <stdio.h> #include <stdlib.h> struct LinkedListNode { int data; struct LinkedListNode *next; }; #define FOREACH_LIST(node, list) \ for (node=list; node; node=node->next) /* Usage */ int main(void) { struct LinkedListNode *list, **plist = &list, *node; int i; for (i=0; i<10; i++) { *plist = malloc(sizeof(struct LinkedListNode)); (*plist)->data = i; (*plist)->next = NULL; plist = &(*plist)->next; } /* printing the elements here */ FOREACH_LIST(node, list) { printf("%d\n", node->data); } }
您可以为此类数据结构创建标准接口,并编写如下的通用实现FOREACH:
#include <stdio.h> #include <stdlib.h> typedef struct CollectionItem_ { int data; struct CollectionItem_ *next; } CollectionItem; typedef struct Collection_ { /* interface functions */ void* (*first)(void *coll); void* (*last) (void *coll); void* (*next) (void *coll, CollectionItem *currItem); CollectionItem *collectionHead; /* Other fields */ } Collection; /* must implement */ void *first(void *coll) { return ((Collection*)coll)->collectionHead; } /* must implement */ void *last(void *coll) { return NULL; } /* must implement */ void *next(void *coll, CollectionItem *curr) { return curr->next; } CollectionItem *new_CollectionItem(int data) { CollectionItem *item = malloc(sizeof(CollectionItem)); item->data = data; item->next = NULL; return item; } void Add_Collection(Collection *coll, int data) { CollectionItem **item = &coll->collectionHead; while(*item) item = &(*item)->next; (*item) = new_CollectionItem(data); } Collection *new_Collection() { Collection *nc = malloc(sizeof(Collection)); nc->first = first; nc->last = last; nc->next = next; return nc; } /* generic implementation */ #define FOREACH(node, collection) \ for (node = (collection)->first(collection); \ node != (collection)->last(collection); \ node = (collection)->next(collection, node)) int main(void) { Collection *coll = new_Collection(); CollectionItem *node; int i; for(i=0; i<10; i++) { Add_Collection(coll, i); } /* printing the elements here */ FOREACH(node, coll) { printf("%d\n", node->data); } }
要使用此通用实现,只需为您的数据结构实现这些功能。
1. void* (*first)(void *coll); 2. void* (*last) (void *coll); 3. void* (*next) (void *coll, CollectionItem *currItem);