设为首页 加入收藏

TOP

邻接多重表存储无向图以及有关操作(一)
2014-11-24 03:13:35 来源: 作者: 【 】 浏览:2
Tags:邻接 多重 存储 向图 以及 有关 操作

数据结构是编程里面最重要的一门基础课之一,所以学多少遍都不可以嫌多,算法的知识当然是融在其中,多练习,多思考,基础打好了,其他的东西学起来也就so easy了。

邻接多重表,是对用邻接表存储无向图的一种压缩存储,当然也是链式存储,邻接多重表的相关概念,可以百度、谷歌、或者看有关书籍。大部分书都没有详细介绍这个结构的应用(至少我目前还没看到有书上有写),只是说 这个结构在对无向图的边进行操作的时候会比较方便,确实有一点吧,在插入和删除边的时候,虽然不用想邻接表那样去找两条,但是也是需要进行一些判判断。下面是代码,邻接多重表存储的无向图的一些相关操作:

文件"graph.h"

#include

#include

#include

#include

using namespace std;

bool visited[100]; //顶点是否被访问标志

//邻接多重表的存储

//边结点

struct EBox

{

int mark;//标志域,指示该边是否被访问过(0:没有1:有)

int ivex,jvex;//该边关联的两个顶点的位置

EBox *ilink,*jlink;//分别指向关联这两个顶点的下一条边

};

//顶点结点

struct VexBox

{

string data; //顶点名称

EBox *firstedge;//指向第一条关联该结点的边

};

class AMLGraph

{

private:

VexBox *adjmulist; //顶点数组指针

int vexnum; //定点数目

int arcnum; //边数目

int maxnum; //顶点数最大值

public:

AMLGraph(int num=20)

{

adjmulist=new VexBox[num];

maxnum=num;

}

~AMLGraph()

{

delete[]adjmulist;

}

//定位顶点在顶点数组中的位置

int Locate_Vex(string v)

{

for(int i=0;i

if(adjmulist[i].data == v)

return i;

return -1;

}

void CreateUDG_AML()

{

//邻接多重表,存储无向图

string v1,v2;

int i,j,k;

cout<<"输入定点数目和弧的数目:";

cin>>vexnum>>arcnum;

while(vexnum>maxnum)

{

cout<<"顶点数目太多,请重新输入顶点数和边数:";

cin>>vexnum>>arcnum;

}

cout<<"输入每个顶点的名称:";

for(i=0;i

{

cin>>adjmulist[i].data;

adjmulist[i].firstedge=NULL;

}

for(k=0;k

{

cout<<"输入边的两个顶点:";

cin>>v1>>v2;

while(Search_Arc(v1,v2))

{

cout<<"该边已存在,本图不支持存在平行边"<

cout<<"重新输入边的两个顶点:";

cin>>v1>>v2;

}

i=Locate_Vex(v1);

j=Locate_Vex(v2);

while(i == -1 || j == -1)

{

cout<<"两个顶点中有不符合要求的,请重新输入:";

cin>>v1>>v2;

i=Locate_Vex(v1);

j=Locate_Vex(v2);

}

//采用头插入方式,代码较好写,无向图顺序并不重要,所以没关系

EBox *p=new EBox;

p->ivex=i;

p->jvex=j;

p->ilink=adjmulist[i].firstedge;

p->jlink=adjmulist[j].firstedge;

adjmulist[i].firstedge=adjmulist[j].firstedge=p;

}

cout<<"无向图构造完成"<

}

bool Search_Arc(string v1,string v2)

{

//搜索对应的边是否存在

int i,j;

EBox *p;

i=Locate_Vex(v1);

j=Locate_Vex(v2);

if(i == -1 || j == -1)

{

cout<<"顶点错误,改边不存在"<

return false;

}

p=adjmulist[i].firstedge;

while(p)

{

if(p->ivex == i && p->jvex == j)

return true;

else if(p->jvex == i && p->ivex == j)

return true;

else if(p->ivex == i)

p=p->ilink;

else if(p->jvex == i)

p=p->jlink;

}

return false;

}

void Find_Neighbour(string v)

{

//输出顶点v的邻接顶点

int i=Locate_Vex(v);

if(i == -1)

{

cout<<"该顶点不存在图中"<

return ;

}

EBox *p=adjmulist[i].firstedge;

if(

首页 上一页 1 2 3 4 5 下一页 尾页 1/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇ReportingServicetextbox换行 下一篇App数据层设计及云存储使用指南

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·常用meta整理 | 菜鸟 (2025-12-25 01:21:52)
·SQL HAVING 子句:深 (2025-12-25 01:21:47)
·SQL CREATE INDEX 语 (2025-12-25 01:21:45)
·Shell 传递参数 (2025-12-25 00:50:45)
·Linux echo 命令 - (2025-12-25 00:50:43)