// 图遍历.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
return 0;
}
#include <iostream>
using namespace std;
#include <vector>
#include <list>
#include <string>#define MAX_VERTEX_NUM 8class CEdge
{
friend class CGraph;
private:
int ivex;
int jvex;
bool ;
public:
//CEdge *info;
CEdge *ilink;
CEdge *jlink;
int GetIvex()const{return ivex;}
int GetJvex()const{return jvex;}
bool GetMark()const{return ;}
void SetIvex(const int i){ivex=i;}
void SetJvex(const int j){jvex=j;}
void SetMark(const bool m){=m;}
CEdge():ivex(0),jvex(0),(0){}
CEdge (const CEdge&ce):ivex(ce.GetIvex()),jvex(ce.GetJvex()),(ce.GetMark()),ilink(ce.ilink),jlink(ce.jlink){}
CEdge (const int i, const int j,const bool m):ivex(i),jvex(j),(m){}
};class CVertex
{
friend class CGraph;
private:
string data;
public:
CVertex *parent;
CVertex *children;
CEdge *firstedge;
string GetData()const{return data;}
void SetData(const string d){data=d;}
CVertex():data("0"){}
CVertex(const CVertex&v):data(v.GetData()),firstedge(v.firstedge){}
CVertex(const string d):data(d){}
};typedef vector<CVertex>VecVertex;
typedef vector<CEdge>VecEdge;class CGraph
{
public:
VecVertex vertexes;
VecEdge edges;
void addAnEdge(int i,int j);
void addAnVertex(string i);
void linkVertexToEdge(CVertex *v,CEdge *e);
void InitEdge(CEdge *e);
//void linkIlinkToEdge(CEdge *e1,CEdge *e2);
//void linkJlinkToEdge(CEdge *e1,CEdge *e2);
void linkAllEdge();
};void CGraph::addAnVertex(string i)
{
CVertex *ver=new CVertex;
ver->SetData(i);
vertexes.push_back(*ver);
}void CGraph::addAnEdge(int i,int j)
{
CEdge *ed=new CEdge;
ed->SetIvex(i);
ed->SetJvex(j);
ed->SetMark(0);
edges.push_back(*ed);
}void CGraph::InitEdge(CEdge *e)
{
e->ilink=new CEdge;
e->ilink=NULL;
e->jlink=new CEdge;
e->jlink=NULL;
}void CGraph::linkVertexToEdge(CVertex *v,CEdge *e)
{
v->firstedge=new CEdge;
v->firstedge=e;
}/*void CGraph::linkIlinkToEdge(CEdge *e1,CEdge *e2)
{
//InitEdge(e1);
//InitEdge(e2);
e1->ilink=e2;
e2->ilink=NULL;
e2->jlink=NULL;
}void CGraph::linkJlinkToEdge(CEdge *e1,CEdge *e2)
{
//InitEdge(e1);
//InitEdge(e2);
e1->jlink=e2;
e2->ilink=NULL;
e2->jlink=NULL;
}*/void CGraph::linkAllEdge()
{
int iorj;
for(unsigned int i=0;i<edges.size();i++)
{
InitEdge(&edges[i]);
}//全部初始化
for(unsigned int i=0;i<vertexes.size();i++)
{
unsigned int j=0;
while(j<edges.size())
{
while(edges[j].GetIvex()!=i||edges[i].GetJvex()!=i)
j++;
if(edges[j].GetIvex()==i)
iorj=0;
else if(edges[j].GetJvex()==i)
iorj=1;
unsigned int k=j;
while((edges[k].GetIvex()!=i||edges[k].GetJvex()!=i)&&k<edges.size())
k++;
if((edges[k].GetIvex()==i||edges[k].GetJvex()==i)&&iorj==0)
{
*edges[j].ilink=edges[k];
j=k;
}
else if((edges[k].GetIvex()==i||edges[k].GetJvex()==i)&&iorj==1)
{
*edges[j].jlink=edges[k];
j=k;
}
}
}
}void main()
{
CGraph g;
g.addAnVertex("A");
g.addAnVertex("B");
g.addAnVertex("C");
g.addAnVertex("D");
g.addAnEdge(0,1);
g.addAnEdge(0,2);
g.addAnEdge(1,3);
g.linkAllEdge();
system("pause");
}错误出现在
for(unsigned int i=0;i<edges.size();i++)
{
    InitEdge(&edges[i]);
}//全部初始化我这里的edges是个vector 它的size现在是3
我让i<edges.size()好把我这个edges中所有的元素按照
void CGraph::InitEdge(CEdge *e)
{
e->ilink=new CEdge;
e->ilink=NULL;
e->jlink=new CEdge;
e->jlink=NULL;
}
这个函数来进行初始化
可是不知道为什么怎么弄都越界把全部初始化的函数写成
edges[0]->ilink=new CEdge; 也会越界
本人新手 希望赐教

解决方案 »

  1.   

    e->ilink=new CEdge;
    e->ilink=NULL;
    e->jlink=new CEdge;
    e->jlink=NULL;
    你这是干嘛
    而且都没有delete
      

  2.   

    1)用到New的地方几乎都是内存泄露.
    typedef vector<CVertex>VecVertex;
    typedef vector<CEdge>VecEdge;
    void CGraph::addAnEdge(int i,int j)
    {
        CEdge *ed=new CEdge;
        ed->SetIvex(i);
        ed->SetJvex(j);
        ed->SetMark(0);
        edges.push_back(*ed);
    }
    这样何必用New呢?这样的做法会导致内存泄露,你把定义:
    typedef vector<CVertex>VecVertex;
    typedef vector<CEdge>VecEdge;
    改为:
    typedef vector<CVertex *>VecVertex;
    typedef vector<CEdge *>VecEdge;2)而且参数是指针类型的直接拿过来用也不进行Checked.
    3)
    void CGraph::addAnEdge(int i,int j)
    {
        CEdge *ed=new CEdge;
        ed->SetIvex(i);
        ed->SetJvex(j);
        ed->SetMark(0);
        edges.push_back(*ed);
    }
    压到edges中的Edge值,int ivex,int ivex值还是默认值,你这里没有提供构造函数,所以你在之前SetIVex,SetJvex,都是没有意义的.4)问题太多,楼主好好在Review下.