单向链表如何实现一个迭代器函数

发布于 2022-08-24 10:05:50 字数 414 浏览 7 评论 0

数据结构是这样的:

typedef struct node {
void *data;
struct node *next;
} node_t;

typedef struct list {
node_t *head;
} list_t;

其中node_t 结构是操作封装的.

我想实现一个迭代器函数

int list_iter(list_t *,void *);

当循环达到list结束的时候返回0,否则返回1

也就是我可以这么使用iter:

while(list_iter(list,&data)){
   //do something,such as get out data
}

我想封装这个函数, 要用到static .但是static修饰的迭代节点指针不能很好的指示链表结束

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

甜柠檬 2022-08-31 10:05:50

我认为两个方案
1,在list_iter中每读出一个node销毁一个,直到某个node->next为null
2,扩展list_t,增加一个node_t *c_node。默认同head,每读一个向下走一个,直到null

宛菡 2022-08-31 10:05:50
int list_iter(list_t *list, void **data_ptr)
{
static node_t *p = NULL;
static int flag = 0;

if (!flag){ //p init to head node when the first time
p = list->head;
flag = 1;
}

if (!p){
flag = 0;
return 0;
}
*data_ptr = p->data;
p = p->next;
return 1;
}
温暖的光 2022-08-31 10:05:50
typedef struct node {
void *data;
struct node *next;
} node_t;

typedef struct list {
node_t *head;
} list_t;

#include <stdio.h>
#include <malloc.h>
int list_iter(list_t *list,void **data){

	//若list指向空指针,直接退出
	if(!list->head)return 0;
	*data = list->head->data;
	list->head = list->head->next;

	return 1;
}
int main(){
	node_t node = {(void*)0xFFFFFFFF,0};
	node_t *p = &node;
	list_t list = {&node};
	void *data;
	int i;
	
	//初始化链表
	for(i = 0; i < 10; ++i){
		printf("filling data %p\n",2 * i + 1);
		
		p->next = malloc(sizeof *p);
		p = p->next;
		p->data = (void*)(2 * i + 1);
		
	}
	p->next = NULL;
	
	//使用迭代函数
	while(list_iter(&list,&data)){
		printf("%p\n",data);
	}
	return 0;
}

你可以试试。不知你是不是这个意思。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文