Grafos - Lista de Adjacência

10 respostas
P

Oi pessoal, tô com o código abaixo para inserir em uma lista de adjacência, mas ñ estou entendendo, será q alguém pode me dar uma ajuda ?

struct no{
int info;
no *prox;
}

void insere_lse (no *&L, int v){
no *aux, *novo;

novo = new (no);
novo -> info = v;
novo -> prox = NULL;
}

O q ñ está claro pra mim , são esses parâmetros e as variáveis, no grafo quem seriam eles ! ?

10 Respostas

C

Essa linguagem que você esta utilizando é c né?!
Aqui é um forum especifico de Java,
massssssss
Entre nesse site (Tutorial de grafos do IME) que tem tudo e mais um pouco sobre algoritmos de grafos em C!

Bons estudos

Abraços! :smiley:

T

Olá,

struct no{ int info; no *prox; }

Em C, struct significa uma estrutura criada por você, como se fosse um “agregado” de variáveis, que neste caso, contém um inteiro (info) e um ponteiro (referência) para o próximo nós (* significa ponteiro, *prox).

void insere_lse (no *&L, int v){
 no *aux, *novo;
 
 novo = new (no);
 novo -> info = v;
 novo -> prox = NULL;
 }

Faz a inserção de um novo nó no fim da lista, setando a referência para o próximo nó como null (pois é o último nó da lista) e setando o campo info com o inteiro v, recebido como parâmetro. Também recebe a lista L (não lembro muito de C, mas acredito que esse *& não seja necessário).

[]´s
Tatiana

P

Calvin, obrigada pela ajuda, mas nessa sala é permitido falar sobre qualquer linguagem.

Assuntos gerais (Off-topic) Discussão geral sobre Java, programação - outras linguagens e tecnologias -, assim como qualquer outro assunto de TI.
:wink:

D

olá povo

Só esclarecendo, na verdade isso é C++.

E outra coisa, o seu insere_lse não está inserindo na sua lista. Observe que você apenas alocou a memória e preencheu os dados, mas vc nem retorna e nem coloca na sua lista esse novo nó.

Se entendi direito, e lista de adjacência é a mesma coisa que penso ser uma lista encadeada, além de alocar e inicializar o novo, vc precisa navegar até o atual último nó, e setar o atributo prox para apontar para o novo nó…

tchau

C

A lista de adjacências de um grafo pode ser implementada utilziando-se um vetor de listas encadeadas.
Cada indice do vetor representa um vértice dentro do grafo. Cada lista encadeada associada a este indice representa os vértices para os quais existe aresta a partir do vértice do indice

Assim:

vetor:

[0] -> 2, 4
[1] -> 5, 3, 2
[2] -> 1
[3] ->
[4] -> 1, 2, 3
[5] -> 3, 4
[6] -> 5

Isso representaria um grafo onde o vértice 0(zero) tem como adjacentes os vértices 2 e 4. O vértice 5 tem como adjacentes os vértices 3 e 4, e assim por diante.
Deu pra entender?!

o esquema que vc postou no seu código representa um meio de adicionar um novo vértice na lista de adjacências de um dado indice…

Espero ter ajudado!

Abraço!

P

Pessoal meu código roda, mas, a tela que aparece é uma loucura, alguém saberia pq? :oops:

#include <stdio.h>
#include <stdlib.h>
#define N 5

typedef struct Lista{
        int valorVertice; //valor de cada vértice da lista
        struct Lista *prox;
        }TLista;
        
void insereLse (TLista *&listaAdj, int novoVertice){
     
     TLista *aux, *novo;
     
     novo = (TLista*) malloc ((int)sizeof(TLista)); /*retorna um ponteiro genérico (void), q pode ser
                                                      ser convertido para qualquer tipo.*/
     novo -> valorVertice = novoVertice;
     novo -> prox = NULL;
     
     if (listaAdj == NULL)
        listaAdj = novo;
        
     else{
          aux = listaAdj;
          while (aux -> prox != NULL)
                aux = aux -> prox;
          aux -> prox = novo;
          }
          free(novo);
}
                
void lerGrafo (char Grafos[30],TLista *listaAdj[N]){
     
     FILE *arq;
     int index, vertice;
     
     arq = fopen ("Grafos.dat","r");
         if (arq == NULL){
            printf ("\nErro ao abrir o arquivo.\n");
            return;
            }
         
         else{
             for ( index = 0; index < N; index++){
                 while (fscanf (arq,"%d",&vertice) != EOF){
                       insereLse(listaAdj[index],vertice);
                       fscanf(arq,"%d",&vertice);
                       }
                 }
             }
         fclose(arq);
           if (fclose(arq)!= 0){
                           printf ("\nErro ao fechar o arquivo.\n");
                           return;
                           }
           else
                           printf ("\nArquivo fechado com sucesso.\n");
}

void imprimeLista (TLista *listaAdj[N]){
     
     int index;
     TLista *aux;
     
     for (index = 0; index < N; index++){
         aux = listaAdj[index];
         printf ("\n-> %d\n\n",index);
         while (aux != NULL){
         printf ("[", aux -> valorVertice, "]");
         aux = aux -> prox;
         }
     }
}

int main()                                    
{
    TLista *listaAdj[N];
    int index; 
    
    for ( index = 0; index < N; index++ )
        listaAdj[index] = NULL; //inicializando a lista
        
        //CHAMADA DAS FUNÇÕES
        lerGrafo("D:/Meus documentos/Paloma/Informática/ListaAdj/Grafos.dat",listaAdj);
        imprimeLista(listaAdj);
        
    system("PAUSE");
    return (0);
}
C

Respondi sua mensagem privada, vc esta passando argumento errado para a funcao lerGrafo

Falou!

P

Eu vi :lol: , mas quando mando rodar a tela que aparece ñ tem nada a ver :cry:

C

pois é, isso que vc ta passando, esse caminho para um arquivo, nao tem NAD haver com o que a sua funcao lerGrafo deve receber!

P

É dessa forma mesmo, minha função tem um parâmetro q é um vetor de caracteres com 30 posições, que é exatamente o caminho do arquivo, eu aumentei o tamanho do vetor para 100, mas continua dando erro :oops:

Criado 10 de setembro de 2006
Ultima resposta 19 de set. de 2006
Respostas 10
Participantes 5