Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2015
    Messaggi
    5

    [c++]Urgente:Mediana Lista

    salve a tutti
    ho un banalissimo problema ma non so proprio come fare: devo scrivere una funzione che calcoli la mediana di una lista di interi acquisiti da tastiera.

    Ora questa è la mia lista:
    codice:
    struct lista{       int num;
           struct lista *next;
           };
    Dopo aver creato una funzione di inserimento ordinato(testata e funzionante) ne devo creare un'altra che faccia la mediana degli elementi che ho in lista e mi dovete credere no mi viene proprio.
    Se non mi sbaglio per la mediana bisogna vedere se la lunghezza della lista è pari o dispari

    Comunque ho bisogno di qualche anima pia che mi faccia vedere cortesemente com'è questa funzione

    Grazie in anticipo per l'attenzione

  2. #2
    Non ho capito dove stia il problema... hai la lista già ordinata, sai quanti elementi ci sono in tutto, la mediana è l'n/2 esimo elemento della lista - basta scorrerla contando a che elemento sei arrivato...
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Volere il codice e con urgenza non è una cosa carina ...

    Possiamo partire dal codice che hai tentato di scrivere tu?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2015
    Messaggi
    5
    Mi sono espresso male pardon!
    L'urgenza era perchè ce l'avevo tra e mani e non volevo riprenderlo una seconda volta!

    codice:
    #include <stdio.h>#include <stdlib.h>
    
    
    struct lista{
           int num;
           struct lista *next;
           };
           
           struct lista *primo;
           void inserisci(void);
           void stampa (void);
           void media(void);
    
           
           int main(){
            
               int scelta;
               printf("inserisci un operazione da fare\n");
               for(;;){
                       printf("1) inserisci\n2)stampa\n3)media\n");
                       scanf("%d", &scelta);
                       switch(scelta){
                                      case 1 : inserisci();break;
                                      case 2: stampa(); break;
                                      case 3: media(); break;
                                      case 4 : return 0;
                                      default : printf("scelta errata\n");
                                      }
    
    
           }
           }
    
    
    void inserisci(){
         int n;
         struct lista *pre,*cur,*nuovo;
         printf("inserisci un num\n");
         scanf("%d", &n);
         for (pre=NULL,cur=primo;cur != NULL && n>=cur->num;pre=cur,cur =cur->next){
             if(n==cur->num){
                             cur->cnt++;
                             return;
                             }
             }
             nuovo=(struct lista*)malloc(sizeof(struct lista));
             nuovo->num=n;
             nuovo->cnt=1;
             nuovo->next=cur;
             if(pre==NULL){
                           primo=nuovo;
                           }
             else{
                  pre->next=nuovo;
                  }
                  }
         
    void stampa(){
         struct lista *p;
         
         for(p=primo;p!=NULL;p=p->next){
                                        printf("\n%d\n", p->num);
                                        }
         }
    
    
    void media(){
         struct lista *p;
         int somma=0;
         int nu=0;
         int med=0;
         printf("\n");
         for(p=primo;p!=NULL;p=p->next){
                                     somma = somma + p->num;
          nu = nu + 1;
          }
                                    
         med=(somma/nu);
         printf("%d\n", med);
    }
    Questo è il codice completo, manca la funzione che dovrebbe darmi a mediana.

    Dovrei scorrermi la lista e farmi dare l'elemento lunghezza/2 ma non mi viene l'algoritmo perchè la lunghezza potrebbe essere anche dispari

    Grazie per le risposte
    Ultima modifica di Arjen10; 09-07-2015 a 14:23

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    E se viene dispari che cambia?

    Intanto scrivi il codice che scorre la lista dall'inizio alla fine ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2015
    Messaggi
    5
    La lista la scorro col ciclo for come nelle funzioni di media e stampa.
    Se ha elementi dispari posso individuare la mediana, ad esempio se ho 5 elementi la mediana dovrebbe essere il terzo, mentre in una lista pari?

  7. #7
    Non c'è una risposta definita, dipende da come definisci mediana... puoi o dare un messaggio di errore se è pari, o stampare uno dei due elementi centrali a tua scelta (rispettivamente, in posizione lunghezza/2 e lunghezza/2+1), o stamparli entrambi...
    Amaro C++, il gusto pieno dell'undefined behavior.

  8. #8
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Quote Originariamente inviata da MItaly Visualizza il messaggio
    Non c'è una risposta definita, dipende da come definisci mediana... puoi o dare un messaggio di errore se è pari, o stampare uno dei due elementi centrali a tua scelta (rispettivamente, in posizione lunghezza/2 e lunghezza/2+1), o stamparli entrambi...
    Oppure fare la media aritmetica degli elementi in posizione lunghezza/2 e lunghezza/2+1.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  9. #9
    Anche... comunque, il punto è che non è un problema relativo all'algoritmo, quanto allo scegliere una convenzione che sia quella per il caso "strano".
    Amaro C++, il gusto pieno dell'undefined behavior.

  10. #10
    Utente di HTML.it
    Registrato dal
    Feb 2015
    Messaggi
    5
    Vi ringrazio per le delucidazioni
    Ora a prescindere dal pari o dispari, come accedo all'elemento di una lista in posizione lunghezza/2?
    Riusare un nuovo ciclo for per scorrere nuovamente gli elementi della lista da capo?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.