Problema inserimento di elementi in ordine in una lista

di il
2 risposte

Problema inserimento di elementi in ordine in una lista

Salve a tutti, mi stavo esercitando sulle liste ma non riesco a risolvere un problema che mi si e' presentato. Come avrete intuito dal titolo devo inserire degli elementi(interi) in maniera crescente in una lista data. Io ho provato a fare questo programma che funziona se l'elemento da inserire è maggiore del primo della lista. Tuttavia non funziona se l'elemento è minore, cioè non mi inserisce il numero e mi stampa la lista così come è. Il problema dovrebbe riguardare il primo if della funzione "inserimento_in_ordine".Se può essere d'aiuto ho visto che se stampo la parte relativa all'if allora stampa bene ma così come è posta non va. Qualcuno ha idea da cosa potrebbe dipendere?
Grazie in anticipo a chi mi risponderà.


typedef struct s_node
{
    int info;
    struct s_node* next;
}t_nodo;

typedef t_nodo *p_nodo;



typedef struct s_lista    ///contiene puntatore a testa e numero degli elemnti
{
    p_nodo testa;
    int N;  ///numero di elementi
}t_lista;



t_lista crea_lista()
{
    t_lista ris;
    ris.N=0;
    ris.testa=NULL;
    return ris;
}


t_lista aggiungi_testa(t_lista lista,int valore)
{
    p_nodo nuovo;

    nuovo=malloc(sizeof(t_nodo));
       if(nuovo==NULL)
       {
          printf("errore di allocazione\n\n");
          exit(1);
       }
    nuovo->info=valore;
    nuovo->next=lista.testa;
    lista.testa=nuovo;
    lista.N++;

    return lista;
}



void stampa_lista(t_lista l)
{
    p_nodo p1;
    p1=l.testa;

    while(p1!=NULL)
    {
        printf("%d--> ",p1->info);
        p1=p1->next;
    }
    printf("NULL\n");
}

t_lista inserimento_in_ordine(t_lista lista,int val)
{
    p_nodo p,p1,p2;
    p=malloc(sizeof(t_nodo));
    p->info=val;
    p->next=NULL;

    if(lista.testa==NULL || ((lista.testa)->info)>val)
    {
        p->next=lista.testa;
        lista.testa=p;
        return lista;

        //stampa_lista(lista);
    }
    else
    {
        p1=lista.testa;
        p2=lista.testa->next;

       while(p2!=NULL && (p2->info<val))
      {
          p1=p2;
          p2=p2->next;
      }

      p1->next=p;
      p->next=p2;
      return lista;
      //stampa_lista(lista);
    }
    lista.N++;
}


int main()
{
   srand(time(NULL));
    int val,i=0,a;
    t_lista l;

    l=crea_lista();
    printf("quanti numeri vuoi inserire nella lista?\n");
    scanf("%d",&val);

     for(i=0;i<val;i++)
        l=aggiungi_testa(l,rand()%30+1);

      stampa_lista(l);
      
      printf("scrivi un elemento per inserirlo in ordine:\n");
      scanf("%d",&a);
 
      inserimento_in_ordine(l,a);
      stampa_lista(l);
      }
      

2 Risposte

Devi accedere o registrarti per scrivere nel forum
2 risposte