typedef struct{
int numero, curso, ano, regime;
}dados_aluno;
typedef struct{
char disc[MAX_NOME];
char nome[MAX_NOME];
}dados_disc;
typedef struct lnode *List;
typedef struct lnode{
dados_aluno info;
List previous;
List next;
}aluno_node;
typedef struct lnode{
dados_disc info;
List previous;
List next;
}disc_node;
'struct lnode'的重新定义显示为错误。 有没有办法可以为2种不同的结构使用相同的指针(在本例中为'* List')?
答案 0 :(得分:1)
如果struct
未在任何地方使用,则无需为struct name
命名。
所以你可以简单地删除第二个名字,因为似乎没有使用它:
typedef struct lnode *List;
typedef struct lnode{
dados_aluno info;
List previous;
List next;
}aluno_node;
typedef struct{ // <== name removed
dados_disc info;
List previous;
List next;
}disc_node;
回答其他答案的问题:
typedef struct lnode *List;
未声明struct lnode
,使用其定义(此处,此处,在下面的声明之前)。 (并且,不,List
不能指向两种不同的类型)
答案 1 :(得分:1)
如果您未致力于数据布局,则可以重新组织两种结构:
struct list_node;
typedef struct list_node * List;
struct list_node {
List prev;
List next;
};
typedef struct {
struct list_node list;
dados_disc info;
} disc_node;
这将使您能够从List转换为指向disc_node(或任何其他节点类型),只要您有办法知道哪个是哪个。
或者,您可以考虑使用这两种类型的union
。同样,您必须确定如何区分它们:
typedef union lnode * List;
typedef ... disc_node;
typedef ... aluno_node;
typedef union lnode {
disc_node disc;
aluno_node aluno;
} lnode;
然后通过以下方式访问它们:
List p;
p = some_function_returning_List();
if (is_disc(p)) {
nome = p->disc.info.nome;
p = p->disc.next;
}
else {
num = p->aluno.info.numero;
p = p->aluno.next;
}