用 C 中的谓词函数构建链表
Build linked list with the predicated function in C
我有这个赋值 typedef int (*FuncaoPredicado)(void *)
并且该函数接收一个 void *
参数和 returns 整数值,如果该值不为零,则该参数具有所需的谓词,否则,它 returns零值。
我创建了一个通用函数来构建一个链接列表,其中的数字可以被原始列表中的 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
。
但现在我无法使用谓词创建新列表。
为了完成 split
实现,我看到另一个函数 duplicarLista
实现了相同的实现,但我只需要添加有关谓词函数的验证。
pDLista split(pDLista pd, FuncaoPredicado fp, FuncaoImpressao pfi, FuncaoAlocacao fa) {
pDLista pNovaListaComPredicado = criarLista();
pNoh atual = pd->primeiro;
pNovaListaComPredicado->primeiro = NULL;
pNovaListaComPredicado->ultimo = NULL;
pNovaListaComPredicado->quantidade = 0;
while(atual != NULL) {
if(fp(atual->info) == 1) {
void *auxInfo = fa(atual->info);
incluirInfo(pNovaListaComPredicado, auxInfo);
}
atual = atual->prox;
}
printf("\n");
return pNovaListaComPredicado;
}
我有这个赋值 typedef int (*FuncaoPredicado)(void *)
并且该函数接收一个 void *
参数和 returns 整数值,如果该值不为零,则该参数具有所需的谓词,否则,它 returns零值。
我创建了一个通用函数来构建一个链接列表,其中的数字可以被原始列表中的 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
。
但现在我无法使用谓词创建新列表。
为了完成 split
实现,我看到另一个函数 duplicarLista
实现了相同的实现,但我只需要添加有关谓词函数的验证。
pDLista split(pDLista pd, FuncaoPredicado fp, FuncaoImpressao pfi, FuncaoAlocacao fa) {
pDLista pNovaListaComPredicado = criarLista();
pNoh atual = pd->primeiro;
pNovaListaComPredicado->primeiro = NULL;
pNovaListaComPredicado->ultimo = NULL;
pNovaListaComPredicado->quantidade = 0;
while(atual != NULL) {
if(fp(atual->info) == 1) {
void *auxInfo = fa(atual->info);
incluirInfo(pNovaListaComPredicado, auxInfo);
}
atual = atual->prox;
}
printf("\n");
return pNovaListaComPredicado;
}