图的存储
来源:互联网 发布:淘宝开店要自己进货吗 编辑:程序博客网 时间: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);
}
目前就学这三种吧!
- 图的存储结构(存储、遍历)
- 图的存储结构
- 图的存储结构
- 图的存储-邻接矩阵
- 图的存储
- 图的存储结构
- 图的邻接矩阵存储
- 图的存储方式
- 图的存储
- 图的存储结构
- 图的存储
- 图的存储结构
- 图的存储
- 图的存储结构
- 图的存储
- 图的存储结构
- 图的存储
- 图的存储方式
- 老紫竹JAVA提高教程(3)-认识Set集合之LinkedHashSet
- 使用 /proc 文件系统来控制系统
- ARM编程中的ARM Boot 示例
- 用SQL Server 2005构建高性能的数据仓库(一)
- Java中的HashSet, TreeSet, HashMap, TreeMap
- 图的存储
- Tomcat中文编码问题解决方案(简)
- C#学习笔记(八)
- 类的序列化
- server 2005 数据库备份还原
- 用SQL Server 2005构建数据仓库(二)
- 用QT实现的用于显示输入IP的LineEdit控件
- apache2 打開目錄時。。中文字出亂碼!
- Tomcat5.5 配置数据库连接池【MySQL+Tomcat-0.1】