*引用本文請註明來自 blog.csdn.net/wtz1985
容器(container)這個詞眼,相信大家都不陌生了,特別是JAVA或C#的人,應該是比較熟悉了,它只是一個中間介面,也就是一個純虛類。它的實現可以通過鏈表或者數組等結構,它的出現就是為了其他函數體可以自由地選擇適合自己的實現結構。比如雜湊表、堆棧等結構,既可以用鏈表實現,也可以用動態數組實現,如果沒有一個中間介面的話,想要實現它,那就要分開實現了,這樣太浪費時間和空間了。
1、介面定義。
- /*----- container.h -------*/
- #ifndef _CONTAINER_H
- #define _CONTAINER_H
- struct _Container;
- typedef struct _Container Container;
- yptedef void (*ForeachFunc)(void* data, void* ctx);
- typedef void* (*ContainerAppendFunc)(Container* thiz, void* data);
- typedef void* (*ContainerInsertFunc)(Container* thiz, void* data, size* index);
- typedef void* (*ContainerDeleteFunc)(Container* thiz, size_t index);
- typedef void (*ContainerDestroyFunc)(Container* thiz);
- typedef void (*ContainerForeachFunc)(Container* thiz, ForeachFunc print, void* ctx);
- struct _Container
- {
- ContainerAppendFunc container_append;
- ContainerInsertFunc container_insert;
- ContainerDeleteFunc container_delete;
- ContainerDestroyFunc container_func;
- ContainrForeachFunc container_foreach;
- char priv[0];
- };
- static inline void* container_append(Container* thiz, void* data)
- {
- assert(thiz != NULL && thiz->container_append != NULL);
- return thiz->container_append(thiz, data);
- }
- static inline void* container_insert(Container* thiz, void* data, size_t index)
- {
- assert(thiz != NULL && thiz->container_insert != NULL);
- return thiz->container_insert(thiz, data, index);
- }
- static inline void* container_delete(Container* thiz, size_t index)
- {
- assert(thiz != NULL && thiz->container_delete != NULL);
- return thiz->container_delete(thiz, index);
- }
- static inline void container_destroy(Container* thiz)
- {
- assert(thiz != NULL && thiz->container_destroy != NULL);
- return thiz->container_destroy(thiz);
- }
- static inline void container_foreach(Container* thiz, ForeachFunc print, void* ctx)
- {
- assert(thiz != NULL && thiz->container_foreach != NULL);
- return thiz->container_foreach(thiz, print, ctx);
- }
- #endif /_CONTAINER_H/
2、不同的介面實現:
鏈表:
- /*------- container_list.h ---------*/
- #include "container.h"
- #include "dlist.h"
- #ifndef _CONTAINER_LIST_H
- #define _CONTAINER_LIST_H
- Container* container_list_create(DList* list);
- #endif /*_CONTAINER_H*/
動態數組:
- /*--------- container_vector.h -----------*/
- #include "vector.h"
- #include "container.h"
- #ifndef _CONTAINER_VECTOR_H
- #define _CONTAINER_VECTOR_H
- Container* container_vector_create(Vector* thiz);
- #endif /*CONTAINER_VECTOR_H*/
有了這些介面,具體的實現,就不必再寫,相信大家都應該知道了,如果有寫得不好的地方,請大家再指教指教。
~~end~~