Duda listas simplemente ligadas con encabezado...

azazel_xes
05 de Mayo del 2005
Antes que nada gracias por tomarte la molestia de leer mi duda.

tegno que hacer un programa en c++usando ese tipo de listas las funciones ya las tengo el problema es como mandar el parametro a una función si el parametro es una estrutura aqui pongo el codigo

//ESTA PARTE LA TOME DE UN EJEMPLO QUE PONEN 3 MENSAJES ABAJO DE ESTE//
#include <stdio.h>
#include <conio.h>
#include <iostream.h>

struct lista
{
int num;
lista *sig;
};

lista *inicio = NULL, *nuevo = NULL, *aux = NULL;

void Inserta( int );
void Muestra( );

//inserta//
void Inserta( int x ){

if( inicio == NULL ){

inicio = new lista;
inicio -> sig = NULL;
inicio -> num = x;
aux = inicio;
}

else{
nuevo = new lista;
nuevo -> num = x;
nuevo -> sig = NULL;
aux -> sig = nuevo;
aux = nuevo;
}
}

//imprimir//
void Muestra( ){
aux = inicio;
clrscr( );
while( aux != NULL ){
cout << aux -> num << " ";
aux = aux -> sig;
}
}

//ESTA ES LA FUNCIONQBUE TENGO QUE IMPLEMENTAR//
//AQUI TENGO QUE MANDAR EL PARAMETRO *P ENTIENDO QUE ES UN PARAMETRO DE TIPO STRUCT AHORA BIEN COMO LE MANDO ESTE PARAMETRO DESDE MI FUNCION MAIN, YO TENGO LA IDEA DE QUE DEBO DE CREAR UN OBJETO DE TIPO STRUCT Y MANDARSELA Y ES AHI CUANDO YA NO SE COMO DEBE DE SER LA LLAMA A ELIMINAR EN LA FUNCION MAIN DE MI PROGRAMA AQUI DEJO TAL CUAL COMO LO TENGO ESPERANDO QUE ALGUIEN ME ACLARE ESTO

void suprimir(lista *p){
aux=p->sig;
p->sig=aux->sig;
delete(aux);
}

//MAIN//
int main(int argc, char *argv[])
{
int numero;
char otro;
do{
clrscr( );
cout << "Inserta numero a la lista: ";
cin >> numero;
Inserta( numero );
cout <<"nnOtro(sn): ";
cin >> otro;
}while( otro == 's' || otro == 'S' );

cout << "Tu lista es: "<< endl << endl;
//AQUI ES DONDE QUIERO PEDIR EL NUMERO DE LA LISTA PARA ELIMINARLO//
cout << "Inserta numero a eliminar de la lista: ";
nuevo = new lista;
//cin >> nuevo;
suprimir(nuevo); <----Y AQUI YA NO SE COMO MANDAR EL PARAMETRO PARA ELIMINAR LA ESTRUCTURA QUE CONTIENE ESE NUMERO
//
Muestra( );
getch( );
return 0;
}

Andrea
05 de Mayo del 2005
Para que te sea lo más fácil posible asimilar el concepto: piensa que una estructura es como un número. Se tratan de la misma manera. Si para igualar dos estructuras harías a=b tal y como se igualan dos números, para pasar estructuras a una función se hace exactamente igual que si fuera un int.
Saludines :)

carmamezo
05 de Mayo del 2005
Hola, he hecho un programita deprisa y corriendo en C donde se hace un poco de todo lo que exponías en el ejemplo. Un consejo, no uses variables globales en la medida de lo posible, yo te paso un programa que no las usa. Además las funciones manejan las estructuras de diversas maneras... Reciben punteros a estructuras, devuelven punteros a estructuras y una de ellas maneja un puntero a puntero a estructura... En fin todas las posibilidades.
Puede que el programa tenga fallos o no funcione bien, a simple vista me parece que va bien pero como te he dicho antes lo he hecho deprisa y corriendo.

#include<windows.h>
#include<stdio.h>

typedef struct lista
{
int n;
struct lista *sig;
}st_lista;


st_lista* anyade(int n)
{
st_lista *una;

una=(st_lista*)malloc(sizeof(st_lista));
una->n=n;
una->sig=NULL;

return una;
}

void muestra(st_lista *primera)
{
int i=0;
system("Cls");

if(primera==NULL)//mirar si hay estructuras en la lista
{
printf("ntNo hay estructuras para mostrar!!");
getchar();
return;
}

do//mostrar todas las estructuras
{
printf("ntEstructura %d -> valor: %d",i,primera->n);
primera=primera->sig;
i++;
}while(primera!=NULL);

}

int elimina_uno(int n, st_lista **primera)
{
st_lista *aux,*aux2;
aux=*primera;
aux2=aux;

if(aux->n!=n)//de esta manera tengo un puntero a una estructura anterior
aux=aux->sig;

if(aux->sig==NULL && aux->n==n)//mirar si sólo hay una estructura en la lista
{
*primera=NULL;
return 0;
}

while(aux->sig!=NULL)//buscar el elemento
{
if(aux->n==n)
break;

aux=aux->sig;
aux2=aux2->sig;
}

if(aux->sig==NULL && aux->n != n)//si llegamos al final y no aparece el elmento
return -1; //no existe ese registro

if(aux==*primera)//si el elemento a eliminar es el primero
{
*primera=(*primera)->sig;
free(aux);
return 0;
}
//sino
aux2->sig=aux->sig;
free(aux);
return 0;
}

void elimina_todo(st_lista *inicio)
{
st_lista *aux;

if(inicio==NULL)//no hay elementos a eliminar
return;
aux=inicio;
inicio=inicio->sig;
do
{
free(aux);
aux=inicio;
if(inicio!=NULL)
inicio=inicio->sig;
}while(aux!=NULL);


}


void main()
{
st_lista *inicio,*fin;
char op;
int n,resultado;

//guardar espacio para la primera estructura
//inicio siempre apuntará a la primera estructura
//y fin al final
inicio=(st_lista*)malloc(sizeof(st_lista));
fin=inicio;

inicio->sig=NULL;
system("Cls");//borrar pantalla
printf("ntIntroduce un elemento: ");
scanf("%d",&inicio->n);


do{
do
{
printf("ntDesea introducir un nuevo elemento? (s-n): ");
fflush(stdin);
scanf("%c",&op);
op=tolower(op);
}while(op!='s' && op!='n');
if(op=='s')
{
printf("ntIntroduzca nuevo elemento: ");
fflush(stdin);
scanf("%d",&n);
fin->sig=anyade(n);
fin=fin->sig;
}
}while (op=='s');

muestra(inicio);

do
{
do
{
printf("ntDesea eliminar un elemento? (s-n): ");
fflush(stdin);
scanf("%c",&op);
op=tolower(op);
}while(op!='s' && op!='n');
if(op=='s')
{
printf("ntIntroduzca valor del elemento a eliminar: ");
scanf("%d",&n);
resultado=elimina_uno(n,&inicio);
if(resultado==-1)
{
printf("ntNo existe ese registro!!");
fflush(stdin);
getchar();
}
}
muestra(inicio);
}while(op=='s');

fflush(stdin);
printf("nntPulsa <enter> para continuar. ");
getchar();

elimina_todo(inicio);
}

Un saludo.