0

所以我已经弄清楚如何链接列表但现在我想显示它,我该如何实现这一点。我已经开始编写代码,但这就是不对的。有什么帮助吗?

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");
}
4

2 回答 2

1

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

您可以使用使用offsetof()宏的辅助函数来做到这一点。

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

然后,当您迭代时,您可以将 转换proximocontaBancaria.

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正在用于读取列表,没有分配新内存来执行此操作。

于 2013-06-23T21:17:08.697 回答
0

实现目标的一种简单方法是拥有一个结构,其中包含一个指向元素(在您的情况下为 type 的事物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");
}
于 2013-06-23T21:50:14.517 回答