http://blog.csdn.net/doubleselect/article/details/40151877
1.引言:
如果我们在应用中关注的是顶点 ,那么邻接表是很好的选择 ,可是如果是重点关注边 那么 邻接表就麻烦了
若要删除左边的(V0,V2)这条边,需要对图下表的阴影两个结点进行删除操作。
2.邻接多重表的存储结构:
iVex和jVex:是与某条边依附的两个顶点在顶点表中的下标。
iLink:指向依附顶点iVex的下一条边。
jLink:指向依附顶点jVex的下一条边。
3.邻接多重表示意图绘制:
邻接多重表
typedef char Vtype //顶点类型
typedef int Etype //权值类型
#definde MAXV 100;
typedef struct edgeNode // 边 表示边的个数
{
int ivex; //一条边的一端
int jvex; //一条边的另一端
struct edgeNode *ilink; //依赖于顶点ivex的下一条边
struct edgeNode *jlink;//依赖于顶点jvex的下一条边
type weight;//边 权值
}EdgeNode;
typedef struct Vnode //顶点表 节点
{
Vtype data;
EdgeNode* firstEdge; //对应的一个边
}VNODE; //
typedef struct
{
VNODE adjlist[MAXV];
int numV;//当前顶点数
int numE;//当前边数
}GraphAdjList;
void CreateALGraph(GraphAdjList* G)
{
int i,j,k;
EdgeNode* e= NULL;
cout<<输入顶点数";
cin>>G->numV;
cout<<输入边数";
cin>>G->numE;
for(i=0;i<G->numV;i++)//建立顶点信息
{
cin >> G->adjlist[i].data; //输入顶点信息
G->adjlist[i].firstEdge = NULL; //边表节点 为空
}
for(k=0;k<G->numE;k++)//建立边信息
{
cout<<"输入边的开始";
cin>>i;
cout<<"输入边的结尾";
cin>>j;
//注意每次插入新节点都是在链表的表头进行 有点绕
e = new EdgeNode; //(1,3) 这个线的插入是相互的对于两个点1,3来说 分别不同的因此有两个new
e->ivex = i;
e->ilink = G->adjlist[i].firstEdge;//以前是e->next = j...的。现在是当前的
G->adjlist[i].firstEdge = e;
e->jvex = j;
e->jlink = G->adjlist[j].firstEdge;
G->adjlist[j].firstEdge = e;
}
}