在另一个结构中使用node.next打印列表

时间:2013-06-23 20:36:00

标签: c pointers

所以我想出了如何链接列表,但现在我想显示它,我怎样才能实现这一点。我已经开始编写代码,但这不正确。有什么帮助吗?

typedef struct baseNode_s
{
    struct baseNode_s *proximo;
} baseNode;

typedef struct identificador_s
{
    int a;
    int b;
    int c;
} identificador;

typedef struct contaBancaria_s
{
    identificador id;
    int saldo;
    int credito;
    baseNode node;
} contaBancaria;

contaBancaria *contaP = NULL;

void lcontas() {
    contaBancaria *p;   
    printf("\n=================INICIOU A listagem\n");
    for(p=contaP; p->node.proximo != NULL; p->node = p->node.proximo){
        printf("\n%d - %d - %d %d %d", p->id.a, p->id.b, p->id.c, p->saldo, p->credito);
    }
    free(p);
    printf("\nChegou ao fim da listagem\n");
}

2 个答案:

答案 0 :(得分:1)

使用您定义的数据结构,您需要一种机制来从指向contaBancaria所包含的baseNode的指针恢复指向contaBancaria的原始指针。

您可以使用使用offsetof()宏的辅助函数来执行此操作。

contaBancaria *base2conta (baseNode *base) {
    return base ? (void *)((char *)base - offsetof(contaBancaria, node)) : NULL;
}

然后,当您进行迭代时,您可以将proximo转换为contaBancaria

for(p=contaP; p != NULL; p = base2conta(p->node.proximo)){
    printf("\n%d - %d - %d %d %d",
           p->id.a, p->id.b, p->id.c, p->saldo, p->credito);
}

您的打印功能也不应该free(p)p用于读取列表,没有分配新内存来执行此操作。

答案 1 :(得分:0)

实现目标的一种简单方法是使用一个带有指向元素的指针的结构(在您的情况下,类型为contaBancaria的东西)和指向列表中下一个元素的指针。这很简单,但每次要访问elem指向的内容时都要求您执行转换,这种不便通常是通过使用宏进行专业化来解决的(请查看SLIST),但是这个案例只允许演员: - )

typedef struct baseNode_s
{
    void *elem;
    struct baseNode_s *proximo;
} baseNode;

typedef struct identificador_s
{
    int a;
    int b;
    int c;
} identificador;

typedef struct contaBancaria_s
{
    identificador id;
    int saldo;
    int credito;
} contaBancaria;

baseNode *contaP = NULL;

void lcontas() {
    contaBancaria *p;
    /*
    I'm assuming assume that you are building the list
    here and that contaP will point to its head.
    */
    printf("\n=================INICIOU A listagem\n");
    /*
    I'm also assuming that the first node in the list is garbage.
    This simplifies things like inserting (no special case).
    */
    for (p = contaP->proximo; p != NULL; p = p->proximo) {
        contaBancaria *cb = (contaBancaria*) p->elem;
        printf("\n%d - %d - %d %d %d", cb->id.a, cb->id.b, cb->id.c, cb->saldo, cb->credito);
    }
    /*
    Free the list properly...
    */
    printf("\nChegou ao fim da listagem\n");
}