我正在阅读有关Algorithms
的书,其中包含以下代码。我在这里很难理解一些内容。
我在以下代码中将my doubt lines
显示为DOUBT LINE 1
和DOUBT LINE 2
。
我还注释了REFERENCE
这行,我在其中理解having difficulty
。
请详细说明DOUBT LINE 1
和DOUBT LINE 2
。
#define MAXV 100 /* maximum number of vertices */
#define NULL 0 /* null pointer */
/* DFS edge types */
#define TREE 0 /* tree edge */
#define BACK 1 /* back edge */
#define CROSS 2 /* cross edge */
#define FORWARD 3 /* forward edge */
typedef struct edgenode {
int y; /* adjancency info */
int weight; /* edge weight, if any */
struct edgenode *next; /* next edge in list */
} edgenode;
typedef struct {
edgenode *edges[MAXV+1]; /* adjacency info */ //REFERENCE
int degree[MAXV+1]; /* outdegree of each vertex */
int nvertices; /* number of vertices in the graph */
int nedges; /* number of edges in the graph */
int directed; /* is the graph directed? */
} graph;
它是graph.h标头,并且还有读取和插入功能。
read_graph(graph *g, bool directed)
{
int i; /* counter */
int m; /* number of edges */
int x, y; /* vertices in edge (x,y) */
initialize_graph(g, directed);
scanf("%d %d",&(g->nvertices),&m);
for (i=1; i<=m; i++) {
scanf("%d %d",&x,&y);
insert_edge(g,x,y,directed);
}
}
insert_edge(graph *g, int x, int y, bool directed)
{
edgenode *p; /* temporary pointer */
p = malloc(sizeof(edgenode)); /* allocate storage for edgenode */
p->weight = NULL;
p->y = y;
p->next = g->edges[x]; //DOUBT LINE1
g->edges[x] = p; /* insert at head of list */ //DOUBT LINE 2
g->degree[x] ++;
if (directed == FALSE)
insert_edge(g,y,x,TRUE);
else
g->nedges ++;
}
最佳答案
每个顶点都有一组边。我们可以认为该集合是无序的。始终在除法器功能之外,指针g->edges[i]
指向第edgenode
个顶点上入射的第一个i
,否则指向NULL
。然后,next
中的edgenode
链接可传递地指向集合中的其他边。
因此,要添加一条边,首先创建一个新边,然后将其next
指针分配给当前的“第一个”节点(DOUBT LINE 1),然后将g->edges[i]
指针分配给新创建的值(DOUBT LINE 2)。
请注意,尽管节点的顺序已更改,但我上面说的需要满足的条件仍然都得到满足-“以前”的位置现在是第二,而新节点是第一。可以,因为我们只存储一个集合-顺序无关紧要。
之前(=>遍历“下一个”链接):
// edges[i] == <previous> => <other stuff>...
后:
// * * These asterisks are above what we set...
//edges[i] == <new node> => <previous> => <other stuff>