如何比较C中链表中的每个项目?

时间:2013-11-25 01:42:03

标签: c search linked-list compare

我制作了一个这样的链表:

typedef struct {
    char *id;
    char *nombre;
    char *region;
    char *partido;
    int edad;
    struct votante *siguiente;
} votante;

我有一个函数可以创建新节点,并从文本文件中读取一些数据。问题是,我必须搜索具有相同ID但不同的人员#34; partido" (派对,就像政治一样)。但是当我在列表中移动时,我无法显示该信息。我有一个沿着整个列表移动的代码,它将一些X位置与X右边的另一个位置进行比较。问题是,信息重复,因为我正在搜索检查我的两个的每个可能组合条件。我认为我应该在检查之后删除一个节点以避免这种情况,并将每个已删除的节点保留在另一个列表中,只有已删除的人员,但我不知道如何实现它。 这是我的功能:

votante *consultarDobleRegistro(votante *lista){
    votante *aux = lista;
    votante *aux2 = aux->siguiente;
    votante *eliminar;
    votante *fraudes = crearVotante();
    int encontrar = 0;
    int vueltas = 0;

    while(aux->siguiente != NULL){
        //si existe el mismo ID en diferentes partidos
        if(strcmp(aux->id, aux2->id) == 0 && strcmp(aux->partido, aux2->partido) != 0){
            // agrego a "fraudes" el resultado que está después del parámetro a comparar
            encontrar++;
            if(encontrar==1){
                printf("encontro aux: %s - %s\n", aux->id, aux->partido);
            }
            printf("encontro aux2: %s - %s\n", aux2->id, aux2->partido);
            fraudes = agregarNodo(fraudes, aux2->id, aux2->nombre, aux2->region, aux2->partido, aux2->edad);
            if(aux2->siguiente == NULL){
                aux = aux->siguiente;
                aux2 = aux->siguiente;
            } else {
                aux2 = aux2->siguiente;
            }
        } else {
            if(aux2->siguiente == NULL){
                aux = aux->siguiente;
                encontrar = 0;
                vueltas++;
                aux2 = aux->siguiente;
            } else {
                aux2 = aux2->siguiente;
            }
        }
    }
    printf("vueltas: %d\n", vueltas);
    return fraudes;
}

我需要显示具有相同" ID"的节点。但不同的" partido" (或者让他们进入一个新的列表,这样我可以使用我的show()函数稍后显示它们。)

1 个答案:

答案 0 :(得分:1)

您提供的代码未显示主要问题 根据您的描述,您应该关注的是如何旅行和比较整个清单 我不是很擅长算法,所以解决方案可能效率不高,但希望提供一些基本的想法:
主要目的是对id进行分类,具有新的链表结构,如下所示:

struct votante_same_id {
    struct votante *id_group;
    struct votante_same_id *next;
};

struct votante_id_group {
    char *id;
    struct votante_same_id head;
    struct votante_id_group *next;
};

然后您浏览整个投票列表,将每个ID与votante_id_group-> id进行比较,
找到新的id后,将其添加到votante_id_group;否则将该votante添加到现有的votante_same_id列表中 当投票结束时,现在你旅行votante_id_group,然后分类partido,类似于上面。
最后,不同列表中的votante节点应该是您所需要的。