【问题标题】:Build linked list with the predicated function in C用C中的谓词函数构建链表
【发布时间】: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 中接收到我的函数predicadoDivisivelPor3split(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


【解决方案1】:

为了完成 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;
}

【讨论】:

    猜你喜欢
    • 2010-10-11
    • 1970-01-01
    • 2015-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-02
    • 2015-02-23
    相关资源
    最近更新 更多