使用Adjacency List实现非直接图C ++

时间:2016-08-01 19:42:28

标签: c++ graph

我尝试编写类图来创建一个图 - 间接和常量 - 具有值的节点(双) 因为我想在每个节点中使用相邻值进行搜索所以我稍后会将节点发送到此搜索功能!

但我的相邻列表有些问题,哪些不正确? 我尝试让每个节点都有值和与它们相邻的节点! 这是我的代码:

class node{
public:
   double id;
   list<node> *adj;
    node(double id1) {
        id=id1;
    }

    node(){} //defult constructure
};

class Graph{
public:
node nodes[34];
Graph();
node findNode(double ct);
void addEdge(node a, node b);
};

   Graph::Graph(){
    int c=16;
    // creat nodes
    for (int i=0;i<=34;i++)
    {
        nodes[i].id=c;
        c++;
    }
    //creat Edges
    //adj to [0]
    addEdge(nodes[0],nodes[33]);
    addEdge(nodes[0],nodes[1]);
    addEdge(nodes[0],nodes[11]);
    addEdge(nodes[0],nodes[4]);
    //adj to [1]
    addEdge(nodes[1],nodes[10]);
    addEdge(nodes[1],nodes[24]);
    addEdge(nodes[1],nodes[11]);

    //adj to [2]
    addEdge(nodes[2],nodes[7]);
    addEdge(nodes[2],nodes[23]);
    addEdge(nodes[2],nodes[11]);
    //adj to [3]
    addEdge(nodes[3],nodes[26]);
    addEdge(nodes[3],nodes[14]);
    addEdge(nodes[3],nodes[23]);
    addEdge(nodes[3],nodes[31]);
    //adj to [4]
    addEdge(nodes[4],nodes[10]);
    addEdge(nodes[4],nodes[18]);
    addEdge(nodes[4],nodes[25]);
    addEdge(nodes[4],nodes[9]);
    addEdge(nodes[4],nodes[26]);
    //adj to [5]
    addEdge(nodes[5],nodes[25]);
    addEdge(nodes[5],nodes[8]);
    addEdge(nodes[5],nodes[27]);
    addEdge(nodes[5],nodes[32]);
    //adj to [6]
    addEdge(nodes[6],nodes[9]);
    addEdge(nodes[6],nodes[14]);
    addEdge(nodes[6],nodes[7]);
    addEdge(nodes[6],nodes[13]);
    //adj to [7]
    addEdge(nodes[7],nodes[18]);
    addEdge(nodes[7],nodes[26]);
    addEdge(nodes[7],nodes[16]);
    //adj to [8]
    addEdge(nodes[8],nodes[26]);
    addEdge(nodes[8],nodes[13]);
    addEdge(nodes[8],nodes[28]);
    addEdge(nodes[8],nodes[12]);
    //adj to [9]
    addEdge(nodes[9],nodes[24]);
    addEdge(nodes[9],nodes[26]);
    //adj to [10]
    addEdge(nodes[10],nodes[18]);
    //adj to [11]
    addEdge(nodes[11],nodes[18]);
    //adj to [12]
    addEdge(nodes[12],nodes[27]);
    addEdge(nodes[12],nodes[20]);
    addEdge(nodes[12],nodes[29]);
    //adj to [13]
    addEdge(nodes[13],nodes[20]);
    addEdge(nodes[13],nodes[14]);
    //adj to [14]
    addEdge(nodes[14],nodes[22]);
    addEdge(nodes[14],nodes[17]);
    //adj to [15]
    addEdge(nodes[15],nodes[31]);
    addEdge(nodes[15],nodes[21]);
    //adj to [16]
    addEdge(nodes[16],nodes[19]);
    //adj to [17]
    addEdge(nodes[17],nodes[20]);
    addEdge(nodes[17],nodes[30]);
    //adj to [18]
    //adj to [19]
    addEdge(nodes[19],nodes[20]);
    addEdge(nodes[19],nodes[21]);
    //adj to [20]
    addEdge(nodes[20],nodes[29]);
    //adj to [21]
    addEdge(nodes[21],nodes[30]);
    //adj to [22]
    addEdge(nodes[22],nodes[31]);
    addEdge(nodes[22],nodes[30]);
    //adj to [23]
    //adj to [24]
    addEdge(nodes[24],nodes[33]);
    //adj to [25]
    addEdge(nodes[25],nodes[33]);
    addEdge(nodes[25],nodes[32]);
    //adj to [26]
    // adj to[27]
    addEdge(nodes[27],nodes[28]);
    //adj to [28]
    addEdge(nodes[28],nodes[29]);
    //adj to [29]-[33]
    }

void Graph::addEdge(node a, node b){a.adj->push_front(b); // Add b to a’s list.

b.adj->push_front(a); // Add a to b’s list.
}

node Graph::findNode(double ct){
        int t=0;
        for(int i=0;i<=34;i++)
        {   
        if( nodes[i].id == ct)// find the node that have the current state 
            t=i;
        }
        return  nodes[t];
}}

2 个答案:

答案 0 :(得分:0)

这是一个明显的错误:

 node nodes[34];
 //...
 for (int i=0;
       i<=34;  // <-- This should be i < 34
       i++)
 {
    nodes[i].id=c;

这是对nodes数组的越界访问。在最后一次迭代中,您将访问nodes[34],这是一个内存覆盖。

你在这里犯了同样的错误:

    for(int i=0;i<=34;i++)
    {   
        if( nodes[i].id == ct)//

答案 1 :(得分:0)

您有几个错误。例如,这里:

list<node> *adj;

我真的认为你是这个意思:

list<node*> adj;

此外,您的第一个实验图应该有2个节点,而不是34个。

更重要的是,当你编写代码时,你应该从小而简单的东西开始,然后构建。如果你写了一些大的东西,它将充满难以诊断的错误。