2017-05-28 35 views
0
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個不同的結構?我可以使用2個不同結構的相同指針嗎?

+0

**永遠不要**'typedef'一個指向對象的類型! – Olaf

回答

1

如果沒有在任何地方使用struct name,則不必命名struct

所以,你可以簡單地刪除第二個名字,因爲它似乎並沒有被使用:

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

如果你不確認的數據佈局,你可以重新組織你的兩種結構:

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; 

這將使你從演員陣容到指向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; 
} 
相關問題