Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    [C]Funzione per ordinare alfabeticamente una LISTA

    Salve a tutti! Sto studiando per un esame di Fondamenti di Informatica, e sono proprio alle prime armi con l'utilizzo del linguaggio C. Ho incontrato alcuni problemi con le liste: dopo tanti tentativi non riesco a capire come ordinare alfabeticamente una lista.
    Un esempio di codice che ho creato è questo, potreste indicarmi una soluzione,ad esempio una funzione di ordinamento??
    Vi ringrazio in anticipo per la disponibilità!

    codice:
    #include<stdio.h> 
    #include<stdlib.h> 
    #include<iostream>
     typedef struct { 
    int num; char nome[30]; 
    }Invitato; 
    
    struct InvitoFesta; 
    typedef InvitoFesta*PuntInvitoFesta;
    
     typedef struct InvitoFesta{ 
    Invitato invito;
     InvitoFesta *invitatoSuccessivo; 
    }InvitoFesta;
    
     InvitoFesta*inserisci(PuntInvitoFesta L,int i,char*testo){ 
    PuntInvitoFesta nuovo; 
    nuovo=(PuntInvitoFesta) malloc(sizeof(InvitoFesta));
     nuovo->invitatoSuccessivo=L;
     nuovo->invito.num=i; 
    strcpy(nuovo->invito.nome,testo);
     return (nuovo); 
    } 
    
    void stampaLista (PuntInvitoFesta L){
     PuntInvitoFesta nuovo; 
    nuovo=L; 
    
    while(nuovo!=NULL){ 
    printf("%s\n",nuovo->invito.nome);
     nuovo=nuovo->invitatoSuccessivo; 
    } 
    } 
    
    int main (){
     PuntInvitoFesta Lista;
     Lista=NULL;
     int i=1; 
    char text[20];
    
     printf("Inserisci invitato num. %d: \n",i); 
    printf("(digita fine per terminare)\n"); 
    scanf("%s",text); 
    
    while(strcmp(text,"fine")!=0){ 
    Lista=inserisci(Lista,i,text);
     printf("Inserisci invitato num. %d: \n",i); 
    printf("(digita fine per terminare)\n"); 
    scanf("%s",text); i++; 
    } 
    printf("\n"); 
    printf("Visualizzo Lista Invitati:\n"); 
    
    stampaLista(Lista); 
    free(Lista); 
    system("PAUSE");
     return 0; 
    }

  2. #2
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Cerca bubble sort su google, su wikipedia è spiegato abbastanza bene da ciò che ricordo...
    Prova a scrivere il codice e poi casomai posta se hai problemi.
    Alternativamente utilizza un inserimento ordinato...
    Scorri la lista finchè non ti trovi al punto giusto e poi inserisci l'elemento...
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  3. #3
    Utente di HTML.it L'avatar di goatboy
    Registrato dal
    Mar 2011
    residenza
    Salerno
    Messaggi
    408
    Infatti, anche io consiglio un inserimento ordinato, così ti eviti il dover adattare algoritmi di ordinamento al tuo problema.
    Per l'inserimento ordinato prima devi trovare la posizione in cui inserire (ti dovrebbe bastare un while) poi inserisci e infine aggiorni la catena dei collegamenti

  4. #4
    Per l'inserimento ordinato ci sto ancora lavorando, ora lo studio.
    Invece per quanto riguardo la il BubbleSort ho provato in questo modo. L'unica cosa è
    che l'ordinamento non è esattamente preciso...ma non riesco a capire dov'è l'errore!

    codice:
    void bubblesort(PuntInvitoFesta L){
     int i,j,n=0; //dove n è il numero degli elementi in lista
    char temp[30]; 
    PuntInvitoFesta cursore,precedente,successivo; 
    cursore=L; 
    
    while(cursore!=NULL){ 
    n++; //determino di quanti elementi è composta la lista
    cursore=cursore->invitatoSuccessivo;
     } 
    
     precedente=L; 
    successivo=L;
     successivo=successivo->invitatoSuccessivo; 
    
    for(i=0;i<=n-2;i++){
    
    for(j=0;j<=n-2;j++){
    
      if(precedente->invito.nome > successivo->invito.nome){
     //effettuo lo scambio
     strcpy(temp,precedente->invito.nome); 
    strcpy(precedente->invito.nome,successivo->invito.nome); 
    strcpy(successivo->invito.nome,temp); 
    } 
    } 
    precedente=successivo;
     successivo=successivo->invitatoSuccessivo; 
    } 
    }

  5. #5
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    Non ho visto se le condizioni nei for sono giuste,ma sicuramente due stringhe non le confronti così:

    codice:
    if(precedente->invito.nome > successivo->invito.nome)
    Così confronti solo due puntatori, e ti ricordo che sono indirizzi di memoria.Per cui la condizione sarà valutata come vera solo se il primo puntatore ha un indirizzo maggiore del secondo.
    Riprovaci usando la funzione strcmp.

  6. #6
    Giusto!Mi era completamente sfuggito! Ho corretto, e ho modificato anche le condizioni nei for. Ci sono casi in cui esegue l'ordine alfabetico e altri no, ma ancora non capisco perchè!

    codice:
    void bubblesort(PuntInvitoFesta L){
     int i,j,n=0;
    char temp[30];
     PuntInvitoFesta cursore,precedente,successivo; 
    cursore=L; 
    
    while(cursore!=NULL){ //mi determino di quanti elementi è fatta la lista 
    
    n++; 
    cursore=cursore->invitatoSuccessivo; 
    } 
     precedente=L; 
    successivo=L; 
    successivo=successivo->invitatoSuccessivo;
    
    for(i=0;i<n-1;i++){
              for(j=i+1;j<n;j++){ 
     if(strcmp(precedente->invito.nome,successivo->invito.nome)>0){ 
     strcpy(temp,precedente->invito.nome); 
    strcpy(precedente->invito.nome,successivo->invito.nome); 
    strcpy(successivo->invito.nome,temp); 
    } 
    } 
    precedente=successivo; 
    successivo=successivo->invitatoSuccessivo;
     } 
    }
    Ringrazio ancora per l'aiuto!

  7. #7
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Potrei sbagliarmi, ma per il count degli elementi n va inizializzato a 1 e non a 0! Tu parti già dal primo elemento, se inizializzi a zero è come tu non lo contassi...
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  8. #8
    No ho provato, ma mi si blocca l'esecuzione del programma!

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 © 2025 vBulletin Solutions, Inc. All rights reserved.