C語言–容器的實現。

來源:互聯網
上載者:User

 *引用本文請註明來自 blog.csdn.net/wtz1985       

容器(container)這個詞眼,相信大家都不陌生了,特別是JAVA或C#的人,應該是比較熟悉了,它只是一個中間介面,也就是一個純虛類。它的實現可以通過鏈表或者數組等結構,它的出現就是為了其他函數體可以自由地選擇適合自己的實現結構。比如雜湊表、堆棧等結構,既可以用鏈表實現,也可以用動態數組實現,如果沒有一個中間介面的話,想要實現它,那就要分開實現了,這樣太浪費時間和空間了。

1、介面定義。

  1. /*----- container.h -------*/
  2. #ifndef _CONTAINER_H 
  3. #define _CONTAINER_H 
  4. struct _Container;
  5. typedef struct _Container Container;
  6. yptedef void (*ForeachFunc)(void*  data, void* ctx);
  7. typedef void* (*ContainerAppendFunc)(Container* thiz, void* data);
  8. typedef void* (*ContainerInsertFunc)(Container* thiz, void* data, size* index);
  9. typedef void* (*ContainerDeleteFunc)(Container* thiz,  size_t index);
  10. typedef void  (*ContainerDestroyFunc)(Container* thiz);
  11. typedef void  (*ContainerForeachFunc)(Container* thiz, ForeachFunc print, void* ctx);
  12. struct _Container
  13. {
  14.   ContainerAppendFunc container_append;
  15.   ContainerInsertFunc container_insert;
  16.   ContainerDeleteFunc container_delete;
  17.   ContainerDestroyFunc container_func;
  18.   ContainrForeachFunc  container_foreach;
  19.   char priv[0];
  20. };
  21. static inline void* container_append(Container* thiz, void* data)
  22. {
  23.   assert(thiz != NULL && thiz->container_append != NULL);
  24.   return thiz->container_append(thiz, data);
  25. }
  26. static inline void* container_insert(Container* thiz, void* data, size_t index)
  27. {
  28.   assert(thiz != NULL && thiz->container_insert != NULL);
  29.   return thiz->container_insert(thiz, data, index);
  30. }
  31. static inline void* container_delete(Container* thiz, size_t index)
  32. {
  33.   assert(thiz != NULL && thiz->container_delete != NULL);
  34.   return thiz->container_delete(thiz, index);
  35. }
  36. static inline void container_destroy(Container* thiz)
  37. {
  38.   assert(thiz != NULL && thiz->container_destroy != NULL);
  39.   return thiz->container_destroy(thiz);
  40. }
  41. static inline void  container_foreach(Container* thiz, ForeachFunc print, void* ctx)
  42. {
  43.   assert(thiz != NULL && thiz->container_foreach != NULL);
  44.   return thiz->container_foreach(thiz, print, ctx);
  45. #endif /_CONTAINER_H/

2、不同的介面實現:

鏈表:

  1. /*------- container_list.h ---------*/
  2. #include "container.h" 
  3. #include "dlist.h" 
  4. #ifndef _CONTAINER_LIST_H 
  5. #define _CONTAINER_LIST_H 
  6. Container* container_list_create(DList* list); 
  7. #endif  /*_CONTAINER_H*/

動態數組

  1. /*---------  container_vector.h -----------*/
  2. #include "vector.h" 
  3. #include "container.h" 
  4. #ifndef _CONTAINER_VECTOR_H 
  5. #define _CONTAINER_VECTOR_H 
  6. Container* container_vector_create(Vector* thiz); 
  7. #endif /*CONTAINER_VECTOR_H*/

有了這些介面,具體的實現,就不必再寫,相信大家都應該知道了,如果有寫得不好的地方,請大家再指教指教。

 

~~end~~

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.