Algoritmia - Problema con grafos

 
Vista:

Problema con grafos

Publicado por Patricia (1 intervención) el 29/11/2008 17:16:34
Hola a Todos
Esta es una lista ligada en c++ que la quiero utilizar para crear rutas de vertices

#include<iostream.h>
int op,pos,dato;
int menu()
{
int opc;
cout<<" MENU"<<endl;
cout<<"1.Insertar datos"<<endl;
//cout<<"2.Eliminar datos"<<endl;
cout<<"2.Mostrar datos"<<endl;
cout<<"3.Salir"<<endl;
cout<<"elija una opcion"<<endl;
cin>>opc;
return opc;
}

class nodo
{

int elemento;
nodo *siguiente;
public:
nodo(int E, nodo *S)//costructor que llena los campos del nodo
{
elemento=E;
siguiente=S;
}
nodo(nodo *S=NULL)// constructor 2 que llena el campo siguiente del nodod CABEZA
{
siguiente=S;
}

int obt_elem()
{
return elemento;
}

nodo *obt_sig()
{
return siguiente;
}
void llenar_sig(nodo* s)
{
siguiente=s;
}
};

class lista
{
nodo *cabeza;
nodo *actual;
nodo *ultimo;

int cont;// contador
public:

//antes del public no se hace operaciones, ni asignaciones
lista();//costructor debe llevar el mismo nombre de la clase, puede resivir argumentos
//COSTRUCTOR DE LISTA VACIA
void insertar(int dato);
void colocarEnPosicion(int pos);//mover el actual, que este en la posicion correcta
void imprimir();
int contador();

};

lista :: lista()//se crea el primer nodo 'CUERPO DE CONSTRUCTOR'
{
cabeza=actual=new nodo;//llama al constructor 2, crea la cabeza
cont=0;
}
void lista ::insertar(int dato)
{

//nodo *aux;
//aux=obt_sig();
actual->llenar_sig(new nodo(dato,actual->obt_sig()));
cont ++;
}
int lista ::contador()
{
return cont;
}
void lista ::colocarEnPosicion(int pos)//ubicacion del actual
{
actual=cabeza;
for(int i=1;i<pos;i++)//asumir que pos es una posicon valida
{
actual=actual->obt_sig();//avance del actual
}


}

void lista ::imprimir()
{
actual=cabeza;
for(int i=0;i<cont;i++)//mostrando lista
{
//cout<<actual->elemento<<" ";
actual=actual->obt_sig();
cout<<actual->obt_elem()<<" ";
}
cout<<endl;
}

void main()
{

lista L1;//se crea el objeto L1 que es de la claselista, en este momento se llama al constructor lista();

do
{
//imprimir el menu
op=menu();
switch(op)
{
case 1:

cout<<"ingrese un dato"<<endl;
cin>>dato;

do
{
cout<<"ingrese una posicion"<<endl;
cin>>pos;

//cout<< L1.contador;
}while(pos>L1.contador()+1);

L1.colocarEnPosicion(pos);

L1.insertar(dato );
break;
case 2:

L1.imprimir();
break;
case 3:
cout<<"gracias"<<endl;
break;
default:
cout<<"Error"<<endl;

}

}while(op!=3);
}

esta es la forma en q hice una lista pero por ahi averigue q necesito un vector con punteros q enlazan a vertices y no entiendo como pueda llenar un vector con punteros en esta lista, otra duda si es q realizo una busqueda y la lista se expresa de esta forma .
1-->3,nombre,peso-->5,nombre,peso
2-->1,nombre,peso-->3,nombre,peso
3-->4,nombre,peso-->1,nombre,peso
1 lista solo buscaria una trayectoria de vertices (1-->3-->5) ,
tendria q crear varias listas para las demas trayectorias y creo q no se puede hacer eso.

estoy reconfundida ayudenme pliz muchachos.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Alejandro

Creación de rutas de vértices con listas ligadas en C++

Publicado por Alejandro (307 intervenciones) el 12/03/2024 23:01:17
Para representar rutas de vértices utilizando listas ligadas en C++, necesitarás modificar tu implementación actual para que cada nodo de la lista contenga la información necesaria para representar un vértice y sus conexiones. Además, podrías utilizar un vector de punteros para almacenar los vértices y sus respectivas listas de adyacencia.

Aquí te muestro una forma de modificar tu código para que puedas representar y manipular rutas de vértices:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#include <iostream>
#include <vector>
#include <string>
using namespace std;
 
class NodoVertice {
private:
    int id;
    string nombre;
    int peso;
public:
    NodoVertice(int _id, string _nombre, int _peso) : id(_id), nombre(_nombre), peso(_peso) {}
 
    int obtenerId() const {
        return id;
    }
 
    string obtenerNombre() const {
        return nombre;
    }
 
    int obtenerPeso() const {
        return peso;
    }
};
 
class NodoLista {
private:
    NodoVertice* vertice;
    NodoLista* siguiente;
public:
    NodoLista(NodoVertice* _vertice, NodoLista* _siguiente) : vertice(_vertice), siguiente(_siguiente) {}
 
    NodoVertice* obtenerVertice() const {
        return vertice;
    }
 
    NodoLista* obtenerSiguiente() const {
        return siguiente;
    }
 
    void asignarSiguiente(NodoLista* _siguiente) {
        siguiente = _siguiente;
    }
};
 
class ListaAdyacencia {
private:
    NodoLista* cabeza;
public:
    ListaAdyacencia() : cabeza(nullptr) {}
 
    void insertarVertice(NodoVertice* vertice) {
        NodoLista* nuevoNodo = new NodoLista(vertice, nullptr);
        if (!cabeza) {
            cabeza = nuevoNodo;
        } else {
            NodoLista* temp = cabeza;
            while (temp->obtenerSiguiente()) {
                temp = temp->obtenerSiguiente();
            }
            temp->asignarSiguiente(nuevoNodo);
        }
    }
 
    void mostrarLista() {
        NodoLista* temp = cabeza;
        while (temp) {
            cout << temp->obtenerVertice()->obtenerId() << " --> ";
            cout << temp->obtenerVertice()->obtenerNombre() << ", ";
            cout << temp->obtenerVertice()->obtenerPeso() << " ";
            temp = temp->obtenerSiguiente();
            if (temp) {
                cout << "--> ";
            }
        }
        cout << endl;
    }
};
 
int main() {
    vector<NodoVertice*> vertices;
 
    // Crear algunos vértices
    vertices.push_back(new NodoVertice(1, "A", 0));
    vertices.push_back(new NodoVertice(2, "B", 0));
    vertices.push_back(new NodoVertice(3, "C", 0));
 
    // Crear una lista de adyacencia para cada vértice
    ListaAdyacencia lista1;
    lista1.insertarVertice(vertices[1]);
    lista1.insertarVertice(vertices[2]);
 
    ListaAdyacencia lista2;
    lista2.insertarVertice(vertices[0]);
    lista2.insertarVertice(vertices[2]);
 
    ListaAdyacencia lista3;
    lista3.insertarVertice(vertices[0]);
    lista3.insertarVertice(vertices[1]);
 
    // Mostrar las listas de adyacencia
    cout << "Lista de adyacencia para el vértice 1: ";
    lista1.mostrarLista();
    cout << "Lista de adyacencia para el vértice 2: ";
    lista2.mostrarLista();
    cout << "Lista de adyacencia para el vértice 3: ";
    lista3.mostrarLista();
 
    // Liberar memoria
    for (auto vertice : vertices) {
        delete vertice;
    }
 
    return 0;
}

En este código, he creado clases separadas para representar los nodos de los vértices y los nodos de las listas de adyacencia. Además, he utilizado un vector para almacenar punteros a los vértices y luego he creado una lista de adyacencia para cada vértice.

Puedes adaptar esta estructura para representar y manipular las rutas de vértices según tus necesidades. ¡Espero que esto te ayude a aclarar tus dudas y avanzar en tu proyecto, Patricia!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar