ds通用slist(1.2)

本文介绍如何使用C语言宏实现通用单链表,并提供关键函数如创建、插入、删除等操作的具体代码。

通过前面对于单链表的简单复习, 我想大家也对单链表有些熟悉了吧, 对于其具体实现原理也比较了解了吧。

那今天我们开始正式进入通用单链表的构建。和前面的讲解通用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, 0sizeof(_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, 0sizeof(_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的其他实现方法。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值