我的书中的图形邻接表代码由下式给出:

typedef struct vertexNode //vertexNode in an AdjacencyList
{
    VertexType data;
    EdgeNodeType *firstEdgeNode;

} VertexNode, AdjList[MAXVEX];

AdjList adjList; # adjList is a MAXVEX-size array


我对typedef的最后一行感到困惑:typedef struct{...} AdjList[MAXVEX]

我能理解的形式是:

typedef struct{
...
} VertexNode,

VertexNode AdjList[MAXVEX]; # AdjList is a MAXVEX-size array


要么

struct{
...
} AdjList[MAXVEX]; # AdjList is a MAXVEX-size array

最佳答案

在语法上,typedef实际上是一个存储类,例如staticextern,并且类型别名声明的读取方式类似于变量声明。例如。

int x;


声明xint类型的变量,而

typedef int x;


声明x为类型别名,表示int

同样,

struct vertexNode {
    ...
} VertexNode;


会将VertexNode声明为struct vertexNode变量,但是添加typedef使其成为struct vertexNode的别名。请注意,struct vertexNode { ... }(整个事物)是一种类型,就像int一样。它首先定义struct vertexNode,然后引用它。

此外,使用逗号时,数组声明的行为可能看起来很奇怪:

int x, y[5];


声明xint,同时声明y5 int的数组。 (函数和指针也是如此。)此网站上还有其他问题。

将所有内容放在一起,如果您删除了typedef,您的问题将如下所示:

struct vertexNode
{
    VertexType data;
    EdgeNodeType *firstEdgeNode;
} VertexNode, AdjList[MAXVEX];


这将声明类型struct vertexNode,类型VertexNode的变量struct vertexNodeAdjList MAXVEX s的数组struct vertexNode。添加typedef意味着VertexNode成为struct vertexNode的别名,并且AdjList成为MAXVEX struct vertexNode s数组的别名。就个人而言,我不建议这样写,但我想它很简洁。

09-11 17:54