通过前面对于单链表的简单复习, 我想大家也对单链表有些熟悉了吧, 对于其具体实现原理也比较了解了吧。
那今天我们开始正式进入通用单链表的构建。和前面的讲解通用stack的方法是一样的我们通过纯C语言可以有多种方式实现其通用的架构, 首先我们还是使用一种简单的方法来实现。
其实就是使用宏来具体实现了, 说简单, 也就是其动态替换给我们实现各种各样的类型提供了便利。在C语言中没有C++中的template, 利用宏确实解决了各种类型的复杂问题。同时我也一直认为这是一种取巧的实现方法, 不管怎么说, 实现的方法是很多的, 那具体怎么来实现就看个人的喜好了。我这里使用宏, 只是提供了一种建议罢了……
好了, 下面就是使用宏实现的简单的通用slist的具体实现, 希望看到的同学多多指教。
#ifndef __DS_SLIST_HEADER_H__
#define __DS_SLIST_HEADER_H__
#define __DS_SLIST_DECLARE(_type)/
struct _ds_slist_node {/
_type _data;/
struct _ds_slist_node* _next;/
};/
/
struct ds_slist {/
size_t _size;/
struct _ds_slist_node* _head;/
struct _ds_slist_node* _tail;/
};/
typedef struct _ds_slist_node* slist_iter;/
typedef void (*_ds_slist_func)(_type);/
/
/
/
/
static inline struct _ds_slist_node* _ds_slist_new_node(_type _x) {/
struct _ds_slist_node* node = NULL;/
size_t size = sizeof(struct _ds_slist_node);/
/
node = (struct _ds_slist_node*)ds_malloc(size);/
if (NULL != node) node->_data = _x;/
return node;/
}/
/
/
/
static inline slist_iter /
ds_slist_begin(struct ds_slist* self) {/
return (NULL != self ? self->_head : NULL);/
}/
/
static inline slist_iter /
ds_slist_end(struct ds_slist* self) {/
return NULL;/
}/
/
static inline slist_iter ds_slist_next(slist_iter it) {/
return (NULL != it ? it->_next : NULL);/
}/
/
/
static inline struct ds_slist* ds_slist_new(void) {/
struct ds_slist* self = NULL;/
size_t size = sizeof(struct ds_slist);/
/
self = (struct ds_slist*)ds_malloc(size);/
return self;/
}/
/
static inline void ds_slist_clear(struct ds_slist* self) {/
slist_iter node = NULL;/
/
if (NULL == self) return;/
while (NULL != self->_head) {/
node = self->_head;/
self->_head = self->_head->_next;/
DS_Free(node);/
}/
self->_size = 0;/
}/
/
static inline void ds_slist_free(struct ds_slist** self) {/
ds_slist_clear(*self);/
DS_Free(*self);/
}/
/
static inline int ds_slist_empty(struct ds_slist* self) {/
return ds_slist_begin(self) == ds_slist_end(self);/
}/
/
static inline size_t ds_slist_size(struct ds_slist* self) {/
return (NULL != self ? self->_size : 0);/
}/
/
static inline int ds_slist_push_back(struct ds_slist* self, _type x) {/
struct _ds_slist_node* node = _ds_slist_new_node(x);/
/
if (NULL == self || NULL == node) return 0;/
if (NULL == self->_head || NULL == self->_tail)/
self->_head = self->_tail = node;/
self->_tail->_next = node;/
self->_tail = node;/
self->_size++;/
return 1;/
}/
/
static inline int ds_slist_push_front(struct ds_slist* self, _type x) {/
struct _ds_slist_node* node = _ds_slist_new_node(x);/
/
if (NULL == self || NULL == node) return 0;/
if (NULL == self->_head || NULL == self->_tail)/
self->_head = self->_tail = node;/
node->_next = self->_head;/
self->_head = node;/
self->_size++;/
return 1;/
}/
/
static inline int ds_slist_pop_front(struct ds_slist* self) {/
struct _ds_slist_node* node = ds_slist_begin(self);/
/
if (NULL == self || NULL == node) return 0;/
self->_head = node->_next;/
DS_Free(node);/
self->_size--;/
return 1;/
}/
/
static inline _type ds_slist_front(struct ds_slist* self) {/
struct _ds_slist_node* node = ds_slist_begin(self);/
_type v;/
/
memset(&v, 0, sizeof(_type));/
return (NULL != node ? node->_data : v);/
}/
/
static inline _type ds_slist_back(struct ds_slist* self) {/
struct _ds_slist_node* node = NULL;/
_type v;/
/
memset(&v, 0, sizeof(_type));/
if (NULL == self) return v;/
node = self->_tail;/
return (NULL != node ? node->_data : v);/
}/
/
static inline int /
ds_slist_print(struct ds_slist* self, _ds_slist_func _func) {/
struct _ds_slist_node* node = NULL;/
/
if (NULL == self) return 0;/
node = self->_head;/
while (NULL != node) {/
if (NULL != _func) _func(node->_data);/
else printf("%d ", node->_data);/
node = node->_next;/
}/
printf("/n");/
return 1;/
}
#endif /* __DS_SLIST_HEADER_H__ */
好了这就是使用C语言的宏来"投机"实现的一种方法, 是不是看过之后也觉得不过如此呢? 不管怎么说, 或许对大家来说也很简单的吧, 但是自己动手去实现一遍我想也会有不一样的收获吧。
好了, 今天就到这里吧, 下一次我们再来一起探讨通用slist的其他实现方法。