下面是用c语言实现的关于图的邻接表表示及其存储代码:
#include<iostream>
using namespace std;
/**
* *用邻接表表示图的存储结构步骤如下:
* 输入 总顶点数和总边数
* 依次输入点的信息存入顶点表中,使每个表头结点的指针域初始化为NULL
* 创建邻接表。依次输入每条边依附的两个顶点,确定这两个顶点的序号i和j之后,将此边结点分别插入vi和vj对应的
* 两个边链表的头部。
**/
#define MVNum 100 //最大顶点数
typedef char VerTexType; //假设顶点的数据类型为字符类型
typedef struct ArcNode //边结点
{
int adjvex; //该边所指向的顶点的位置
struct ArcNode *nextarc; //指向下一条边的指针
int info; //和边相关的信息
}ArcNode;
typedef struct VNode //顶点信息
{
VerTexType data;
ArcNode *firstarc; //指向第一条依附该顶点边的节点
}VNode, AdjList[MVNum]; //AdjList表示邻接表类型
typedef struct ALGraph //邻接表
{
AdjList vertices;
int vexnum, arcnum; //图当前的顶点数和边数
}ALGraph;
int LocateVex(ALGraph G, char v)
{
int index = 0;
for(int i=0;i<G.vexnum;i++)
{
if(G.vertices[i].data == v)
{
index = i;
break;
}
}
return index;
}
void Creat_UDG(ALGraph &G)
{
char v1, v2;
cout<<"请输入顶点数和边数:";
cin>>G.vexnum>>G.arcnum; //输入总顶点数和边数
cout<<"请输入各点:\n";
for(int i=0;i<G.vexnum;i++) //输入各点,构造表头结点
{
cin>>G.vertices[i].data; //输入顶点值
G.vertices[i].firstarc = NULL; //初始化表头结点的指针域为NULL
}
for(int k=0;k<G.arcnum;k++) //输入各边,构造邻接表
{
cout<<"请输入第"<<k+1<<"条边相邻的两个顶点:\n";
cin>>v1>>v2; //输入一条边依附的两个顶点
int i = LocateVex(G, v1);
int j = LocateVex(G, v2);
//将新节点*p1插入顶点vi的边表头部
ArcNode * p1 = (ArcNode *)malloc(sizeof(ArcNode));
p1->adjvex = j;
p1->nextarc = G.vertices[i].firstarc;
G.vertices[i].firstarc = p1;
//将新节点*p2插入顶点vj的边表头部
ArcNode * p2 = (ArcNode *)malloc(sizeof(ArcNode));
p2->adjvex = i;
p2->nextarc = G.vertices[j].firstarc;
G.vertices[j].firstarc = p2;
}
}
void print_UDG(ALGraph G)
{
cout<<"建立的邻接表如下:\n";
for(int i=0;i<G.vexnum;i++)
{
cout<<i<<" "<<G.vertices[i].data<<"->";
ArcNode *p = G.vertices[i].firstarc;
while(p!=NULL)
{
cout<<p->adjvex;
p = p->nextarc;
if(p!=NULL)
{
cout<<"->";
}
else
cout<<"\n";
}
}
}
int main()
{
ALGraph G;
Creat_UDG(G);
print_UDG(G);
return 0;
}
运行结果如下:
有不懂的可以留言,如果这篇文章对你有帮助,请帮忙给个赞!!!!