Foro: Dudas y Consultas

TPN2 Consultas

TPN2 Consultas

de Usuario eliminado -
Número de respuestas: 5

Buenas profe, queria saber si lo que desarrolle seria correcto.

2_ válido

typedef struct tnodo *pnodo;
typedef struct tnodo {
int dato;
pnodo sig;
};
typedef struct tlista{
pnodo inicio;
pnodo fin;
};
main(){
tlista lista,cop_list;
pnodo nuevo;
}

a_válido

void agregar_inicio(tlista &lista, pnodo nuevo){
pnodo i;
if(lista.inicio==NULL){
lista.inicio=nuevo;
lista.fin=nuevo;
}else{
if(lista.inicio==lista.fin){
if(lista.inicio->dato==nuevo->dato){
cout<<"No se puede agregar el dato ya existe";
delete(nuevo);
}else{
nuevo->sig=lista.inicio;
lista.inicio=nuevo;
}
}else{
if(lista.inicio->dato==nuevo->dato || lista.fin->dato==nuevo->dato){
cout<<"No se puede agregar el dato ya existe";
delete(nuevo);
}else{
for(i=lista.inicio;i->sig != lista.fin && nuevo->dato != (i->sig)->dato;i=i->sig);
if((i->sig)->dato!=nuevo->dato){ //aquí te convendría preguntar o plantear la situación en la que llegue al último nodo, como ya tienes la pregunta si coincide con el último, aquí al llegar a esa posición es porque no existe el valor.
nuevo->sig=lista.inicio;
lista.inicio=nuevo;
}else{
cout<<"No se puede agregar el dato ya existe";
delete(nuevo);
}
}
}
}
}

3_ válido

typedef struct tnodo *pnodo;
typedef struct tnodo {
char dato;
pnodo sig;
};
typedef struct tlista{
pnodo inicio;
pnodo fin;
int may;
int min;
int simb;
int dig;
};
main(){
tlista lista;
pnodo nuevo;
}

válido

void agregar_final(tlista &lista, pnodo nuevo){
if(lista.inicio==NULL){
lista.inicio=nuevo;
lista.fin=nuevo;
}else{
lista.fin->sig=nuevo;
lista.fin=nuevo;
}
if(nuevo->dato>='a' && nuevo->dato<='z')
lista.min++;
if(nuevo->dato>='A' && nuevo->dato<='Z')
lista.may++;
if(nuevo->dato>='0' && nuevo->dato<='9')
lista.dig++;
if((nuevo->dato>='!' && nuevo->dato<='/') || (nuevo->dato>=':'&&nuevo->dato<='@'))
lista.simb++; // si anidas los condicionales, por descarte podrías llegar a considerar todos los símbolos y no sólo los que tienes contemplados
}

válido

void mostrar_lista(pnodo n, char op1){  //mostrar segun parametro de opcion
if(n == NULL)
cout<<"Lista vacia"<<endl;
else{
if(n->sig==NULL)
cout<<n->dato<<endl;
else{
if(op1=='1'){
cout<<n->dato<<endl;
mostrar_lista(n->sig,op1);
}else{
if(op1=='2'){
mostrar_lista(n->sig,op1);
cout<<n->dato<<endl;
}
}
}
}
}

4_a_

válido

typedef struct tnodo *pnodo;
typedef struct tnodo {
float dato;
pnodo sig;
};
typedef struct tlista{
pnodo inicio;
pnodo fin;
};
main(){
tlista lista;
}

d_válido

bool buscar_nodo(pnodo list, int valor){  //por logica
if(list==NULL)
return false;
else{
if(list->dato==valor)
return true;
else
return buscar_nodo(list->sig,valor);
}
}

pnodo buscar_nodo(pnodo list, int valor){ //tipo puntero
pnodo encontrado=NULL;
if(list==NULL)
return encontrado=NULL; //aquí sería directamente return encontrado;
else{
if(list->dato==valor){
encontrado=list;
return encontrado;
}else
return buscar_nodo(list->sig,valor);
}
}

7_ (solo quiero saber si los recursivos estan bien)

válido

void agregar_final(pnodo &inicio, pnodo &fin, pnodo nuevo){
if(inicio==NULL){
inicio=nuevo;
fin=nuevo;
}else{
if(inicio->sig==NULL){
fin->sig=nuevo;
fin=nuevo;
}else
agregar_final(inicio->sig,fin,nuevo);
}
}

//Válido

pnodo quitar_final(pnodo &inicio, pnodo &fin){ 
pnodo extraido;
if(inicio==NULL)
extraido=NULL;
else{
if(inicio==fin){ 
extraido=inicio;
inicio=NULL;
fin=NULL;
}else{
if(inicio->sig==fin){
extraido=inicio->sig;
inicio->sig=NULL;
fin=inicio;
}else
quitar_final(inicio->sig,fin); //falta asignar a extraido el resultado de quitar_final
}
}
return extraido;
}

válido

int contar_nodo(pnodo inicio){
int c;
if(inicio==NULL)
c=0;
else
c=1+contar_nodo(inicio->sig);
return c;
}

desde ya muchas gracias

(Editado por Verónica Torres - envío original sábado, 2 de septiembre de 2023, 00:19)

En respuesta a Usuario eliminado

Re: TPN2 Consultas

de Verónica Torres -
Hola Francisco, te hice algunas observaciones en los códigos que mandaste a fin de mejorar y que lo tengas presente
saludos
En respuesta a Verónica Torres

Re: TPN2 Consultas

de Usuario eliminado -

ok profe muchas gracias.

Tambien queria saber si estos estarian correctos. Saludos

punto 6

a_ válido

typedef char tcad[30]; 

typedef struct treg{
tcad palab;
int lon;
};

typedef struct tnodo *pnodo;
typedef struct tnodo {
treg dato;
pnodo sig;
};
typedef struct tlista{
pnodo inicio;
pnodo fin;
};
main(){
tlista lista;
pnodo nuevo;
}

b_ válido

void agregar_orden(tlista &lista, pnodo nuevo){
pnodo i;
if(lista.inicio==NULL){
lista.inicio=nuevo;
lista.fin=nuevo;
}else{
if(strcmp(lista.inicio->dato.palab,nuevo->dato.palab)==0 || strcmp(lista.fin->dato.palab,nuevo->dato.palab)==0){
cout<<"No se puede agregar el dato ya existe";
delete(nuevo);
}else
if(strcmp(nuevo->dato.palab,lista.inicio->dato.palab)<0){
nuevo->sig=lista.inicio;
lista.inicio=nuevo;
}else{
if(strcmp(nuevo->dato.palab,lista.fin->dato.palab)>0){
lista.fin->sig=nuevo;
lista.fin=nuevo;
}else{
for(i=lista.inicio;i->sig != NULL && strcmp(nuevo->dato.palab,(i->sig)->dato.palab)>0;i=i->sig);
if(i->sig!=NULL && strcmp(nuevo->dato.palab,(i->sig)->dato.palab)==0){
cout<<"No se puede agregar el dato ya existe";
delete(nuevo);
}else{
nuevo->sig=i->sig;
i->sig=nuevo;
}
}
}

}
}

c_ (me falta el recursivo)

void submenu(char &op){
cout<<"1_Mostrar cadenas capicuas"<<endl;
cout<<"2_Mostrar no capicuas"<<endl;
cout<<"3_Mostrar todos los elementos"<<endl;
cout<<"4_Salir"<<endl;
cout<<"Elija una opcion"<<endl;
cin>>op;
}
void mostrar_lista(tlista lista){
char op;
pnodo i;
if(lista.inicio != NULL){
submenu(op);
switch(op){
case '1': for(i=lista.inicio;i!=NULL;i=i->sig) //esto debería estar en otro módulo, aquí solo deberías invocar al módulo mostrar_capi por ejemplo
if(capicua(i->dato)==true)
mostrar(i->dato);
break;
case '2': for(i=lista.inicio;i!=NULL;i=i->sig) //esto también debería realizarse en otro módulo
if(capicua(i->dato)==false)
mostrar(i->dato);
break;
case '3': for(i=lista.inicio;i!=NULL;i=i->sig) //idem anterior
mostrar(i->dato);
break;
}
}else
cout<<"LISTA VACIA";
}
void mostrar(treg dat){
cout<<dat.palab<<"-->"<<dat.lon<<endl;
}
bool capicua(treg cad){
int i,j=strlen(cad.palab)-1,aux=strlen(cad.palab)-1; //si estás recibiendo el registro podés acceder al campo que guarda la longitud
bool band=true;
for(i=0;i<=aux && band;i++){
if(cad.palab[i]==cad.palab[j])
j--;
else
band=false;
}
return band;
}

punto 8_

void iniciar_lista(tlista &lista){
lista.inicio=NULL;
lista.fin=NULL;
lista.cont=0;
//válido

void agregar_inicio(tlista &lista, pnodo nuevo){
if(lista.cont!=MAX){
if(lista.inicio==NULL){
lista.inicio=nuevo;
lista.fin=nuevo;
lista.fin->sig=lista.inicio;
}else{
nuevo->sig=lista.inicio;
lista.inicio=nuevo;
lista.fin->sig=lista.inicio;
}
lista.cont++;
}else
cout<<"No se puede agregar mas nodos"<<endl; //podría contemplar que si no se agrega liberar la memoria de nuevo
}


pnodo quitar_nodo_espe(tlista &lista, int valor){
pnodo extraido,i;
if(lista.inicio==NULL)
extraido=NULL;
else{
if(lista.inicio->dato==valor){
if(lista.inicio==lista.fin){
extraido=lista.inicio;
lista.inicio=NULL;
lista.fin=NULL;
}else{
extraido=lista.inicio;
lista.inicio=lista.inicio->sig;
lista.fin->sig=lista.inicio;
extraido->sig=NULL;
}
}else{
for(i=lista.inicio;i->sig!=lista.inicio && valor!=(i->sig)->dato;i=i->sig);
if((i->sig)->dato==valor){
extraido=i->sig;
i->sig=extraido->sig;
extraido->sig=NULL;
if(extraido==lista.fin)
lista.fin=i;
}else
extraido=NULL;
}
lista.cont--;
}
return extraido;
}

válido
pnodo minimo_valor(tlista lista){
pnodo minimo,i;
if(lista.inicio==NULL)
minimo=NULL;
else{
minimo=lista.inicio;
for(i=lista.inicio->sig;i!=lista.inicio;i=i->sig){
if(i->dato < minimo->dato)
minimo=i;
}
}
return minimo;
}válido


void mostrar_lista(tlista lista){
pnodo i;
if(lista.inicio == NULL)
cout<<"Lista vacia"<<endl;
else{
for(i=lista.inicio;i!=lista.fin;i=i->sig) //podrías usar el contador para controlar que se muestren todos los nodos
cout<<"Nodo: "<<i->dato<<endl;
cout<<"Nodo: "<<i->dato<<endl;
}
}válido

(Editado por Verónica Torres - envío original domingo, 3 de septiembre de 2023, 16:24)

En respuesta a Usuario eliminado

Re: TPN2 Consultas

de Verónica Torres -
Hola Francisco, te hice observaciones en tu publicación.
saludos
En respuesta a Verónica Torres

Re: TPN2 Consultas

de Usuario eliminado -

Muchas gracias profesora, entonces en el 6c deberia haberlo hecho asi:

void mostrar_lista(tlista lista){
char op;
if(lista.inicio != NULL){
submenu(op);
switch(op){
case '1': mostrar_cap(lista);
break;
case '2': mostrar_no_cap(lista);
break;
case '3': mostrar(lista);
break;
}
}else
cout<<"LISTA VACIA";
}
void mostrar(tlista lista){
pnodo i;
for(i=lista.inicio;i!=NULL;i=i->sig)
cout<<i->dato.palab<<"-->"<<i->dato.lon<<endl;
}
void mostrar_cap(tlista lista){
pnodo i;
for(i=lista.inicio;i!=NULL;i=i->sig)
if(capicua(i->dato)==true)
cout<<i->dato.palab<<"-->"<<i->dato.lon<<endl;
}
void mostrar_no_cap(tlista lista){
pnodo i;
for(i=lista.inicio;i!=NULL;i=i->sig)
if(capicua(i->dato)==false)
cout<<i->dato.palab<<"-->"<<i->dato.lon<<endl;
}