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れる へのポインタから元のポインタを復元するメカニズムが必要です。baseNodecontaBancaria

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リストを読み取るために使用されているため、そのために新しいメモリは割り当てられていません。

于 2013-06-23T21:17:08.697 に答える