Introdução a gráficos não direcionados de tabelas adjacentes
Um gráfico não direcionado de uma tabela de adjacência refere -se a um gráfico não direcionado representado por uma tabela de adjacência.
A figura acima G1 contém 7 vértices de "A, B, C, D, E, F, G" e contém 7 bordas de "(a, c), (a, d), (a, f), (b, c), (c, d), (e, g), (f, g)".
A matriz à direita da figura acima é a adjacência de G1 na memória, indicando a intenção. Cada vértice contém uma lista vinculada que registra o "número de sequência dos pontos adjacentes do vértice". Por exemplo, os dados dos nós contidos na lista vinculada contida no segundo vértice (vértice c) são respectivamente "0, 1, 3"; e esses "0, 1, 3" correspondem aos números de sequência de "A, B, D" e "A, B, D" são todos pontos adjacentes de C. É assim que registre as informações da figura.
Descrição do código do gráfico não direcionado da tabela de adjacência
1. Definição básica
classe pública listudg {// O vértice que atribui a tabela correspondente à lista privada da lista vinculada ENODE {int IVEX; // A posição do vértice que a borda aponta para ENode NextEdge; // Pointer para o próximo arc} // o vértice que atribui a tabela na tabela privada vnode {char dados; vértice}; private vNode [] mvexs; // Matriz de vértices ...}(01) Listudg é a estrutura correspondente à tabela de adjacência. MVEXS é uma matriz unidimensional que armazena informações de vértice.
(02) VNODE é a estrutura correspondente aos vértices da tabela adjacente. Os dados são os dados contidos no vértice, e o FirstEdge é o ponteiro do cabeçalho da lista vinculada contida no vértice.
(03) ENODE é a estrutura correspondente aos nós adjacentes à lista vinculada contida nos vértices da tabela. IVEX é o índice do vértice correspondente a esse nó em vex, enquanto o NextEdge aponta para o próximo nó.
2. Crie uma matriz
Aqui estão dois métodos para criar uma matriz. Um usa dados conhecidos e o outro exige que o usuário insira os dados manualmente.
2.1 Crie um gráfico (usando a matriz fornecida)
/ * * Crie um gráfico (usando a matriz fornecida) * * Parâmetro Descrição: * VEXS - Matriz de vértices * Edges - Array de borda */public listudg (char [] vex, char [] [] bordas) {// inicialize "vertex" e "Edge" int VLEN = vex.Length; Vnode [vlen]; for (int i = 0; i <mvexs.length; i ++) {mvexs [i] = new vNode (); mvexs [i] .data = vexs [i]; mvexs [i] .firStEd = null;} // inicialize "edges" para (Int (Int I = 0; Tertex final do char de borda C1 = arestas [i] [0]; char c2 = arestas [i] [1]; // Leia o vértice inicial e o vértice final da borda int p1 = getPosition (arestas [i] [0]); int p2 = getPosition (bordas [i] [1]); Link node1 para "o final da lista vinculada em que P1 está localizado" se (mvexs [p1] .FirStedge == null) mvexs [p1] .FirStedge = node1; caso contrário, linklast (mvexs [p1] .FirStedge, node1); // inicialize node2enode node2 = new eNode (); node2.ivex = p1; // link node2 para "o fim da lista vinculada em que p2 está localizado" se (mvexs [p2] .firStEdDeDED === NULL) caso contrário, linklast (mvexs [p2] .FirStedge, node2);}}A função é criar um gráfico não direcionado de uma tabela de adjacência. De fato, o gráfico não direcionado criado por este método é a Figura G1 acima. O código de chamada é o seguinte:
char [] VEXS = {'A', 'B', 'C', 'D', 'E', 'F', 'G'}; char [] [] Edges = new Char [] [] {{'a', 'C'}, {'A', 'D' {'A', 'F'}, {{{ {'E', 'g'}, {'f', 'g'}}; listudg pg; pg = new listudg (vexs, bordas);2.2 Crie um gráfico (insira você mesmo)
/ * * Crie um gráfico (insira os dados mesmo) */public listUDG () {// Digite "Número da versão" e "Número da borda" System.out.printf ("Entrada Número do vértice:"); int vlen = readInt (); system.out.printf ("input Edge:"); 1))))) {System.out.printf ("Erro de entrada: parâmetros inválidos!/N"); return;} // inicialize "versão" mvexs = new vNode [vlen]; para (int i = 0; i <mvexs.length; i+) {System.out.printf ("versux (mvexs.leng; Vnode (); mvexs [i] .data = readchar (); mvexs [i] .FirStEdge = null;} // Initialize "Edge" // mMatrix = new int [vLen] [vlen]; para (int i = 0; in; i ++) (// leia o ending e o final do verte e do final do e final do, para (int i = 0; i <eLen; i); char c1 = readchar (); char c2 = readchar (); int p1 = getPosition (c1); int p2 = getPosition (c2); // inicialize node1enode node1 = new ENODE (); node1.ivex = p2; // link node para "a extremidade da lista link onde p1 está localizado" mVexs [p1] .FirStedge = node1; caso contrário, linklast (mvexs [p1] .FirStedge, node1); // inicialize node2enode node2 = new eNode (); node2.ivex = p1; // link node2 para "o fim da lista vinculada em que p2 está localizado" se (mvexs [p2] .firStEdDeDED === NULL) caso contrário, linklast (mvexs [p2] .FirStedge, node2);}}Esta função lê a entrada do usuário e converte os dados de entrada no gráfico não direcionado correspondente.
O código -fonte completo do gráfico não direcionado da tabela de adjacência
importar java.io.ioException; importar java.util.scanner; public class Listudg {// O vértice que é adjacente à lista vinculada correspondente à tabela na tabela privada ENODE {int IVEX; // a posição do vértice que os pontos da borda para entrar nela é o ponteiro; {Char data; // Informações de vértice ENODE FIRSTEDED; // Ponteiro para o primeiro arco que é anexado ao vértice}; private vNode [] mvexs; // vértice Array/ * * Crie um gráfico (Dados de entrada por si mesmo) */public listudg () {// Enter "Number (número do número de vertex). readInt (); System.out.printf ("Número da borda de entrada:"); int eLen = readInt (); if (vlen <1 || elen <1 || (elen> (vlen*(vlen - 1))))) {System.out.printf ("Erro de entrada: os parâmetros inválidos"/n "); Vnode [vlen]; para (int i = 0; i <mvexs.length; i ++) {System.out.printf ("Vertex (%d):", i); mvexs [i] = new vNode (); mvexs [i] .data = readchar (); mvexs [i]. int [vlen] [vlen]; para (int i = 0; i <elen; i ++) {// Leia o vértice inicial e final do system.out.priTF ("borda (%d):", i); char c1 = readchar (); char c2 = readchar (); int p1 = getPposition (c1); = new eNode (); node1.ivex = p2; // link node1 para "o final da lista vinculada em que p1 está localizado" se (mvexs [p1] .firstedge == null) mvexs [p1] .FirStedge = node1; caso contrário, linklast (mvexs [p1] .FirStedge, node1); // inicialize node2enode node2 = new eNode (); node2.ivex = p1; // link node2 para "o fim da lista vinculada em que p2 está localizado" se (mvexs [p2] .firStEdDeDED === NULL) else linklast (mvexs [p2] .FirStedge, node2);}}/ * * Crie um gráfico (usando a matriz fornecida) * * parâmetro Descrição: * vex - vértice array * bordas - areia de borda */public listudg (char [] vé = Edges.Length; // Inicialize "vértice" mvexs = new Vnode [VLEN]; para (int i = 0; i <mvexs.length; i ++) {mvexs [i] = new Vnode (); mvexs [i] .Data = = VEXS [i]; mvexs [i]; mvexs [i] .Data =) [i]; mvexs [i]; mVexs [i] .data = (i]; 0; node1 = new eNode (); node1.ivex = p2; // link node1 para "o final da lista vinculada em que p1 está localizado" se (mvexs [p1] .firStedge == null) mvexs [p1] .FirStedge = node1; caso contrário, linklast (mvexs [p1] .FirStedge, node1); // inicialize node2enode node2 = new eNode (); node2.ivex = p1; // link node2 para "o fim da lista vinculada em que p2 está localizado" se (mvexs [p2] .firStEdDeDED === NULL) caso contrário, linkLast (mvexs [p2] .FirStEDED, node2);}}/** Link o nó do nó à última lista*/private void linkLast (lista de eNode, eNode node) {enode p = list; while (p.nextedge! = null) p = P.Nextedge; (int i = 0; i <mvexs.length; i ++) if (mvexs [i] .data == ch) return i; retorna -1;}/** leia um caractere de entrada*/private char readchar () {char ch = '0'; do {try {ch = () () system.in.read (); {E.PrintStackTrace ();}} while (! ((CH> = 'A' && CH <= 'Z') || (CH> = 'A' && CH <= 'Z'))); retorna ch;}/** leia um caractere de entrada*/private int ReadInt () {Scanner Scanner = New.; Gráfico da fila*/public void Print () {System.out.printf ("List Graph:/n"); para (int i = 0; i <mvexs.length; i ++) {System.out.printf ("%d (%c):", i, mvexs [i] .data); enode; while (node! = null) {system.out.printf ("%d (%c)", node.ivex, mvexs [node.ivex] .data); node = node.nextedge;} system.out.printf ("/n");}} estático public void main (string [] 'D', 'e', 'f', 'g'}; char [] [] bordas = new char [] [] {{'a', 'c'}, {'a', 'd'}, {'a', 'f'}, {'b', 'c'}, {'c', 'd'} 'G'}}; listudg pg; // "gráfico" personalizado (fila de matriz de entrada) // pg = new listudg (); // use o "gráfico" existente = new listudg (vexs, arestas);Resumir
O exposto acima é todo o conteúdo deste artigo sobre a implementação do código -fonte completo do idioma Java do gráfico não direcionado da tabela de adjacência. Espero que seja útil para todos. Amigos interessados podem continuar se referindo a este site:
Explicação detalhada do Código de Expressão Matemática de Cálculo Java
Explicação detalhada do código do parâmetro de comprimento variável em java
Solução da linguagem Java para análise de código de números perfeitos
Se houver alguma falha, deixe uma mensagem para apontá -la. Obrigado amigos pelo seu apoio para este site!