我正在阅读有关Algorithms的书,其中包含以下代码。我在这里很难理解一些内容。

我在以下代码中将my doubt lines显示为DOUBT LINE 1DOUBT LINE 2
我还注释了REFERENCE这行,我在其中理解having difficulty
请详细说明DOUBT LINE 1DOUBT 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>

10-04 13:08