Listas simples ligadas con encabezado

Listas Simples ligadas con encabezado"
-Estoy tratando de hacer un programa que ma hacepte como entrada los dias de la semana y su temperatura, y mostrar cual fue el dia mas caluroso y mas frio.
-Te mando mi programa para que si tienes tiempo lo revises y me puedas ayudar para corregirlo, tambien si me pudieras mandar algun ejemplo de este tema te lo agradeceria mucho, bueno eso es todo espero me puedas ayudar con esto y gracias por todo.
#include"conio.h"
#include"stdio.h"
#include"alloc.h"
#define OK 0
#define ERROR -1
#define true 1
#define false 0
typedef char tipoElemento;
typedef int boolean;
typedef struct nodo{
tipoElemento dato;
struct nodo *sig;
}*tipoNodo;
int Inicializa(tipoNodo *lista){
*lista=(tipoNodo)malloc(sizeof(struct nodo));
(*lista)->dato=0;
(*lista)->sig=NULL;
return OK;
}
boolean Vacia(tipoNodo lista){
if(lista->sig==NULL)
return true;
return false;
}
int Imprime(tipoNodo lista){
tipoNodo aux;
if(Vacia(lista))
return ERROR;
aux=lista;
while(aux->sig!=NULL){
aux=aux->sig;
printf("%i",aux->dato);
}
return OK;
}
int Anula(tipoNodo lista){
tipoNodo aux1,aux2;
if(Vacia(lista))
return ERROR;
while(!Vacia(lista)){
aux1=lista;
aux2=aux1->sig;
while(aux2->sig!=NULL){
aux1=aux2;
aux2=aux2->sig;
}
free(aux2);
aux1->sig=NULL;
}
return OK;
}
int Suprime(tipoNodo p,tipoNodo lista){
tipoNodo aux;
if(Vacia(lista))
return ERROR;
aux=lista;
while(aux->sig!=p)
aux=aux->sig;
aux=aux->sig=p->sig;
free(p);
return OK;
}
int Inserta(tipoElemento x,tipoNodo p,tipoNodo lista){
tipoNodo aux;
if(p==NULL)
return ERROR;
aux=(tipoNodo)malloc(sizeof(struct nodo));
if(aux==NULL)
return ERROR;
aux->dato=x;
aux->sig=p->sig;
p->sig=aux;
return OK;
}
tipoNodo Primero(tipoNodo lista){
if(Vacia(lista))
return NULL;
return lista->sig;
}
tipoNodo Ultimo(tipoNodo lista){
tipoNodo aux=lista;
if(Vacia(lista))
return NULL;
while(aux->sig!=NULL)
aux=aux->sig;
return aux;
}
void main(){
int opc,sprmr;
float temp;
char dia[15];
clrscr();
printf("\nQue deseas hacer:\n\t1-Insertar\n\t2-Suprimir\n\t3-Imprimir");
scanf("%i",&opc);
switch(opc){
case 1:
printf("\nIntroduce el dia\n_");
scanf("%s",&dia);
printf("\nIntroduce la temperatura en grados Centigrados\n_");
scanf("%f ",&temp);
Inserta();
break;
case 2:
printf("\n¿Que elemento deseas Eliminar?\n");
scanf("%i",&sprmr);
Suprime();
break;
case 3:
Imprime();
break;
default
printf("Opcion Incorrecta\n");
}
}
Respuesta
1
En primer lugar, deberías de definir una estructura con más campos:
typedef struct nodo {
char dia;
int temperatura;
}
El metodo de crear nodo:
void nuevoNodo( nodo **nodo, char dia, int temperatura){
*nodo = ( nodo * ) malloc ( sizeof ( nodo ) );
if ( *nodo == NULL ) return;
(*nodo)->dia = dia;
(*nodo)->temperatura = temperatura;
}
Ahora el de eliminar por posicion:
void eliminaPorPosicion( int posicion , nodo **cabeza ) {
int posicionActual = 0;
nodo *actual,*anterior;
int eliminado = 0;
actual = *cabeza;
anterior = actual;
while ( actual != NULL && !eliminado ) {
if ( posicionActual == posicion ) {
if ( actual == *cabeza )
*cabeza = (*cabeza)->siguiente;
else
anterior->siguiente = actual->siguiente;
free(actual);
eliminado = 1;
}
anterior = actual;
actual = actual->siguiente;
}
}
El de insertar:
void insertarNuevoNodo ( char dia, int temperatura , nodo **cabeza ) {
nodo *nuevo , *actual;
nuevoNodo ( &nodo , dia, temperatura );
if ( nuevo == NULL ) return;
*actual = *cabeza;
while ( actual->siguiente == NULL ) actual = actual->siguiente;
if ( actual == *cabeza ) (*cabeza)->siguiente=nuevo;
else actual->siguiente=nuevo;
}
El de vacio
int vacio ( nodo *cabeza ) {
if ( cabeza == NULL ) return 1;
return 0;
}
EL de imprime
void imprime ( nodo *cabeza ) {
nodo *actual;
actual = cabeza;
while ( actual != NULL ) {
printf ( "DIA: %c - TEMPERATURA: %d\n", actual->dia,
actual->temperatura);
actual = actual->siguiente;
}
}
Y ya esta, lo de q solo te permita meter los dias de la semana:
char semana = { 'l' , 'm' , 'x' , 'j' , 'v' , 's' , 'd' };
char dia[2];
int correcto = 0 ,i, temperatura;
while ( !correcto ) {
printf ( " Dame el dia de la semana: " );
scanf ( "%s", dia );
dia = toLower( dia ); // En ctypes.h , creo
for (i =0;i<6;i++) {
if ( dia[0]== semana) {
correcto=1;
break;
}
}
}
correcto = 0;
while ( !correcto ) {
printf ( "Dame la temperatura: ");
scanf ("%d",&temperatura);
if ( temperatura > -100 && temperatura < 100 ) correcto = 1;
}
Para ver cual es el más caluroso o el más frio, lo único que tienes que hacer es recorrer la lista e ir guardando los valores más altos o los más fríos.
Es fácil, si encuentras un valor más alto que la temperatura más alta, pues la cambias y lo mismo para la más fría.

1 respuesta más de otro experto

Respuesta
1
Te envio la solucion a tu problema en
"c++ estructurado"
#include <iostream.h>
#include <string.h>
#include <conio.h>
struct nodo{
char dia[10];
float temperatura;
nodo *siguiente;
}*inicio;
int insertar(char *d, float temp){
struct nodo *nuevo;
struct nodo *p;
struct nodo *q;
nuevo = new nodo;
strcpy(nuevo->dia,d);
nuevo->temperatura = temp;
nuevo->siguiente = NULL;
if (inicio == NULL){
inicio = nuevo;
return 1;
};
p = inicio;
q = p->siguiente;
if (strcmp(p->dia,d) == 0)
return 0;
while (q != NULL){
if (strcmp(q->dia,d) == 0)
return 0;
p = q;
q = q->siguiente;
}
p->siguiente = nuevo;
return 1;
}
int eliminar(char *d){
struct nodo *p;
struct nodo *q;
if (inicio == NULL)
return 0;
if (strcmp(inicio->dia, d)==0){
inicio = NULL;
return 1;
}
p = inicio;
q = p->siguiente;
while (q != NULL){
if (strcmp(q->dia,d) == 0){
p->siguiente = q->siguiente;
delete q;
return 1;
}
else{
p = q;
q = q->siguiente;
}
}
return 0;
}
void mostrar(){
struct nodo *p;
struct nodo *q;
if (inicio == NULL){
cout << "NO EXISTEN NODOS";
}else{
p = inicio;
q = p->siguiente;
while (p != NULL){
cout << "DIA: " << p->dia << "\n";
cout << "TEMPERATURA: " << p->temperatura << "\n\n";
p = q;
if (q != NULL)
q = q->siguiente;
}
}
}
int caluroso(){
char auxd[10];
float auxt;
if (inicio == NULL)
return 0;
if (inicio->siguiente == NULL){
cout << "DIA MAS CALUROSO: " << inicio->dia << "\n";
cout << "TEMPERATURA: " << inicio->temperatura << "\n";
return 1;
}
struct nodo *p;
struct nodo *q;
p = inicio;
strcpy(auxd,p->dia);
auxt = p->temperatura;
q = p->siguiente;
while (q!=NULL){
p = q;
q = q->siguiente;
if(auxt < p->temperatura){
strcpy(auxd,p->dia);
auxt = p->temperatura;
}
}
cout << "DIA MAS CALUROSO: " << auxd << "\n";
cout << "TEMPERATURA: " << auxt << "\n";
return 1;
}
int frio(){
char auxd[10];
float auxt;
if (inicio == NULL)
return 0;
if (inicio->siguiente == NULL){
cout << "DIA MAS FRIO: " << inicio->dia << "\n";
cout << "TEMPERATURA: " << inicio->temperatura << "\n";
return 1;
}
struct nodo *p;
struct nodo *q;
p = inicio;
strcpy(auxd,p->dia);
auxt = p->temperatura;
q = p->siguiente;
while (q!=NULL){
p = q;
q = q->siguiente;
if(auxt > p->temperatura){
strcpy(auxd,p->dia);
auxt = p->temperatura;
}
}
cout << "DIA MAS FRIO: " << auxd << "\n";
cout << "TEMPERATURA: " << auxt << "\n";
return 1;
}
void main(){
int opcion;
char dia[15];
float temp;
inicio = NULL;
do{
clrscr();
cout << " MENU PRINCIPAL \n\n\n";
cout << "1: INGRESAR NODO: \n";
cout << "2: ELIMINAR NODO: \n";
cout << "3: MOSTRAR NODO: \n";
cout << "4: MAYOR TEMPERATURA: \n";
cout << "5: MENOR TEMPERATURA: \n";
cout << "6: SALIR: \n\n";
cout << "INGRESE UNA OPCION :";
cin >> opcion;
switch(opcion){
case 1: clrscr();
cout << "DIGITE EL DIA: ";
cin >> dia;
cout << "DIGITE LA TEMPERATURA: ";
cin >> temp;
if(!insertar(dia, temp)){
cout << "ERROR: DIA YA HA SIDO INGRESADO";
}else{
cout << "DIA INGRESADO";
}
cout << "\nPresione una tecla para regresar al menu";
getch();
break;
case 2: clrscr();
cout << "DIGITE EL DIA A ELIMINAR: ";
cin >> dia;
if (!eliminar(dia)){
cout << "ERROR: NO SE HA INGRESADO EL DIA";
}else{
cout << "DIA ELIMINADO";
}
cout << "\nPresione una tecla para regresar al menu";
getch();
break;
case 3: clrscr();
mostrar();
getch();
break;
case 4: clrscr();
if(!caluroso()){
cout << "NO HAY NODOS";
}
cout << "\nPresione una tecla para regresar al menu";
getch();
break;
case 5: clrscr();
if(!frio()){
cout << "NO HAY NODOS";
}
cout << "\nPresione una tecla para regresar al menu";
getch();
break;
}
}while (opcion != 6);
}

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas