所以我想出了如何链接列表,但现在我想显示它,我怎样才能实现这一点。我已经开始编写代码,但这不正确。有什么帮助吗?
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");
}
答案 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");
}