Visualizzazione dei risultati da 1 a 3 su 3

Discussione: [C] ordinare liste

  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    9

    [C] ordinare liste

    Non funziona la funzione ordina! qualcuno può aiutarmi?

    codice:
    # include <stdlib.h>
    # include <stdio.h>
    
    typedef struct nodo *lista;
    typedef struct nodo {
            int val;
            lista next;
            }nodo;
            
    lista leggiLista (void);
    lista ordina(lista L);
    void stampaLista (lista L);
    
    int main (void)
    {
        lista lis;
        lis=leggiLista();
        stampaLista(lis);
        lis=ordina(lis);
        stampaLista(lis);
        system("PAUSE");
        return 0;
    }
    
    
    lista leggiLista (void)
    {
          lista N,L=NULL;
          int val;
          while (1)
          {
                printf("inserisci valore: ");
                scanf("%d",&val);
                if (val==0) break;
                 N=(nodo *)malloc (sizeof(nodo));
                if(!N)
                    {
                       printf("non c'è spazio");
                       break;
                    }
              N->val=val;
              N->next=L;
              L=N;
          }
          return L;
    }
    
    
    lista ordina (lista L)
    {
        int valore;
        nodo *temp;
        temp=L->next;
        while(temp!=NULL)
        {
           if(L->val>temp->val)
           {
              valore=L->val;
              L->val=temp->val;
              temp->val=valore;
           }
           temp=temp->next;
        }
        return L;
    }
        
        
    
    void stampaLista (lista L)
    {
          while(L!=NULL)
          {
          printf("\n%d\n",L->val);
          L=L->next;
          }
          printf("----------------------------");
    }

  2. #2
    Utente di HTML.it L'avatar di MrX87
    Registrato dal
    Jun 2007
    Messaggi
    500
    Ciao, ho dato un'occhiata al codice e ho notato che comunque nel tuo confronto per ordinare( nella funzione ordina) fai scorrere solo un puntatore e confronti tutti i numeri sempre con il primo della lista!
    codice:
      if(L->val>temp->val)
    nella funzione ordina L non viene mai modificato, quindi confronti tutti i valori della lista con il primo elemento!
    Comunque ho provato ad abbozzare un altro metodo che assomiglia ad un selection sort adattato ad una lista!
    Posto il codice qua sotto...se ci sono problemi chiedi pure!
    Ciao

    codice:
    # include <stdlib.h>
    # include <stdio.h>
    
    typedef struct nodo *lista;
    typedef struct nodo {
            int val;
            lista next;
            }nodo;
    
    lista leggiLista (void);
    lista ordina(lista L);
    void stampaLista (lista L);
    nodo* find_min ( nodo *p );
    
    int main (void)
    {
        lista lis;
        lis=leggiLista();
        stampaLista(lis);
        lis=ordina(lis);
        stampaLista(lis);
        return 0;
    }
    
    
    lista leggiLista (void)
    {
          lista N,L=NULL;
          int val;
          while (1)
          {
                printf("inserisci valore: ");
                scanf("%d",&val);
                if (val==0) break;
                 N=(nodo *)malloc (sizeof(nodo));
                if(!N)
                    {
                       printf("non c'è spazio");
                       break;
                    }
              N->val=val;
              N->next=L;
              L=N;
          }
          return L;
    }
    
    
    lista ordina (lista L)
    {
        int valore;
        nodo *temp;
        nodo *p1, *p2;
        p1 = L;
        while(p1!=NULL)
        {
           temp = find_min ( p1 );
    
           if ( p1->val != temp->val ) {
                valore = p1->val;
                p1->val = temp->val;
                temp->val = valore;
           }
           p1 = p1->next;
        }
        return L;
    }
    
    nodo* find_min ( nodo *p )
    {
        nodo* tmp_min;
        nodo* p_index;
        int min = p->val;
        p_index = p->next;
        tmp_min = p;
        while ( p_index != NULL ) {
            if ( p_index->val < min ) {
                    tmp_min = p_index;
                    min = p_index->val;
            }
            p_index = p_index->next;
        }
        return tmp_min;
    }
    
    
    
    void stampaLista (lista L)
    {
          while(L!=NULL)
          {
          printf("\n%d\n",L->val);
          L=L->next;
          }
          printf("----------------------------");
    }
    "Non può piovere per sempre" Il Corvo
    Forza Vigor!

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    9
    grazie mille! avevi ragione, confrontavo sempre con il primo..
    grazie ancora!
    ciao

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.