2012-06-08 190 views
1

邻接列表上工作的邻接表 - >有向加权图C++指针和结构

一类看起来像这样的,即首部:

class CGraph; 
class CMap { 
public: 
    //voided constructors and destructors 
    //functions one is: 
    void SetDirGraph(string commands); 

private: 
    CGraph* m_myMap; 
}; 

第二类:

class CNode { 
public: 
    //voided constructor and desctructor 
    int m_distance, m_vert; 
    bool m_isKnown; 
}; 

typedef struct edges { 
    int v2, weight; 
} edge; 

class CGraph { 
public: 
    CGraph(int map_size); 
    ~CGraph(void); 

    void AddMap(int v1, int v2, int weight); 
    void AddEndVert(int v2, int weight); 

private: 
    list<edge> List; 
    int size; 

public: 
    CNode* verts; 
}; 

我正在从文件中读取顶点,并且工作正常。我的问题是我在创建基于给定代码的邻接列表时遇到问题。我想首先使用指向列表的指针并且它不能正常工作。我不知道如何创建指向列表的指针而不写入它们。

void CMap::SetDirGraph(string command) { 
    istringstream buffer(command) 
    char ch; 
    int num, vert1, vert2, weight; //specify vertices and weight and number of vertices 

    buffer>>ch; //throw away first character (not needed) 
    buffer>>num // size of vertices 

    while(!buffer.eof()) { // keep reading until end of line 
     buffer>>v1;   // vertex start 
     buffer>>v2;   // vertex end 
     buffer>>weight; 

     m_myMap = new CGraph(map_size); //initialize m_myMap. 
     m_myMap->verts->m_vert = v1; // mymap->verts->vert points to first edge 
     m_myMap->AddMap(v1, v2, weight); // create list? 
     m_myMap->AddEndVert(v2, weight); //create list? push v2 and weight on my list using my list. 
    } 
} 

我试过几种不同的方式和我一直困惑自己,在正确的方向上的任何一点将是真棒。

编辑: 如果需要制作,我还有更多的代码,只是发布主要内容。 我的意思是“不工作”是因为我只是在写上一个顶点。我不知道是否应该使用m_myMap创建一个数组(尝试过,但仍然会写入并获取内存错误)。没有编译器错误。

+0

“不工作” - 请更具描述性。什么不工作,你做了什么调试? –

+0

编辑,真的只是混淆了我如何工作我的指针不覆盖我以前的数据。 –

回答

1

我不知道如何创建指向列表的指针而不写入它们。

除了你的应用程序中,这个问题的答案是new运营商,我以为你是知道的,因为你的示例代码中使用它。像int * a = new int(42);这样的代码为堆上的int分配内存,并且当它不再需要时负责清理它。因此,您可以完全控制变量的可用时间。另一方面,在int x = 42; int * a = &x;中,x将在超出范围时自动清除,而a将成为指向内存块的指针,该块不再有有意义的数据。如果您尝试对其进行取消引用,则会遇到未定义的行为,如果幸运的话,您的程序将会崩溃。

如果您可以使用C++ 11标准或提供智能指针的库,那么您应该尽可能地自己管理指针。智能指针是一个持有分配内存的对象,当它被破坏时会自动释放它。更具体的信息在很大程度上取决于您正在使用哪种智能指针。使用智能指针的原因是你自己做管理是单调而且容易出错的。如果你没有delete你已经分配的指针,你的应用程序将继续分配更多的内存,直到它有一天爆炸(取决于你分配的内存频率和内存量)。这被称为泄漏。如果您不止一次致电delete,您的计划也将被解除。这是在您的应用程序C++ 11 shared_ptr一个例子:

class CMap 
{ 
    private: 
    std::shared_ptr<CGraph> m_myMap; 
    // etc. 
}; 

// in SetDirGraph 
m_myMap.reset(   // if the smart pointer has previously been managing 
         // memory, it will free it before allocating new 
    new CGraph(map_size) // allocate CGraph as before 
); 

除此之外,什么希望回答你的问题,我遇到了几个潜在的问题,关于你的代码:

  • 肯定错误: 在SetDirGraph你设置m_myMap->verts->m_vert = v1m_myMap->verts是一个指针。您刚刚创建了m_myMap,因此verts未初始化,因此指向一个随机内存块。然后您尝试通过m_myMap->verts->m_vert = v1解除引用。这是行不通的。您需要先创建verts,即verts = new CNode;

  • typedef struct edges { /* etc */ } edge;是C构建体,并且没有必要在C++中typedef包装。它的工作,和所有的,但它确实是多余的,许多这些结构的污染只是你工作的命名空间。

  • 你真的需要摆在首位的指针?您提供的摘要不会暗示您为什么需要使用它们。您会希望将指针的使用量降至最低(或至少使用智能指针,参见上文)

+0

谢谢,我正在做一个完整的Dumba **。我试图在错误的地方创建图表。我最终创建了从AddMap和AddEndVert指向我的列表的指针。不过谢谢你的帮忙。一些像typedef这样的东西不是由我写的,而是由其他人写的。但再次感谢! –