今天我们来讲解上次留下的问题, 对单链表的操作实现一个简单的迭代器。
我们先来定义这个单链表的简单迭代器的操作接口, 如今有迭代器类型sl_iter, 则这个单链表的操作为:
extern sl_iter ds_slistBegin(struct _ds_slist* _p);
extern sl_iter ds_slistEnd(struct _ds_slist* _p);
extern sl_iter ds_slistNext(sl_iter _cur);
或许想要实现begin和end都是很简单的, 直接返回头节点和尾节点元素的地址就可以了, 但是难就难在怎么根据当前的节点值获取其在链表中的下一个元素了……
其实仔细想想也是挺简单的, 这个迭代器不是指针么? 我们只需要让这个指针的地址同时指向元素和单链表的内部节点结构不是就可以实现了么, 这样我们就可以根据这个地址来获取下一个元素的值了。
但是我们该如何让这个指针同时指向元素和链表的内部节点结构呢? 我想大家都想到了吧, 那就让这个元素值做链表节点结构的第一个元素。
struct _slist_node {
int _x;
struct _slist_node* _next;
};
这样便可以了。
我们再来定义这个iter。typedef int* sl_iter;为了操作方便我们再在其实现的内部定义typedef struct _slist_node* _slist_iter;这样这个链表的iter操作的秘密就在我们的眼前了。其接口的内部实现如下:
sl_iter ds_slistBegin(struct _ds_slist* _p) {
return (NULL != _p ? (sl_iter)_p->_head : NULL);
}
sl_iter ds_slistEnd(struct _ds_slist* _p) {
return (sl_iter)NULL;
}
sl_iter ds_slistNext(sl_iter _cur) {
_slist_iter _it = (_slist_iter)_cur;
return (NULL != _it ? (sl_iter)_it->_next : NULL);
}
对于这个简单的int类型的单链表操作就到这里吧, 下次我们再来讲解通用单链表的具体实现。