Estrutura de armazenamento da lista vinculada com 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

nó de vértice

typedef string InfoType ;
typedef string VertexType;

typedef struct VexNode{
    
    
    VertexType data; //顶点的数据域
    ArcBox *firstIn; //指向该顶点的第一条入弧
    ArcBox *firstOut; //指向该顶点的第一条出弧
}VexNode;

nó de arco

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:
Insira a descrição da imagem aqui
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; //初始化出弧表

Insira a descrição da imagem aqui
2. Crie um nó de borda

 		ArcBox *p1 = new ArcBox;  //生成一个新的边 *p1
        p1->tailVex = i; //弧尾的顶点位置
        p1->headVex = j; //弧头的顶点位置

Insira a descrição da imagem aqui
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 a descrição da imagem aqui
Insira o nó da borda no topo da lista vinculada com o mesmo topo do arco;

		p1->hLink = G.xList[j].firstIn;

Insira a descrição da imagem aqui
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;

Insira a descrição da imagem aqui
4. Continue adicionando nós de borda por ordem de chegada
Insira a descrição da imagem aqui
Insira a descrição da imagem aqui
Insira a descrição da imagem aqui
Insira a descrição da imagem aqui

Acho que você gosta

Origin blog.csdn.net/QQ657205470/article/details/127361701
Recomendado
Clasificación