Escolar Documentos
Profissional Documentos
Cultura Documentos
Continuando a navegar neste site, você concorda com esse uso. Saiba mais
Acesso rápido
namespace ConsoleApplication1
{
class Program
{
Vertice* inicio = null; //cria um ponteiro que apontará para o endereço do registro que estiver no
início da lista
while (op != 5)
{
op = menu(); //chama função para mostrar menu e solicitar opção do usuário
switch (op)
{
case 1: //conectar
Console.Clear();
Console.Write("Digite o nome do País 1:");
v1 = Console.ReadLine();
Console.Write("Digite o nome do País 2:");
v2 = Console.ReadLine();
Console.Clear();
conecta(&inicio, v1, v2,dta,hora,resultados);
break;
case 2: //desconectar
Console.Clear();
Console.Write("Digite o nome do País 1:");
v1 = Console.ReadLine();
Console.Write("Digite o nome do País 2:");
v2 = Console.ReadLine();
Console.Clear();
desconecta(&inicio, v1, v2);
break;
case 3: //imprimir
Console.Clear();
imprimir(&inicio,resultados);
break;
case 4: //mostrar partidas
partidas(resultados);
break;
}
}
}
}
}
auxV = auxV->proxV;
Console.Write("------------------------------------------------\n");
}
}
else
Console.WriteLine("Grafo Vazio");
}
private static unsafe void desconecta(Vertice** inicio, string v1, string v2)
{
Vertice* auxV;
Adjacente* auxA;
Adjacente* antA;
private static unsafe void conecta(Vertice** inicio, string v1, string v2, string dta, string hora, string[,]
resultados)
{
Vertice* auxV; //ponteiro auxiliar para percorrer a lista de Vértices
Vertice* novoV; //ponteiro com endereço do novo vértice a ser incluído na lista de vértices
; //p ç
Vertice* antV = null; //ponteiro para guardar o endereço do vértice anterior(recem visitado) da lista
de vértices
Adjacente* auxA; //ponteiro auxiliar para percorrer a lista de Adjacentes
Adjacente* novoA; //ponteiro com endereço do novo vértice a ser incluído na lista de Adjacentes
Adjacente* antA = null; //ponteiro para guardar endereço do vértice anterior(recentemente visitado)
da lista de Adjacentes
Adjacente* novoA2;
string end_Ad1 = null, end_Ad2 = null, nome1 = null, nome2 = null;
if (*inicio == null)
{ //Testa se lista de vértices está vazia
*inicio = alocaVertice(v1); //cria um registro do tipo vértice e atribui o endereço do registro criado
para inicio
novoV = alocaVertice(v2); //cria um registro do tipo vértice e atribui o endereço do registro criado
para novoV
(*inicio)->proxV = novoV; //conecta o novo registro v1 com v2 na lista de vértices
novoA = alocaAdjacente(v2); //cria um registro do tipo adjacente e atribui o endereço do nodo
criado para novoA
(*inicio)->proxA = novoA; //conecta o nodo adjacente v2 ao nodo vértice v1
novoA2 = alocaAdjacente(v1);
novoV->proxA = novoA2;
nome1 = new String(novoA->a);
nome2 = new String(novoA2->a);
end_Ad1 = Convert.ToString((int)novoA);
end_Ad2 = Convert.ToString((int)novoA2);
}
else
{ //se a lista de vértices não está vazia
auxV = *inicio; //auxiliar recebe inicio da lista de vértices para pesquisar v1
//pesquisa na lista de vértices até encontrar o vértice v1
if (auxV == null)
{ //se não encontrou v1 na lista de vértices
novoV = alocaVertice(v1); //aloca memória para vértice v1
novoA = alocaAdjacente(v2); //aloca memória para adjacente v2
antV->proxV = novoV; //conecta o vértice criado ao final da lista de vértices
novoV->proxA = novoA; //conecta o vértice adjacente ao vértice v1
end_Ad1 = Convert.ToString((int)novoA);
nome1 = new String(novoA->a);
}
else
{ //se encontrou o vértice v1 na lista de vértices
if (auxV->proxA == null)
{ //verifica se o vértice v1 não possui nenhum adjacente
novoA = alocaAdjacente(v2); //aloca memória para adjacente v2
auxV->proxA = novoA; //conecta o nodo criado ao vértice v1
nome1 = new String(novoA->a);
end_Ad1 = Convert.ToString((int)novoA);
}
else
{ //se o vértice v1 já possui algum adjacente
auxA = auxV->proxA; //auxiliar recebe o endereço do primeiro nodo da lista de adjacentes de
v1
//verifica se v2 já existe na lista de adjacentes de v1
if (auxA == null)
{ //se v2 não aparece na lista de adjacentes de v1
novoA = alocaAdjacente(v2); //aloca memória para adjacente v2
antA->proximo = novoA; //Conecta o nodo adjacente v2 no final da lista de adjacentes de
v1
nome1 = new String(novoA->a);
end_Ad1 = Convert.ToString((int)novoA);
}
else
Console.WriteLine("O País " + v2 + " já encontra-se na lista de aversários do País " + v1);
if (auxV == null)
{ //se não encontrou v2 na lista de vértices
novoV = alocaVertice(v2); //aloca memória para vértice v2
antV->proxV = novoV; //conecta o vértice criado ao final da lista de vértices
novoA = alocaAdjacente(v1);
novoV->proxA = novoA;
nome2 = new String(novoA->a);
end_Ad2 = Convert.ToString((int)novoA);
}
else //se v2 foi encontrado na lista de vértices
{
auxA = auxV->proxA; //auxiliar recebe o endereço do primeiro nodo da lista de adjacentes de v2
//verifica se v1 já existe na lista de adjacentes de v2
if (auxA == null)
{ //se v1 não aparece na lista de adjacentes de v2
novoA = alocaAdjacente(v1); //aloca memória para adjacente v1
antA->proximo = novoA; //Conecta o nodo adjacente v1 no final da lista de adjacentes de v2
nome2 = new String(novoA->a);
end_Ad2 = Convert.ToString((int)novoA);
}
else
Console.WriteLine("O País " + v1 + " já encontra-se na lista de adversários do País " + v2);
}
} //fim do else(se lista de vértices não está vazia)
int pos = -1,cont=0;
if (resultados[0, 0] == null)
pos = 0;
else
{
while (pos == -1 && cont < 99)
{
if (resultados[cont, 0] == null && cont >= 1)
pos = cont;
else
cont = cont + 3;
}
}
resultados[pos, 0] = Convert.ToString(nome2);
resultados[pos, 10] = end_Ad2;
resultados[pos, 1] = dta;
resultados[pos, 2] = hora;
resultados[pos, 3] = "0";
/*função que aloca espaço de memória para um novo registro da lista de adjacentes, armazena o dado
já digitado pelo usuário
e recebido no parâmetro v2, atribui null ao campo proximo e, finalmente, retorna em "novo" o endereço
do novo registro para o procedimento conecta */
private static unsafe Adjacente* alocaAdjacente(string v2)
{
Adjacente* novo; //ponteiro para o endereço do novo registro alocado
novo = (Adjacente*)Marshal.AllocHGlobal(sizeof(Adjacente)); //aloca memória necessária para um
novo registro
*novo->a = Char.Parse(v2); //atribui o vértice adjacente para o campo "a" do novo registro na lista de
adjacentes
novo->proximo = null;
return novo;
}
/*função que aloca espaço de memória para um novo registro da lista de vértices, armazena o dado já
digitado pelo usuário
e recebido no parâmetro v1, atribui null aos campos proxV e proxA do novo registro e, finalmente,
retorna em "novo" o endereço
do novo registro para o procedimento conecta */
private static unsafe Vertice* alocaVertice(string v1)
{
Vertice* novo; //ponteiro para o endereço do novo registro alocado
novo = (Vertice*)Marshal.AllocHGlobal(sizeof(Vertice)); //aloca memória necessária para um novo
registro
*novo->v = Char.Parse(v1); //atribui o vértice origem para o campo "v" do novo registro
novo->proxV = null;
novo->proxA = null;
return novo;
}
}
}
Responder | Citação
Cássio Jaques 0 Pontos
Respostas
Sugiro voce trabalha com Lista generica ao invez de tentar usar ponteiros.
0
Entrar Aqui tem um artigo bem completo de como usar lista genericas encadeadas para gerar graphos em C#
para
Votar
http://www.vcskicks.com/representing-graphs.php
http://theoryofprogramming.com/adjacency-list-implementation-in-c-sharp/
att
Sugerido como Resposta Robson William Silva Moderator terça-feira, 4 de outubro de 2016 14:28
Marcado como Resposta Robson William Silva Moderator quarta-feira, 5 de outubro de 2016 12:15
Responder | Citação William John Adam Trindade Sogi Informatique Ltée 53,707 Pontos
Todas as Respostas
Voce esta tentando converter um codigo em C++ em C#.
Sugiro voce trabalha com Lista generica ao invez de tentar usar ponteiros.
0
Entrar Aqui tem um artigo bem completo de como usar lista genericas encadeadas para gerar graphos em C#
para
Votar
http://www.vcskicks.com/representing-graphs.php
http://theoryofprogramming.com/adjacency-list-implementation-in-c-sharp/
att
Sugerido como Resposta Robson William Silva Moderator terça-feira, 4 de outubro de 2016 14:28
Marcado como Resposta Robson William Silva Moderator quarta-feira, 5 de outubro de 2016 12:15
Responder | Citação William John Adam Trindade Sogi Informatique Ltée 53,707 Pontos
Robson,
Preciso falar com voce. Poderia entrar em contato comigo pelo LinkedIn?
Att
0
Entrar
para William John Adam Trindade
Votar
Analyste-programmeur
----------------------------------------------------------
Responder | Citação William John Adam Trindade Sogi Informatique Ltée 53,707 Pontos
Brasil (Português) Boletim informativo Privacidade & cookies Termos de uso Marcas comerciais © 2019 Microsoft