/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Problema con listas!!!!!!! Ayuda por favor!!!

 
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
brujilla



Registrado: 11 Oct 2005
Mensajes: 14
Ubicación: Palma de Mallorca

MensajePublicado: 31/10/2005 2:50 am
Título: Problema con listas!!!!!!! Ayuda por favor!!!

Buenas a todos!!!!
Antes que nada, gracias a quien mire esto o se interese por ello.
Tengo un problemilla con un prograna que estoy realizando. Trabajo con el Visual Studio.NET en modo consola. Consiste en crear una lista que tenga un nodo con dos campos iguales que apunten unoo al principio de la lista y otro al último. Mi problema está al ejecutar, ya que compila como yo necesito. Por favor, si alguien puede mirarmelo se lo agradecería enormemente. Me da error de evaluación de expresión, dice que la variable está siendo definida mientras se usa. El código al que me refiero es el siguietne:

struct tipus_node
{
char element;
tipus_node *seg;
};
struct tipus_llista
{
tipus_node *primer;
tipus_node *darrer;
} ;

void crear_llista(tipus_llista *L);

void main()
{
tipus_llista *ref_llista;
tipus_node *p;
char x;
x='a';
int opcion=0;
do//Realizamos menú principal hasta que la opción sea Salir
{
clrscr();
gotoxy(20,Cool;
printf("MENU PRINCIPAL\n");
gotoxy(20,10);
printf("1. Crear lista\n");
gotoxy(20,12);
printf("2. Salir\n");
opcion=getch();
switch(opcion)
{
case'1'://Crear la lista
clrscr();
crear_llista(ref_llista);
break;
case'2'://Salida del programa
clrscr();
sleep(1);
break;

}
void crear_llista(tipus_llista *L)
{
L->primer=NULL;
L->darrer=NULL;
}


Ultima edición por brujilla el 02/11/2005 5:53 am; editado 2 veces
Volver arriba
fralex



Registrado: 11 Jul 2005
Mensajes: 112

MensajePublicado: 31/10/2005 7:19 am
Título: re

hola.

Publicaste tu código completo? porque no lo parece, sería bueno que lo hicieras, de todos modos que es lo que hace la función crear lista, lo pregunto por que en realidad no estás creando ningun nodo (no estás alocando memoria).

El error que teda es de linker? osea al intentar correr el programa?

bueno publica el código completo y se un poco ma´s especifico con tu duda quizas así se te pueda ayudar ! Wink
_________________
Que viva el che,el lenguaje c y la banda ancha...
Volver arriba
brujilla



Registrado: 11 Oct 2005
Mensajes: 14
Ubicación: Palma de Mallorca

MensajePublicado: 31/10/2005 7:59 am
Título:

Buenas!! No puse el codigo completo porque pensé que confundiría. Lo que realmente me ocurre es que me da un error de este tipo "Run-Time Check Failure #3 - The variable 'ref_llista' is being used without being defined." refiriéndose a la función crear lista. Ésta función realmente lo que hace es inicializar a NULL las variables para tener el prinicpio y fin de la lista.
El código completo es el siguiente:

// examen8.cpp: define el punto de entrada de la aplicación de consola.
//
#include "stdafx.h"
#include "iostream"
#include "stdio.h"
#include "conio.h"
#include "windows.h"
#include "dos.h"
using namespace std;

void clrscr()//Función limpiar pantalla
{
system ("cls");
}
void gotoxy(int x, int y)//Función para situar gráficamente
{
HANDLE hConsole = GetStdHandle (STD_OUTPUT_HANDLE);
if (INVALID_HANDLE_VALUE !=hConsole)
{
COORD pos= {x,y};
SetConsoleCursorPosition(hConsole, pos);
}
}
void sleep (int ms)//Funcion para parar el programa
{
Sleep(ms*1000);
}
struct tipus_node
{
char element;
tipus_node *seg;
};
struct tipus_llista
{
tipus_node *primer;
tipus_node *darrer;
} ;

void crear_llista(tipus_llista *L);
void insereix(tipus_llista *&L, char x, tipus_node *&p);
void suprimeix(tipus_llista *&L, tipus_node *&p);

void main()
{
tipus_llista *ref_llista;
tipus_node *p;
char x;
x='a';
int opcion=0;
do//Realizamos menú principal hasta que la opción sea Salir
{
clrscr();
gotoxy(20,Cool;
printf("MENU PRINCIPAL\n");
gotoxy(20,10);
printf("1. Crear lista\n");
gotoxy(20,12);
printf("2. Insertar un nodo\n");
gotoxy(20,14);
printf("3. Eliminar un nodo\n");
gotoxy(20,16);
printf("4. Salir\n");

opcion=getch();
switch(opcion)
{
case'1'://Crear la lista
clrscr();
crear_llista(ref_llista);
break;
case'2'://Insertar un nodo
clrscr();
p=ref_llista->primer;
insereix(ref_llista, x, p);//Función que inserta un nodo
break;
case'3'://Elimina un nodo
clrscr();
p=ref_llista->primer;
suprimeix(ref_llista, p);
break;
case'4'://Salida del programa
clrscr();
sleep(1);
break;
default:
clrscr();
gotoxy(20,Cool;
printf("La tecla es erronea. Por favor introduce una elección del menu");
}
}while (opcion!='4');
}
void crear_llista(tipus_llista *L)
{
L->primer=NULL;
L->darrer=NULL;
}

void insereix(tipus_llista *&L, char x, tipus_node *&p)
{
tipus_node *q;
q=p->seg;
p->seg=new(tipus_node);
p->seg->element=x;
p->seg->seg=q;
if(p==L->darrer)
{
L->darrer=p;
}
if(p==L->primer)
{
L->primer=p;
}
}
void suprimeix(tipus_llista *&L, tipus_node *&p)
{
tipus_node *q;
if(p==NULL)
{
printf("Error");
}
else
{
q=p->seg;
p->seg=p->seg->seg;
free(q);
if(p==L->darrer)
{
L->darrer=q;
}
if(p==L->primer)
{
L->primer=q;
}
}
}

Muchas gracias nuevamente y un saludo
Volver arriba
fralex



Registrado: 11 Jul 2005
Mensajes: 112

MensajePublicado: 31/10/2005 10:21 am
Título: re

En realidad no estoy muy seguro de que sea porque viendolo asi por ensimita me doy cuenta que si la declaras, pero no puedo estar seguro del error porque hay un par de librerias que no uso ("windows.h" y "stdafx.h" que supongo es hecha por ti). Prueba colocando el operador '&' cuando envies como parametro al puntero
*ref_llista, quizas sea eso.

suerte...
_________________
Que viva el che,el lenguaje c y la banda ancha...
Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 5853
Ubicación: Mexico

MensajePublicado: 31/10/2005 2:42 pm
Título:

Código:
#include "stdafx.h"
#include "iostream"
#include "stdio.h"
#include "conio.h"
#include "windows.h"
#include "dos.h"

Sin comentarios. No, no vale la pena ...

Código:
void main()
{
   tipus_llista *ref_llista;

OK. Declaras la variable ref_llista, hay que tener cuidado con este puntero ya que todavia no apunta a una direccion valida de memoria.

Código:
case'1'://Crear la lista
   clrscr();
   crear_llista(ref_llista);
   break;

OK. Lo primero es crear la lista, a esta funcion le pasas el valor de ref_llista, ¿Cual es este valor?

Código:
void crear_llista(tipus_llista *L)
{
   L->primer=NULL;
   L->darrer=NULL;
}

Y dentro de esta funcion se accede al valor de la variable ref_llista mediante el argumento L, este es el problema ya que el valor de ref_llista no esta definido.

Un saludo
_________________
The capacity to learn is a gift;
The ability to learn is a skill;
The willingness to learn is a choice.
--
Rebec of Ginaz
Volver arriba
brujilla



Registrado: 11 Oct 2005
Mensajes: 14
Ubicación: Palma de Mallorca

MensajePublicado: 01/11/2005 10:09 am
Título:

Muchísmimas gracias a todos, pero todavía no consigo que me funcione.
Otro ejemplo en otro programa de lo que me pasa es el sigueinte:

/ Examen4.cpp: define el punto de entrada de la aplicación de consola.
//
#include "stdafx.h"
#include "iostream"
#include "stdio.h"
#include "conio.h"
#include "windows.h"
#include "dos.h"
using namespace std;

void clrscr()//Función limpiar pantalla
{
system ("cls");
}
void gotoxy(int x, int y)//Función para situar gráficamente
{
HANDLE hConsole = GetStdHandle (STD_OUTPUT_HANDLE);
if (INVALID_HANDLE_VALUE !=hConsole)
{
COORD pos= {x,y};
SetConsoleCursorPosition(hConsole, pos);
}
}
void sleep (int ms)//Funcion para parar el programa
{
Sleep(ms*1000);
}

struct L_llista
{
char info;//Info del nodo.
L_llista *seg;//Apunta a siguiente nodo.
};

void purga(L_llista *&cap);
void insertar_cap(L_llista *&cap);
void listar(L_llista *&cap);
void suprimeix(L_llista *&cap, L_llista *&p);
void encontrar_x(L_llista *&cap);
void main()
{
int opcion=0;
L_llista *cap;
cap=NULL;

do//Realizamos menú principal hasta que la opción sea Salir
{
clrscr();
gotoxy(20,Cool;
printf("MENU PRINCIPAL\n");
gotoxy(20,10);
printf("1. Dar de alta un nodo por CAP\n");
gotoxy(20,12);
printf("2. Listar todos los nodos\n");
gotoxy(20,14);
printf("3. Ejercicio 4\n");
gotoxy(20,16);
printf("4. Ejercicio 6\n");
gotoxy(20,1Cool;
printf("5. Salir\n");

opcion=getch();
switch(opcion)
{
case'1':
clrscr();
insertar_cap(cap);//Función que inserta por cap
break;
case'2':
clrscr();
listar(cap);//Función que lista todos los nodos
break;
case'3':
clrscr();
purga(cap);//Función que purga los elementos con info repetido
break;
case'4':
clrscr();
encontrar_x(cap);//Función que encuentra x y lo borra
break;
case'5'://Salida del programa
clrscr();
sleep(1);
break;
}
}while (opcion!='5');
}
void insertar_cap(L_llista *&cap)//Función que inserta por cap
{
L_llista *nou;
nou=new(L_llista);//Creamos nodo nou

nou->seg=cap;//Que nou apunte donde apunta cap
cap=nou;//Que cap apunte a nou

gotoxy(20,10);//A partir de ahora introducimos los datos del vendedor
printf("Dime el info del nodo: ");
cin>>nou->info;
fflush(stdin);//borramos memoria de entrada
}
void listar(L_llista *&cap)
{
L_llista *aux;
aux=cap;
while (aux!=NULL)//Vamos recorriendo la lista y enseñando los nodos
{
printf("%c\n", aux->info);
aux=aux->seg;
}
sleep(3);
}
void purga(L_llista *&cap)
{
L_llista *p;
L_llista *q;
char cadena;

p=cap;
while(p!=NULL)
{
q=p->seg;
cadena=p->info;
while(q!=NULL)
{

if(q->info==cadena)
{
suprimeix(cap, p);
}
else
{
q=q->seg;
}
p=p->seg;
}

}
}

void suprimeix(L_llista *&cap, L_llista *&p)
{
L_llista *q;

if(p==NULL)
{
printf("Error");
}
else
{
q=p->seg;
p->seg=p->seg->seg;
free(q);
}
}
void encontrar_x(L_llista *&cap)
{
L_llista *aux;
L_llista *aux2;
aux=cap;
if (cap==NULL)
{
printf("No hay ningún nodo");
}
else
{
if(cap->info=='x')
{
suprimeix(cap, aux);
}
aux=aux->seg;
aux2=cap;
while(aux!=NULL)
{
if(aux->info=='x')
{
suprimeix(cap, aux);
}
else
{
aux=aux->seg;
aux2=aux2->seg;
}
}
}
}
Me da porblemas en void suprimeix, en la línea p->seg=p->seg->seg;. El error que me dice es de ""Excepción no controlada en 0x004184ed en Examen4.exe: 0xC0000005: Infracción de acceso al leer la ubicación 0x00000004."" y me dirige el problema a esa frase. Alguien sabría decirme cual es el problema?
Siempre me pasa lo mismo, y cuando veo las variables, me pone "Error30CXX0000: no se puede evaluar la expresión". Estoy ya casi deseperada. Si alguien me lo sabría solucionar se lo agradecería-

Un Abrazo a todos los ineresados!!!!!!
Volver arriba
brujilla



Registrado: 11 Oct 2005
Mensajes: 14
Ubicación: Palma de Mallorca

MensajePublicado: 11/11/2005 7:11 am
Título:

Buenas!!! Muchas gracias a todos por vuestra ayuda. Al final me di cuenta que el problema que tenía era que perdía un puntero.

Gracias por todo a los interesados!!!!!!!

Salu2
Volver arriba
Floweer



Registrado: 26 Dic 2010
Mensajes: 1
Ubicación: Gdl, Jalisco, Mexico

MensajePublicado: 26/12/2010 12:39 pm
Título: Error30CXX0000: no se puede evaluar la expresión

Hooola tengo el mismo error creo pero no logro encontrarlo... Publica como lo encontraste o mas o menos un ejemplo de donde estaba porq este error me esta volviendo loca... GRacias de antemano
_________________
Gracias a todos los colaboradores Very Happy
Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 5853
Ubicación: Mexico

MensajePublicado: 27/12/2010 3:34 pm
Título:

Hola Floweer

Bienvenido a los foros. Por favor lee sus reglas.

Si tienes un problema con tu programa lo mejor es publicar el codigo fuente completo e indicar la parte en que tienes dificultades.

Un saludo
_________________
The capacity to learn is a gift;
The ability to learn is a skill;
The willingness to learn is a choice.
--
Rebec of Ginaz
Volver arriba
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com