基本操作代码如下
#include <iostream>
#include <cstdlib>
using namespace std;
#define MAX_VERTEX_NUM 20
#define ERROR -1
int visited[10000];
typedef struct arcnode//结点的组成域
{
int adjvex;
struct arcnode *nextarc;//指向下一条弧的指针
int *info;//该弧相关信息指针
}arcnode;
typedef struct vnode{//表头结点
int data;//结点名字
arcnode *firsarc;
int value;
}vnode,adjlist[MAX_VERTEX_NUM];
typedef struct{//图
adjlist vertices;
int vexnum, arcnum;//当前顶点数,弧数
int kind;
}algraph;
int LocateVex(algraph &G, int &v1);
void creategraph(algraph &G,int v,int vr)
{
arcnode *p, *q;
int v1, v2;
int i, j, k,n;
G.vexnum = v;
G.arcnum = vr;
cout << "录入各个结点名字:" << endl;
for (i = 0; i < v; i++)//录入顶点名字,值,且将依附该顶点的第一条指针附空
{
cin >> G.vertices[i].data;
G.vertices[i].firsarc = NULL;
}
cout << "输入弧头弧尾,创建边:" << endl;
for (k = 0; k<G.arcnum; k++) //创建边,并连接头结点
{
cin >> v1; //v1为弧尾
cin >> v2; //v2为弧头
i = LocateVex(G, v1); j = LocateVex(G, v2);
if (G.vertices[i].firsarc == NULL) //如果链表为空新建一个表节点,让头节点的指针指向该表节点
{
p = (arcnode *)new arcnode;
G.vertices[i].firsarc = p;
q = G.vertices[i].firsarc;
}
else //链表的插入
{
q = G.vertices[i].firsarc;//获取头结点的表头指针
for (n = 0; n<G.arcnum; n++, q = q->nextarc)//将q指针移动至链表的尾巴处
{
if (!q->nextarc)
break;
}
p = (arcnode *)new arcnode;
q->nextarc = p; //将该边(弧)加入到链表中
q = q->nextarc;
}
q->adjvex = j; //记录弧头的索引
q->nextarc = NULL;
}
cout << "图构建成功!"<<endl;
}
void destory(algraph &G)//销毁该图
{
for (int i = 0; i < G.vexnum; i++)
{
G.vertices[i].firsarc = NULL;
}
}
int LocateVex(algraph &G, int &v1) //查找节点V1在图G的存储节点数组中的索引位置
{
int i;
for (i = 0; i<G.vexnum; i++)
{
if (G.vertices[i].data == v1) //如果数组中有这个节点,返回该节点在数组中的索引
return i;
}
if (i >= G.vexnum)
return ERROR;
else
return 0;
}
int getvex(algraph &G,int v)//得到定点v的值
{
for (int i = 0; i < G.vexnum; i++)
{
if (v == G.vertices[i].data)
return G.vertices[i].value;
}
return ERROR;
}
void putvex(algraph &G,int v)//为定点v录入值
{
cout << "输入结点" << v << "值:" << endl;
for (int i = 0; i < G.vexnum; i++)
{
if (v == G.vertices[i].data)
cin >> G.vertices[i].value;
}
}
int firstadjvex(algraph &G,int v)
{
for (int i = 0; i < G.vexnum;i++)
if (G.vertices[i].data == v)
cout << G.vertices[G.vertices[i].firsarc->adjvex].data << endl;
return 0;
}
int next(algraph &G, int v, int w)
{
arcnode *p=NULL;
for (int i = 0; i < G.vexnum;i++)
if (G.vertices[i].data == v)
p = G.vertices[i].firsarc;
if (G.vertices[p->adjvex].data == w&&p->nextarc != NULL)
cout << G.vertices[p->nextarc->adjvex].data << endl;
else
for (int i = 0; i < G.arcnum; i++){
p = p->nextarc;
if (G.vertices[p->adjvex].data == w&&p->nextarc != NULL)
cout << G.vertices[p->nextarc->adjvex].data << endl;
else if (p->nextarc != NULL)
continue;
else
return ERROR;
}
}
void shuchu(algraph &G)
{
arcnode *p;
for (int i = 0; i < G.vexnum; i++)
{
if (G.vertices[i].data == 0)
continue;
else{
cout << G.vertices[i].data << "->";
p = G.vertices[i].firsarc;
for (int j = 0; j < G.arcnum; j++)
{
if (p != NULL)
{
cout << G.vertices[p->adjvex].data << "->";
p = p->nextarc;
}
else
break;
}
cout <<"^"<< endl;
}
}
}
int main()
{
algraph G;
int v, vr;
int v1,v2;
cout << "输入图的节点数量,边的数量:" << endl;
cin >> v >> vr;
creategraph(G, v, vr);
cout << "输入结点名字,用来给结点赋值:" << endl;
cin >> v1;
putvex(G, v1);
cout << "输入结点名字,用来输出结点值:" << endl;
cin >> v1;
cout << "输出结点" << v1 << "的值:" << endl;
if (getvex(G, v1)<0)
cout << "该顶点未录入值" << endl;
else
cout << getvex(G, v1) << endl;
cout << "输入结点名字,用来输出结点的第一个邻接结点:" << endl;
cin >> v1;
cout << "该结点为:" << endl;
firstadjvex(G, v1);
cout << "" << endl;
cout << "输入结点v1,并输入结点v1的某个邻接结点v2,用来输出v1的邻接结点中v2的下一个结点:" << endl;
cin >> v1 >> v2;
cout << "该结点为:" << endl;
next(G, v1, v2);
cout << "该邻接表输出结果为:" << endl;
shuchu(G);
system("pause");
return 0;
}
本文介绍了一种使用邻接表存储结构实现图的基本操作,包括创建图、销毁图、定位顶点、获取顶点值等,并展示了如何通过邻接表进行遍历。
182

被折叠的 条评论
为什么被折叠?



