用 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;
}