Grafos - Lista de Adjacência

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 ?

[code]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;
}

[/code]

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

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:

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

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

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

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

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!

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

[code]#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);

}
[/code]

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

Falou!

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

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

É 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: