Estrutura de armazenamento de gráfico
Estrutura de armazenamento da lista vinculada com gráfico
Lista Ortogonal é uma estrutura de armazenamento vinculada de um gráfico direcionado. Pode ser vista como uma lista encadeada que combina a lista de adjacências e a lista de adjacências inversa de um grafo direcionado. Em uma lista reticulada, existe um nó correspondente a cada arco do grafo direcionado e um nó correspondente a cada vértice.
A estrutura da lista vinculada
nó de vértice
typedef string InfoType ;
typedef string VertexType;
typedef struct VexNode{
VertexType data; //顶点的数据域
ArcBox *firstIn; //指向该顶点的第一条入弧
ArcBox *firstOut; //指向该顶点的第一条出弧
}VexNode;
nó de arco
typedef struct ArcBox{
int tailVex; //该弧的尾顶点的位置
int headVex; //该弧的头顶点的位置
struct ArcBox * hLink; //弧头相同的弧的链域
static ArcBox * tLink; //弧尾相同的弧的链域
InfoType info; //弧的相关信息
}ArcBox;
Nó de lista vinculada cruzada:
#define MAX_VERTEX_BUM 20
typedef struct {
VexNode xList[MAX_VERTEX_BUM]; //表头向量
int vexNum; //图的顶点个数
int arcNum; //图的边数
}OLGraph;
Lista vinculada de gráfico direcionado
Existem 5 campos no nó do arco: o campo final (tailvex) e o campo principal (headvex), respectivamente, indicam as posições dos dois vértices da cauda do arco e da cabeça do arco no gráfico, e o campo da cadeia hlink aponta para o próximo arco com a mesma cabeça de arco. , enquanto o campo de link tlink aponta para o próximo arco com a mesma cauda de arco, e o campo de informações aponta para as informações relevantes do arco. Arcos com a mesma cabeça de arco estão na mesma lista vinculada e arcos com a mesma cauda de arco também estão na mesma lista vinculada.
Seu nó principal é o nó vértice, que consiste em 3 campos: o campo de dados armazena informações relacionadas ao vértice, como o nome do vértice, etc.; firstIn e firstOut são dois campos de cadeia, que apontam respectivamente para o vértice como o arco. O primeiro nó do arco da cabeça ou da cauda do arco. Como mostrado abaixo:
Se a matriz de adjacência de um gráfico direcionado for considerada uma matriz esparsa, a lista vinculada também pode ser considerada como a estrutura de armazenamento vinculada da matriz de adjacência. Na lista vinculada do gráfico, a lista vinculada onde o nó do arco está localizado não é uma lista vinculada circular. As posições relativas entre os nós são formadas naturalmente e não são necessariamente ordenadas por números de vértices. Os nós de cabeçalho são os vértices. Eles não são vinculados, mas armazenados sequencialmente.
Crie um gráfico direcionado usando o método de lista vinculada
OLGraph CreateOLG() {
OLGraph G;
cout << "输入顶点的总数,边的总数 G(V,E)" << endl;
cin >> G.vexNum >> G.arcNum; //输入总顶点数,总边数
for (int vi = 0; vi < G.vexNum; ++vi) {
cout << "输入顶点" << vi << "的值:" << endl;
cin >> G.xList[vi].data; //输入顶点的值
G.xList[vi].firstIn = NULL; //初始化入弧表
G.xList[vi].firstOut = NULL; //初始化出弧表
}
int i = -1, j = -1;
for (int k = 0; k < G.arcNum; ++k) {
VertexType v1, v2;
cout << "请输入边的值 (vi,vj) " << endl;
cin >> v1 >> v2; //输入一条边依附的两个顶点
i = LocateVex(G, v1); //获得v1 在G.xList[]中的位置
j = LocateVex(G, v2); //获得v2 在G.xList[]中的位置
ArcBox *p1 = new ArcBox; //生成一个新的边 *p1
p1->tailVex = i; //弧尾的顶点位置
p1->headVex = j; //弧头的顶点位置
p1->tLink = G.xList[i].firstOut;
p1->hLink = G.xList[j].firstIn;
G.xList[i].firstOut = p1;
G.xList[j].firstIn = p1;
}
return G;
}
/**
* 若图G中存在顶点u,则返回该顶点在图中的位置;否则返回其它信息;
*/
int LocateVex(OLGraph G, VertexType u) {
int i;
for (i = 0; i < G.vexNum; ++i)
if (u == G.xList[i].data)
return i;
return -1;
}
diagrama de processo
1. Inicialize o gráfico G(V,E);
cin >> G.xList[vi].data; //输入顶点的值
G.xList[vi].firstIn = NULL; //初始化入弧表
G.xList[vi].firstOut = NULL; //初始化出弧表
2. Crie um nó de borda
ArcBox *p1 = new ArcBox; //生成一个新的边 *p1
p1->tailVex = i; //弧尾的顶点位置
p1->headVex = j; //弧头的顶点位置
3. Adicione o nó da borda à lista vinculada,
primeiro insira o nó da borda no topo da lista vinculada com o mesmo arco final;
p1->tLink = G.xList[i].firstOut;
Insira o nó da borda no topo da lista vinculada com o mesmo topo do arco;
p1->hLink = G.xList[j].firstIn;
Finalmente, deixe o primeiro arco de saída no vértice final do arco e o primeiro arco de entrada no ponto superior do arco apontarem para o ponto limite recém-adicionado;
G.xList[i].firstOut = p1;
G.xList[j].firstIn = p1;
4. Continue adicionando nós de borda por ordem de chegada