我可以为2种不同的结构使用相同的指针吗?

时间:2017-05-28 00:10:49

标签: c list structure

    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')?

2 个答案:

答案 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;
}