1

我无法以正确的顺序创建相邻列表。我认为 CreateAdjList(void) 方法存在一些问题。我没有主意了。请给我一些提示。基本上我有图并在连接的边上创建邻接列表。

#include <stdio.h>
#include <stdlib.h>
#define maxV 100                               
typedef struct graphnode{                        
    int vertex;
    struct graphnode *next;
}Node;
Node **node;                             
Node **nodeT; 

FILE *fp;

void initial(int nv);                            
void AdjList(void);                              
void PrintAdjList(int nv);                           


int main()
{
    int nv;

    fp= fopen("input.txt","r");
    fscanf(fp,"%d",&nv);
    initial(nv);
    CreateAdjList();
    PrintAdjList(nv);

    return 0;
}



void initial(int nv)
{
    int i;
    node = new Node *[maxV];

    for(i=1;i<=nv;i++){
        node[i] = (Node *)malloc(sizeof(Node));
        node[i]->next=NULL;


    }

}


//CREATE ADJACENCY  LIST - 
void CreateAdjList(void)
{
    int v1,v2;
    Node *ptr;

while(fscanf(fp,"%d%d",&v1,&v2)!=EOF){

        ptr = (Node *)malloc(sizeof(Node));
        ptr->vertex = v2;
        ptr->next = node[v1]->next;    //Problem could be here
        node[v1]->next = ptr;

    }

    fclose(fp);
}




//PRINT LIST
void PrintAdjList(int nv)
{
    int i;
    Node *ptr;

    for(i=1; i<=nv; i++){
        ptr = node[i]->next;
        printf("    node[%2d]  ",i);
        while(ptr != NULL){
            printf("  -->%2d", ptr->vertex);
            ptr=ptr->next;
        }
        printf("\n");
    }
    printf("\n");

}

实际程序输出 - 错误顺序。我以尊敬的方式附加了输出列表。

输入:

8
1 2
2 3
2 5
2 6
3 4
3 7
4 3
4 8
5 1
5 6
6 7
7 6
7 8
8 8
0 0

Expected Output:
Adjacency list represenation:
1: 2 
2: 3 5 6 
3: 4 7 
4: 3 8 
5: 1 6 
6: 7 
7: 6 8 
8: 8

我的实际输出显示顺序错误。如果您查看节点,正确的顺序应该是 2 ->3->6->5

 node[ 1]    --> 2
 node[ 2]    --> 6  --> 5  --> 3
 node[ 3]    --> 7  --> 4
 node[ 4]    --> 8  --> 3
 node[ 5]    --> 6  --> 1
 node[ 6]    --> 7
 node[ 7]    --> 8  --> 6
 node[ 8]    --> 8
4

2 回答 2

2

对此有所了解,因为我已经有一段时间没有完成 C :)

您所追求的更多的是以下内容 - 请注意,有几个错误我看不出它是如何工作的。使用文件末尾的“0 0”,以及您在循环中使用 1->nv 的事实,永远不会有 node[0] 元素,因此总是会失败。

在我的示例中,我保持数组稀疏(仅分配实际存在的节点),同时满足其他条件。我也不关心它们以什么顺序出现,因此输入文件可能是无序的。另请注意,如果文件数据具有稀疏数据(即第一个数字是 10,并且缺少诸如“9 x”之类的内容),则可能需要更新打印方法。

void initial(int nv)
{
    node = (Node **)malloc(maxV * sizeof(Node *));
}

//CREATE ADJACENCY  LIST - 
void CreateAdjList(void)
{
    int v1,v2;
    Node *ptr;

    while(fscanf(fp,"%d %d",&v1,&v2)!=EOF){

        ptr = (Node *)malloc(sizeof(Node));
        ptr->vertex = v2;

        if (node[v1]==NULL) {
            node[v1] = (Node *)malloc(sizeof(Node));
            node[v1]->vertex = v1;
            node[v1]->next = NULL;
        }

        Node *next = node[v1];
        while (next->next!=NULL)
            next = next->next;

        next->next = ptr;

        //ptr->next = &(*(node[v1])->next);    //Problem could be here
        //node[v1]->next = ptr;
    }

    fclose(fp);
}
于 2011-12-02T10:22:39.683 回答
0

邻接表可以非常有效地表示一个图。它维护了一个列表的顶点索引数组来表示图的边和顶点,如下图所示: 邻接表

ArrayList 数组

ArrayList的数组可以用来实现Graph的Adjacency List。下面是描述 ArrayList 的 Array 用法的程序。

package com.vaibhav.graph;

import java.util.ArrayList;

public class Graph {
    private final int V;
    private ArrayList<Integer>[] adj;

    public Graph(int V) {
        this.V = V;
        adj = new  ArrayList[V];
        for(int i=0; i < V; i++) {
            adj[i] = new ArrayList<Integer>();
        }
    }
}

它已经在这里得到了很好的解释:点击这里

于 2018-10-11T06:56:08.657 回答