目录
一. 前言
二. 用邻接表创建无向网的完整源代码
一. 前言
无向图邻接表的形式如下所示:
其中类如v1的结点为头结点,头结点后面的结点为边结点,表示与头结点中顶点相连的边的信息。
采用邻接表创建无向网的算法思路:
1)首先输入总的顶点数和总边数
2)接着建立顶点表:依次输入顶点的信息存入到顶点表当中,并使每个表头结点的指针域初始化为NULL。
3)创建邻接表:依次输入每条边两边的顶点,然后确定两个顶点的序号n和m,建立边结点,将这个边结点分别插入到V(n)和V(m)对应的两个边链表的头部。
二. 用邻接表创建无向网的完整源代码
#include<stdio.h>
#include<iostream>
using namespace std;
//首先定义好边结点,因为会在头结点中使用到
typedef struct arcnode{
int adjvex; //用来存放与头结点相连顶点的序号
struct arcnode* nextvex; //用来指向下一个与头结点相连边结点的指针
int info; //如果有权值,就设置这一项,这就是无向网和无向图的区别
}arcnode;
//定义头结点
typedef struct{
char data; //存放顶点
arcnode* firstarc; //指针指向第一个边结点
}vexnode,VL[100]; //用VL这个数组来存放所有的头结点
//定义一个邻接表
typedef struct ALGraph{
VL vexs; //存放所有顶点信息的VL类型数组
int vexnum,arcnum; //总的顶点数和边数
}
//函数声明,后面会用到
int LocateALGraph(ALGraph G,char c);
void CreateALGraph(ALGraph &G){
//首先输入总的顶点数和边数
cin>>G.vexnum>>G.arcnum;
//接着继续输入顶点信息
for(int i=0;i<G.vexnum;i++){
cin>>G.vexs[i].data;
G.vexs[i].firstarc=NULL;
}
//开始输入边信息
for(int j=0;j<G.arcnum;j++){
char v1,v2;
cin>>v1>>v2;
int n=LocateALGraph(G,v1); //用两个变量来接收这两个顶点所在的序号位置
int m=LocateALGraph(G,v2);
arcnode* p1=new arcnode; //创建边结点
p1->adjvex=m; //使用头插法将边结点放到头结点的后面
p1->nextvex=G.vexs[n].firstarc;
G.vexs[n].firstarc=p1;
//因为是无向网,则需要对称存放,若是有向图或者有向网则不需要
arcnode* p2=new arcnode;
p2->adjvex=n;
p2->nextvex=G.vexs[m].firstarc;
G.vexs[m].firstarc=p2;
}
//求G顶点表中顶点为c的顶点序号
int LocateALGraph(ALGraph G,char c){
for(int i=0;i<G.vexnum;i++){
if(G.vexs[i].data==c)
return i;
}
return -1;
}
//可调用上面函数创建无向网的邻接表,对它进行相关操作
int main(){
}