图的存储

来源:互联网 发布:淘宝开店要自己进货吗 编辑:程序博客网 时间:2024/04/28 19:21

 1--------邻接表(最简单的)

#include <iostream.h>
//此程序建立了无向网的邻接矩阵,

const int MAX_VERTEX_NUM = 10;   //最大顶点个数
const int INFINITY = 1000;       //用该值代表无穷远
 
struct MGraph
{
 char vexs[MAX_VERTEX_NUM];   //代表顶点向量
 int arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM];   //代表邻接矩阵
 int vexnum;//顶点个数
 int arcnum;//弧的个数
};

int LocateVex(MGraph G, char v)//查找字符为v的顶点的位置
{
 int locate;
 for (int i = 0; i < G.vexnum; i++)
  if (G.vexs[i] == v)
   locate = i;
 return locate;
}
                                                 

void CreateUDN (MGraph & G)
{
 int i;
 int j;
 int k;
 char v1;//输入权值时的邻接顶点
 char v2;
 int w;//权值

 cout << "请输入网的顶点个数和边的个数:" << endl;
 cin >> G.vexnum >> G.arcnum;
 cout << "请输入各顶点的数据:" << endl;
 for (i = 0; i < G.vexnum; i++)
  cin >> G.vexs[i];
 for(i = 0; i < G.vexnum; i++)
  for (j = 0; j < G.vexnum; j++)
   G.arcs[i][j] = INFINITY;

 cout << "请输入各边的两个顶点和权值:" << endl;
 for (k = 0; k < G.arcnum; k++)
 {
  cin >> v1 >> v2 >> w;
  i = LocateVex(G, v1);
  j = LocateVex(G, v2);
  G.arcs[i][j] = w;
  G.arcs[j][i] = w;
 }
}

void main ()
{
 MGraph G;
 CreateUDN (G);
 for (int i = 0; i < G.vexnum; i ++)
 {
  for (int j = 0; j < G.vexnum; j++)
  {
   if (G.arcs[i][j] != 1000)
    cout << G.arcs[i][j] << " ";
   else   //无穷远则打印#号
    cout << "# ";
  }
  cout << endl;
 }   
}


 

2------------邻接表

#include <iostream.h>
//有向网的邻接表

const int MAX_VERTEX_NUM = 10;

struct ArcNode
{
 int adjvex; //邻接顶点
 ArcNode * nextArc;
};

struct VNode
{
 char data;
 ArcNode * firstArc;
};

struct ALGraph
{
 VNode vexs[MAX_VERTEX_NUM];
 int vexnum;
 int arcnum;
};

int LocateVex (ALGraph G, char v)
{
 int i;
 for (i = 0; i < G.vexnum; i++)
  if (G.vexs[i].data == v)
   return i;
 return -1;
}

void Create (ALGraph & G)
{
 int i;
 int j;
 int k;
 char v1;
 char v2;
 ArcNode * p;

 cout << "请输入顶点的个数:" << endl;
 cin >> G.vexnum;
 cout << "请输入弧的个数:" << endl;
 cin >> G.arcnum;

 
 cout << "请输入各顶点的数据:" << endl;
 for (i = 0; i < G.vexnum; i++)
 {
  cout << "第" << i+1 << "个顶点:";
  cin >> G.vexs[i].data;
  G.vexs[i].firstArc = NULL;
 }

 cout << "请输入各边的两个顶点:" << endl;//输入了各边的顶点,通过邻接表存储
 for (k = 0; k < G.arcnum; k++)
 {
  cout << "弧尾点:";
  cin >> v1;
  cout << "弧头点:";
  cin >> v2;
 
  i = LocateVex (G, v1);
  j = LocateVex (G, v2);
  if (i != -1 && j != -1)
  {
   p = new ArcNode;
   p->adjvex = j;
   p->nextArc = G.vexs[i].firstArc;
   G.vexs[i].firstArc = p;   
  }  
 }
}

void OutPut (ALGraph G)
{
 ArcNode * p;
 int i;

 for (i = 0; i < G.vexnum; i++)
 {
  cout << G.vexs[i].data << " ";
  p = G.vexs[i].firstArc;
  while (p != NULL) //错误原因:写成了while(!p)
  {
   cout << p->adjvex << " ";
   p = p->nextArc;
  }
  cout << endl;
 }
}

void main ()
{
 ALGraph G; 
 Create (G);
 OutPut (G);
}


3------------十字链表

#include <iostream.h>

const int MAX_VERTEX_NUM = 10;

struct ArcBox
{
 int tailvex;    //弧尾顶点
 int headvex;    //弧头顶点
 ArcBox * hlink; //弧头相同的弧
 ArcBox * tlink; //弧尾相同的弧
};

struct VexNode
{
 char data;        //顶点数据
 ArcBox * firstin; //指向该顶点的第一条入弧
 ArcBox * firstout;//指向该顶点的第一条出弧
};
   
struct OLGraph
{
 VexNode xlist[MAX_VERTEX_NUM];//表头向量
 int vexnum;                   //顶点个数
 int arcnum;                   //弧的个数
};

int LocateVex (OLGraph G, char v)
{
 int i;

 for (i = 0; i < G.vexnum; i++)
  if (G.xlist[i].data == v)
   return i;
 return -1;
}

void CreateDG (OLGraph & G)
{
 int i;
 int j;
 int k;
 char v1;
 char v2;
 ArcBox * p;

 cout << "请输入顶点的个数:";
 cin >> G.vexnum;
 cout << "请输入弧的个数:";
 cin >> G.arcnum;

 cout << "请输入各顶点数据:" << endl;
 for (i = 0; i < G.vexnum; i++)
 {
  cout << "第" << i+1 << "个顶点的数据:";
  cin >> G.xlist[i].data;
  G.xlist[i].firstin = NULL;
  G.xlist[i].firstout = NULL;
 }
 
 cout << "请输入各弧的两个顶点:" << endl;
 for (k = 0; k < G.arcnum; k++)
 {
  cout << "弧尾点:";
  cin >> v1;
  cout << "弧头点:";
  cin >> v2;
  if (i != -1 && j != -1)
  {
   i = LocateVex(G, v1);
   j = LocateVex(G, v2);
  }

  p = new ArcBox;//对弧结点赋值
  p->tailvex = i;
  p->headvex = j;
  p->hlink = G.xlist[j].firstin;
  p->tlink = G.xlist[i].firstout;

  G.xlist[j].firstin = p;//每确立一条弧都将其设为firstin和firstout形成链接
  G.xlist[i].firstout = p;
 }
}

void OutPut(OLGraph G)
{
 int i;
 ArcBox *p,*q;

 cout<<"十字链表:"<<endl;
 for(i=0;i<G.vexnum;i++)
 {
    cout<<"D="<<G.xlist[i].data;
    p=G.xlist[i].firstin;
    q=G.xlist[i].firstout;

    while(p!=0)//打印弧头结点相同的弧结点
    {
   cout<<"-->"<<p->headvex<<','<<p->tailvex;
   p=p->hlink;
    }
    cout<<endl;

    while(q!=0)//打印弧尾结点相同的弧结点
    {
  cout<<"-->"<<q->headvex<<','<<q->tailvex;
  q=q->tlink;
    }
    cout<<endl;
 }
}


void main ()
{
 OLGraph G;
 CreateDG (G);
 OutPut(G); 
}

目前就学这三种吧!

原创粉丝点击