【发布时间】:2021-12-29 10:37:37
【问题描述】:
我有这个赋值typedef int (*FuncaoPredicado)(void *),该函数接收void * 参数并返回整数值,如果非零,则参数具有所需的谓词,否则返回零值。
我创建了一个通用函数来构建一个链表,其中的数字可被原始列表中的 3 整除。
int predicadoDivisivelPor3(void *info) {
int *pi = (int *)info;
return (*pi % 3) == 0 ? 1 : 0;
}
split函数实现
pDLista split(pDLista pd, FuncaoPredicado fp, FuncaoImpressao pfi) {
pDLista pNovaListaComPredicado = criarLista();
pNoh atual = pd->primeiro;
while(atual != NULL) {
if(fp(atual->info) == 1) {
pNovaListaComPredicado->primeiro = atual->prox;
pNovaListaComPredicado->ultimo = pd->ultimo;
pNovaListaComPredicado->quantidade = pd->quantidade;
pd->ultimo = atual;
atual->prox = NULL;
}
atual = atual->prox;
}
printf("\n");
return pNovaListaComPredicado;
}
函数FuncaoPredicado fp 是一个参数,我将在main.c 中接收到我的函数predicadoDivisivelPor3。
split(pListaInt, predicadoDivisivelPor3, imprimeInt);
当我打电话给main.c时
pDLista divisao = split(pListaInt, predicadoDivisivelPor3, imprimeInt);
imprimirLista(divisao, imprimeInt);
我创建的链表是1 - 3 - 5 - 6 - 9 - ,但是这个拆分函数的结果是5 - 6 - 9。
但现在我无法实现使用谓词创建新列表。
【问题讨论】:
-
代码很糟糕。问题不清楚。
-
通过“新列表”,您的意思是要从原始列表中删除这些节点并将它们插入另一个?或者您想在不修改原始列表的情况下将它们复制到一个新列表中?如果要删除它们,只需在遍历时记住前一个节点,以便修改链接。除非它是一个双向链表。
-
好的,我将编辑@VladfromMoscow 并提供更多信息。
-
好的,你已经知道如何建立一个列表,因为你已经做到了。因此,当谓词匹配时,将值从另一个列表复制到新列表中的新节点上。我们真的不能提供更多建议。您还没有展示可以分配和构建列表的代码,也没有解释为什么您“无法”实现这一点。
-
您只是在修改新列表的指针以指向另一个列表。那是自找麻烦。如果你想复制一个列表,那么你需要为新节点分配内存并将它们链接到那个new列表中。除非您真的知道自己在做什么,否则不要从一个列表指向另一个列表。
标签: c linked-list