【数据结构】十字链表和邻接多重表的构造图的方法(手动构造非代码)

【十字链表-用于有向图】
【数据结构】十字链表和邻接多重表的构造图的方法(手动构造非代码)
定点表结点:
data:数据内容
firstin:以该顶点为尾的第一个弧结点(A→B)
firstout:以该顶点为头的第一个弧结点(A→B
实际上对于选边没有一个特定的规则,所以firstin/out的结点可能不同

边表结点:
tailvex:尾域,表示弧尾。(一般来讲就是顶点表自己)
headvex:头域,表示弧头。(如A→B,A尾tailvex,B为headvex)
hlink:指向弧头相同的下一条弧
tlink:指向弧尾相同的下一条弧
info:权重

构造模拟:
【数据结构】十字链表和邻接多重表的构造图的方法(手动构造非代码)
首先建立顶点表,主要顺序是按照点→点的方向进行操作,先从A出发
①从图中能看到只有A→D的路径,因此我们会有一个弧结点产生,其中的数据内容是

tailvex=0,headvex=3,hlink=NULL,tlink=NULL

②接在A的firstout中,即【数据结构】十字链表和邻接多重表的构造图的方法(手动构造非代码)
③由于headvex=3,转向顶点表中数组下标尾3的顶点D,并且D的firstin域为空,因此将其firstin指向这个弧结点,即
【数据结构】十字链表和邻接多重表的构造图的方法(手动构造非代码)
以上就是一组弧结点的添加

A→?的点已经全部结束了,接下来从B开始
①B→A和C,这里谁先谁后是任意的,选择B→C,同样有新的弧结点产生,其内容为:

tailvex=1,headvex=0,hlink=NULL,tlink=NULL

②接到B的firstout中
【数据结构】十字链表和邻接多重表的构造图的方法(手动构造非代码)
③再次判断,此时headvex为结点A,并且A的firstin为空,因此将A的firstin也指向这个弧结点,即
【数据结构】十字链表和邻接多重表的构造图的方法(手动构造非代码)
④还有B→C的路径,生成弧结点

tailvex=1,headvex=2,hlink=NULL,tlink=NULL

⑤由于这个弧结点的tailvex和之前那个结点(记作BA结点)的tailvex相同,因此将BA结点的tlink指向该弧结点,即
【数据结构】十字链表和邻接多重表的构造图的方法(手动构造非代码)
⑥由于headvex=2的结点C的firstin为NULL,因此将C结点的firstin指向BC弧结点,即
【数据结构】十字链表和邻接多重表的构造图的方法(手动构造非代码)
B结点结束,接下来开始判断C结点
有C→A和C→D,选择C→A(顺序没有关系)
①生成弧结点AC:

tailvex=2,headvex=0,hlink=NULL,tlink=NULL

②C的firstout指向AC结点
此时判断headvex结点为A结点,此时A结点的firstin不为空,那么就访问A的firstin,再深度访问对应弧结点的hlink,直到某结点的hlink==NULL时,将该结点的hlink指向AC结点。对应图中的就是BA->hlink=CA,此时关系为
【数据结构】十字链表和邻接多重表的构造图的方法(手动构造非代码)
其余结点省略,最后的模样为:
【数据结构】十字链表和邻接多重表的构造图的方法(手动构造非代码)

判断结点A的出度:从定点结点的firstout开始访问,持续访问弧结点的tlink,访问了多少个弧结点也就表示A的出度是多少(不难从表中看出,为1)
判断结点A的入度:从定点节点的firstin开始访问,持续访问弧结点的hlink,访问了多少个弧结点也就表示A的入度是多少(不难从表中看出,为2)

【邻接多重表-用于无向图】
【数据结构】十字链表和邻接多重表的构造图的方法(手动构造非代码)
顶点表:
data:数据信息
firstedge:第一条依附于该顶点的边
边表:(A-B,规定左顶点为A,右顶点为B)
ivex:左顶点在顶点表中的位置
ilink:下一条依附于左顶点的边
jvex:右顶点在顶点表中的位置
jlink:下一条依附于右顶点的边
info:权重等其它信息
mark:是否访问过等其它自己规定的用途

看懂十字链表的构造方法后,多重表就好理解多了:
【数据结构】十字链表和邻接多重表的构造图的方法(手动构造非代码)【数据结构】十字链表和邻接多重表的构造图的方法(手动构造非代码)
首先先生成顶点表结点的数组,然后从A(任意ABCDE)开始
①有A-B,因此生成边表结点

ivex=0,ilink=NULL,jvex=1,jlink=NULL

②发现jvex为1,并且对应的B->firstedge==NULL,因此将B的firstedge指向AB表结点

【数据结构】十字链表和邻接多重表的构造图的方法(手动构造非代码)
接下来AB边已经结束,接下来开始对BC边处理
如果选择ivex为1的话,生成的新结点BC为:

ivex=1,ilink=NULL,jvex=2,jlink=NULL

这样理应是B顶点指向BC边的,但是B已经有所指向了,因此沿着B指向的最后一个边,在B所在的那个边的link(可能是ilink,也可能是jlink),令其指向BC边,然后C点对应的firstedge也指向BC边
【数据结构】十字链表和邻接多重表的构造图的方法(手动构造非代码)

如果选择ivex为2的话,生成的新节点CB为:

ivex=2,ilink=NULL,jvex=1,jlink=NULL

然后进行拼接
【数据结构】十字链表和邻接多重表的构造图的方法(手动构造非代码)
个人见解:这样在代码中根据点每次访问边还需要再次判断这个点是属于这个边的ivex还是jvex中。原本还在想这两者有什么区别但是发现并不能在代码上保持一个简单的一致
最后不多赘述了
【数据结构】十字链表和邻接多重表的构造图的方法(手动构造非代码)