我正在C
中制作ADT List Iterator
。 当我使用基元将列表打印到开头时,它们可以正常工作。但是,在main内部,我想在列表上创建迭代器,看看删除原语是否正常工作(我无法正常工作),但随后我想再次使用print_list_iterator()
打印列表,它不起作用。 我有这样的结构:
typedef struct node{
struct node *next;
void *data;
}nodo_t;
typedef struct list{
struct node *head;
}list_t;
typedef struct iterator{
node_t **pn;
}list_iterator_t;
这些是我正在使用的ADT Iterator
的基元;
list_iterator_t * list_iterator_create(list_t * l){
struct iterator *li = malloc(sizeof(struct iterator));
if(li == NULL)
return NULL;
li->pn = &(l->head);
return li;
}
bool list_iterator_next(list_iterator_t *li){
if(*li->pn == NULL){
return false;
}
*li->pn = (*li->pn)->next;
return true;
}
void *list_iterator_current(const list_iterator_t *li){
if((*li->pn) == NULL){
return NULL;
}
return (*li->pn)->data;
}
在这里,我的原语删除迭代器;
void *list_iterator_delete(lista_iterator_t *li){
if(*li->pn == NULL)
return NULL;
struct node *aux;
void *aux_data = (*li->pn)->data;
aux = (*li->pn);
*li->pn = (*li->pn)->next;
free(aux);
return aux_data;
}
然后,如果我想打印我正在使用的列表:
void print_list_iterator(lista_t * l){
for(list_iterator_t *li =list_iterator_create(l);
!list_iterator_finish(li);
list_iterator_next(li)
){
int *e = list_iterator_current(li);
printf("%d -> ",*e);
}
}
如果我使用print_list_iterator()
,那么总的来说,它不允许我在同一列表中创建迭代器并使用我的原语。 有什么想法吗? 顺便说一下,我想知道这些原语是否得到了很好的实现。
功能测试主要: int main(){
list_t *dest = list_create();
list_iterator_t *iter = list_iterator_create(dest);
int vector[] = {88,99,1,0,5,106,22,44,56,3,5,6,3,4,6};
size_t vector_size = sizeof(vector)/sizeof(vector[0]);
for(size_t i=0; i<vector_size; i++)
list_append(dest, vector +i);
list_iterator_delete(iter);
list_iterator_delete(iter);
list_iterator_delete(iter);
list_iterator_delete(iter);
print_list_iterator(dest);
在终端中:
MacBook-Air: UltraT$ gcc iterator_double_pointers.c -std=c99 -Wall -pedantic -o it2
MacBook-Air: UltraT$ ./it2
5 -> 106 -> 22 -> 44 -> 56 -> 3 -> 5 -> 6 -> 3 -> 4 -> 6 ->
所以,我的函数工作正常,但是: 如果我调用 print 函数(它实际上是一个使用迭代器原语运行列表的函数,这就是我共享迭代器原语的原因,因为那里可能存在一些错误)
print_list_iterator(destino);
list_iterator_delete(iter);
print_list_iterator(destino);
list_iterator_delete(iter);
list_iterator_delete(iter);
list_iterator_delete(iter);
终端中的结果:
MacBook-Air:tp2 UltraT$ ./it2
88 -> 99 -> 1 -> 0 -> 5 -> 106 -> 22 -> 44 -> 56 -> 3 -> 5 -> 6 -> 3 -> 4 -> 6 ->
它不起作用。
这就是为什么我的消除功能有时有效,有时无效。我不知道问题出在哪里,是在打印功能(实际上是通过列表)还是在删除功能中
最后,我通过使用 *prev 和 *curr(当前节点)解决了它。 将来我想更改函数以将其与双指针一起使用。
struct list_iterator{
node_t *prev;
node_t *curr;
list_t *l_iter;
};
typedef struct list_iterator list_iterator_t
void * delete_iterator_list(list_iterator_t * li) {
if (list_iterator_finish (li))
return NULL;
struct node * aux_node;
void * data;
if (! li-> prev) {
data = li-> curr-> data;
aux_node = li-> curr;
li-> l_iter-> head = aux_node-> next;
li-> curr = li-> l_iter-> head;
}
else if (li-> curr-> next == NULL) {
data = li-> curr-> data;
aux_node = li-> curr;
li-> curr = li-> curr-> next;
li-> prev-> next = li-> curr;
}
else {
data = li-> curr-> data;
aux_node = li-> curr;
li-> curr = li-> curr-> next;
li-> prev-> next = li-> curr;
}
free (aux_node);
return data;