创建邻接列表

时间:2011-12-02 05:41:19

标签: c graph adjacency-list

我有问题以正确的顺序创建相邻列表。我认为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

2 个答案:

答案 0 :(得分:2)

因为我做完C已经有一段时间了,所以有一个问题。)

你所追求的是更接近下面的内容 - 请注意,有几个错误,我看不出它会如何起作用。如果文件末尾的'0 0',以及你在循环中使用1&gt; 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);
}

答案 1 :(得分:0)

邻接表可以非常有效的方式表示图。它维护列表的顶点索引数组,以表示图的边和顶点,如下图所示: Adjacency List

ArrayList的数组

ArrayList数组可用于实现图的邻接表。下面的程序描述了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>();
        }
    }
}

It have been beautifully explained here : Click Here