Programación General > C/C++
Problema Con Listas
henry201186:
hola quisiera pedirles ayuda. lo que pasa es que quisiera saber como ordenar unas listas osea que haga esto
Dato de la lista 1: 1
Dato de la lista 1: 2
Dato de la lista 1: 4
Dato de la lista 1: 5
Dato de la lista 2: 3
Salida: 1,2,3,4,5
-----------------------------------------
lo trate de hacer con este codigo pero no se cual es el error
--- Código: Text ---#include<stdlib.h> #include<stdio.h> #include<stdlib.h> #include <conio.h> struct Lista{ int Dato; struct Lista *sig; }; struct Lista *CreaEspacio(struct Lista *L, int Dato); struct Lista *InsertaNodo(struct Lista *L, int Dato); struct Lista *Concatena(struct Lista *a, struct Lista *b); struct Lista *Insertame(struct Lista *a,struct Lista *nuevo); void ImprimeLista(struct Lista *l); int main() { struct Lista *l1=NULL,*l2 =NULL; int i,dato; for(i=1;i<=4;++i){ printf("Dato de lista1: ");scanf("%d",&dato); l1=InsertaNodo(l1,dato); } for(i=1;i<=1;++i){ printf("Dato de lista2: ");scanf("%d",&dato); l2=InsertaNodo(l2,dato); } l1=Insertame(l1,l2); printf(" Holaaaaa "); ImprimeLista(l1); getch(); return 0; } struct Lista *InsertaNodo(struct Lista *l, int Dato) { if(l==NULL) l=CreaEspacio(l,Dato); else l->sig=InsertaNodo(l->sig,Dato); return l; } struct Lista *CreaEspacio(struct Lista *l, int Dato) { if((l=(struct Lista *)malloc(sizeof(struct Lista)))==NULL) {perror("Falta de memoria");abort();} l->sig=NULL; l->Dato=Dato; return l; } void ImprimeLista(struct Lista *l) { if(l!=NULL) {printf(" %d ",l->Dato);ImprimeLista(l->sig);} } struct Lista *Concatena(struct Lista *a, struct Lista *b) { if(a==NULL) a=b; else a->sig=Concatena(a->sig,b); return a; } struct Lista *Insertame(struct Lista *a,struct Lista *nuevo) { if(a==NULL){ a=nuevo;} else if((nuevo->Dato)<(a->Dato)){nuevo->sig=a; a=nuevo; } else if((nuevo->Dato)>(a->Dato)){a->sig=Insertame(a,nuevo);} else{ nuevo->sig=a->sig; a->sig=nuevo; } return a; } espero me puedan ayudar
Salu2
Diabliyo:
Hola:
Bueno pues como veo el CODIGO, NO ES TUYO y mucho menos lo hciste tu :D...o tal vez me equivoco, pero bueno, el error radica en el PRINTF que esta en: MAIN() checale...es aqui: (checa abajo).... Como segunda RECOMENDACION, trata de mejorar tu acomodamiento o escritura de Cofigos Fuente, (ceheca la forma en que la escribo), ya que de la forma anterior esta dificil saber DONDE EMPIEZA y DONDE TERMINAN los CILCOS, CONDICIONES, FUNCIONEs, etc, etc.... de la forma que lo ordene es mas facil ver todas las partes de codigo :D.... asi tambien NO se te pasara poner los "{ }", si es que algun dia te fallasen :D
NOTA: si lo que querias hacer ocn el "printf( "Hola" );" era que HOLA apareciera mas ABAJO, o algo paresido, entonces usa: "\n" ya que es como un ENTER... "printf( "\nHola" );" ;)
NOTA2: ese codigo NO es muy bueno, ni muy dinamico :D...
--- Código: Text --- int main() { struct Lista *l1=NULL,*l2 =NULL; int i,dato; for(i=1;i<=4;++i) { printf("Dato de lista1: "); scanf("%d",&dato); l1=InsertaNodo(l1,dato); } for(i=1;i<=1;++i) { printf("Dato de lista2: "); scanf("%d",&dato); l2=InsertaNodo(l2,dato); } l1=Insertame(l1,l2); printf("Holaaaaa"); /*AQUI ESTABA TU ERROR*/ ImprimeLista(l1); getch(); return 0; }
henry201186:
la verdad no era eso lo que pedia lo que yo queria era saber como ordenar los datos de la lista uno y juntarlos con los de la lista 2 osea:
lista 1
--- Citar ---Dato de la lista 1: 1
Dato de la lista 1: 2
Dato de la lista 1: 4
Dato de la lista 1: 5
--- Fin de la cita ---
lista 2
--- Citar ---Dato de la lista 2: 3
--- Fin de la cita ---
resultado
--- Citar ---Salida: 1,2,3,4,5
--- Fin de la cita ---
Salu2
dreadlock:
primero: un entero no se puede cocatenar(estrictamente a otro) esto por el tipo de variable que declaras, si desearas cocatenar en serio, pues debrias cambiar auna variable tipó char, y utilizar la funcion strcopy(), si creo que es esta, y utilizar punteros para desplazarte, masomenos creo que tu quieres que al final del programa se muestren los datos que fueron introducidos, pues para esto en tu funcion
--- Código: Text --- struct Lista *Concatena(struct Lista *a, struct Lista *b) { if(a==NULL) a=b; else a->sig=Concatena(a->sig,b); return a;}
pues haz uun recorrido de tu lista
--- Código: Text --- void ImprimeLista(struct Lista *l) { if(l!=NULL) {printf(" %d ",l->Dato);ImprimeLista(l->sig);} }
Aunque vreas, eh encontrado algunas cosas extrañas, al crear tu lista no pusiste la direccion del primer, nodo, esto es importante para hacer el recvorrido,m esque eso si es iomportante, veras no entiendo por que al llamar la funcion esta
--- Código: Text --- l1=InsertaNodo(l1,dato); antes igualas el apuntador l1 NULO, eso tu sabras para que, pero en fin, mira aqui posteo un codigo de lo que es una lista enlazada, que yo ocupe como base para muchos programas.
--- Código: Text --- //prog 30//lista simplemente enlazada#include<stdio.h>#include<string.h>#include<conio.h>#include<ctype.h>#include<dos.h>#include<stdlib.h>#include<a:portada.h># define MAX 6int i;int borrando=0;void intro_ficha(void);void lista_ficha(void);void muestra_ficha(void);void borra_ficha(void);void almacena_datos(void);void lee_datos(void);void asigna_memoria(void);void visu_ficha(struct agenda*);////////////////////////struct agenda *display_ficha(char *n);struct agenda *busca(char *inbuf);struct agenda *primero,*nuevo,*indice;//////////////////////////////////struct agenda{char nombre[30];char direccion[50];char telefono [10];struct agenda *siguiente;//apunta al siguiente elemento de la lista};//////////////////////////////////void asigna_memoria(){nuevo=(struct agenda*)malloc(sizeof(struct agenda));if(nuevo==NULL){gotoxy(2,13);printf("Espacio de memoria insuficiente");getche();for(i=2;i<=79;i++){gotoxy(i,13);printf(" ");}return;}if(primero==(struct agenda*)NULL)primero=indice=nuevo;else{indice=primero;while(indice->siguiente!=(struct agenda*)NULL)indice=indice->siguiente;indice->siguiente=nuevo;indice=nuevo;}}/////////////////////////////////////////////////////void intro_ficha(){asigna_memoria();for(i=2;i<=79;i++){gotoxy(i,13);printf(" ");}gotoxy((80-19)/2,13);printf("Agregando Datos!!!!");gotoxy(5,16);printf("Nombre: ");fflush(stdin);gets(indice->nombre);gotoxy(5,17);printf("Direccion: ");fflush(stdin);gets(indice->direccion);gotoxy(5,18);printf("Telefono: ");fflush(stdin);gets(indice->telefono);indice->siguiente=(struct agenda*)NULL;}/////////////////////////////////////////void lista_ficha(void){if(primero==(struct agenda*)NULL){for(i=2;i<=79;i++){gotoxy(i,13);printf(" ");}gotoxy((80-15)/2,13);printf("Lista vacia!!!!");getche();//retener mensajereturn;}indice=primero;do{visu_ficha(indice);indice=indice->siguiente;}while(indice!=(struct agenda*)NULL);}////////////////////////////////////////////////void muestra_ficha(void){char inbuf[30];for(i=2;i<=79;i++){gotoxy(i,13);printf(" ");}gotoxy(5,13);printf("Mostrar la ficha con Nombre: ");fflush(stdin);gets(inbuf);display_ficha(inbuf);}/////////////////////////////////////////////////////void visu_ficha(struct agenda *visu){for(i=2;i<=79;i++){gotoxy(i,13);printf(" ");gotoxy(i,16);printf(" ");gotoxy(i,17);printf(" ");gotoxy(i,18);printf(" ");}gotoxy(30,13);printf("Mostrando datos!!!!");gotoxy(5,16);printf("Nombre: %s",visu->nombre);gotoxy(5,17);printf("Direccion: %s",visu->direccion);gotoxy(5,18);printf("Telefono: %s",visu->telefono);if(borrando==0){hori(22);gotoxy(26,23);printf("Presiona CUALQUIER tecla para continuar");getche();}}////////////////////////////////////////////////void borra_ficha(){struct agenda *borra;char inbuf[30];for(i=2;i<=79;i++){gotoxy(i,13);printf(" ");}gotoxy(5,13);printf("Borra la ficha con el nombre: ");fflush(stdin);gets(inbuf);borra= ((struct agenda*)display_ficha(inbuf));if(borra==(struct agenda*)NULL)return;for(i=2;i<=79;i++){gotoxy(i,13);printf(" ");}gotoxy(5,13);printf("Deseas borrar esta ficha? s/n: ");switch(toupper(getche())){case 'N':return;case 'S':break;}if(borra==primero)primero=primero->siguiente;else{indice=primero;while(indice->siguiente!=borra)indice=indice->siguiente;indice->siguiente=borra->siguiente;}free(borra);}//////////////////////////////////////////////////////struct agenda *display_ficha(char *n){struct agenda *ficha;for(i=2;i<=79;i++){gotoxy(i,13);printf(" ");}gotoxy((80-18)/2,13);printf("Buscando ficha!!!!");if(!(ficha=(struct agenda *)busca(n))){for(i=2;i<=79;i++){gotoxy(i,13);printf(" ");}gotoxy((80-23)/2,13);printf("Ficha no encontrada!!!!");getche();return NULL;}elsevisu_ficha(ficha);return ficha;}///////////////////////////////////////////////////struct agenda *busca(char *inbuf){indice=primero;while(indice!=NULL){if(!strcmp(inbuf,indice->nombre))return indice;indice=indice->siguiente;}return NULL;}///////////////////////////////////////////////void intro(){clrscr();margenes();gotoxy(3,2);printf("Programa No: 30");hori(3);gotoxy(3,4);printf("Lista enlazada");gotoxy(3,9);printf("Descripcion:");gotoxy(3,10);printf("Este programa maneja una lista enlazada");hori(22);gotoxy(20,23);printf("Presiona Cualquier tecla para continuar");getche();}/////////////////////////////////////////main(){clrscr();portada();intro();for(;;){clrscr();borrando=0;int opc;margenes();gotoxy((80-14)/2,2);cprintf("<--@G3|\|d@-->");hori(3);gotoxy((80-22)/2,4);cprintf("1.- Agregar");gotoxy((80-22)/2,5);cprintf("2.- Listar todos");gotoxy((80-22)/2,6);cprintf("3.- Mostrar por nombre");gotoxy((80-22)/2,7);cprintf("4.- Borrar por nombre");gotoxy((80-22)/2,8);cprintf("5.- Guargar a disco");gotoxy((80-22)/2,9);cprintf("6.- Leer de disco");gotoxy((80-22)/2,10);cprintf("7.- Salir");hori(12);hori(14);gotoxy((80-22)/2,13);cprintf("Elige tu opcion: ");scanf("%d",&opc);switch(opc){case 1:intro_ficha();break;case 2:lista_ficha();break;case 3:muestra_ficha();break;case 4:borrando=1;borra_ficha();break;case 5:almacena_datos();break;case 6:lee_datos();break;case 7:exit(0);break;}}}////////////////////////////////////////////////void almacena_datos(void){FILE *ap;char *ruta=NULL;int c=0;for(i=2;i<=79;i++){gotoxy(i,13);printf(" ");}gotoxy((80-21)/2,13);printf("Guardando a disco!!!!");gotoxy(5,16);printf("Directorio: ");fflush(stdin);gets(ruta);if((ap=fopen(ruta,"wb"))==NULL){for(i=2;i<=79;i++){gotoxy(i,13);printf(" ");}gotoxy((80-31)/2,13);printf("El archivo no se puede abrir!!!!");getche();return;}indice=primero;for(i=2;i<=79;i++){gotoxy(i,13);printf(" ");}do{//efectoif(c==5){c=0;}if(c==0||c==3){gotoxy(39,13);printf("|");}if(c==1){gotoxy(39,13);printf("/");}if(c==2){gotoxy(39,13);printf("-");}if(c==4){gotoxy(39,13);printf("\\");}fwrite(indice,sizeof(struct agenda),1,ap);indice=indice->siguiente;c++;}while(indice!=(struct agenda*)NULL);fclose(ap);}////////////////////////////////////////////void lee_datos(void){FILE *ap;char *ruta=NULL;for(i=2;i<=79;i++){gotoxy(i,13);printf(" ");}gotoxy((80-21)/2,13);printf("Leer datos de disco!!!!");gotoxy(5,16);printf("Directorio: ");fflush(stdin);gets(ruta);if((ap=fopen(ruta,"rb"))==NULL){for(i=2;i<=79;i++){gotoxy(i,13);printf(" ");}gotoxy((80-31)/2,13);printf("El archivo no se puede abrir!!!!");getche();return;}asigna_memoria();do{indice->siguiente=nuevo;indice=nuevo;fread(indice,sizeof(struct agenda),1,ap);nuevo=(struct agenda*)malloc(sizeof(struct agenda));}while(indice->siguiente!=NULL);fclose(ap);}
The Black Boy:
:hola:
dreadlock.. tu programa hace mas de lo que esta pidiendo henry201186 y tu henry201186 lo que yo entiendo es que independientemente de como entre los datos debes mostrarlos de forma ordenada con los de la lista 2 ¿es eso?
___Saludos___ :hola:
Navegación
[#] Página Siguiente
Ir a la versión completa