Esercizio su liste concatenate semplici [C]

di il
7 risposte

Esercizio su liste concatenate semplici [C]

Salve ragazzi,
è da diversi appelli che il mio professore di informatica inserisce un esercizio riguardante le liste in cui dice: date due liste concatenate L1 e L2 , creare una nuova lista L3 senza però creare nuova memoria, modificando quindi L1 e L2....
Non so come fare, parto con la ricorsione:

if(L1==NULL) return L2;
IF(L1==NULL) return L1;
else { .... }

e poi dall'ELSE in poi non riesco a procedere!

Alcuni esempi di tracce sono:
1)Date L1 e L2 creare L3 formato dall'alternanza di elementi di L1 e L2... (esempio L1-> 2 ->3, L2-> 8->9->10 e quindi L3->1->8->2->9->3->10) senza però creare memoria per L3 modificando solo le due liste date;

2)Date L1 e L2 (già ordinate in modo crescente) creare L3 ordinata fondendo le due liste (esempio L1-> 22 ->3, L2-> 8->->4->9->10 e quindi L3->1->3->4->8->9->10->22) senza però creare memoria per L3 modificando solo le due liste date;


Il problema è che non riesco a farlo senza creare L3 dinamicamente!!!!
Qualcuno saprebbe come svolgere esercizi di questa tipologia?
Grazie mille in anticipo!

7 Risposte

  • Re: Esercizio su liste concatenate semplici [C]

    Per evitare di allocare altra memoria (oltre a quella assegnata alle due liste)
    bisogna cambiare i valori dei puntatori presenti nei nodi delle due liste,
    generando una nuova concatenazione che risponda alle condizioni date.

    Propongo una soluzione per il primo caso (alternanza degli elementi delle liste).

    Questa e' la struct che rappresenta un nodo:
    
    
    struct nodo
     {
      int numero;
      struct nodo *p_prossimo;
     };
    
    
    Nel programma si trovano questi puntatori a struct di tipo nodo:

    p_lista_1, p_lista_2, che puntano al primo elemento di una lista;

    p_corrente_1, p_corrente_2, p1, p2, che sono puntatori supplementari.

    Ometto il codice per riempire le liste.

    La nuova concatenazione viene creata con questo segmento di codice:
    
    
    p_corrente_1=p_lista_1;
    p_corrente_2=p_lista_2;
    continua=1;
    do
      {
       if ((p_corrente_1!=NULL)&&(p_corrente_2!=NULL))
          {
           p1=p_corrente_1->p_prossimo;
           p_corrente_1->p_prossimo=p_corrente_2;
           p2=p_corrente_2->p_prossimo;
           if (p1!=NULL)
              {p_corrente_2->p_prossimo=p1;}
           p_corrente_1=p1;
           p_corrente_2=p2;
          }
       else
          {continua=0;}
      } while(continua==1);
    
    
    A questo punto, percorrendo la sequenza di nodi che parte da p_lista_1,
    si puo' visualizzare la nuova concatenazione:
    
    
    struct nodo *p_corrente;
    printf("\n\n%s", "Lista:  ");
    p_corrente=p_lista_1;
    while (p_corrente!=NULL)
      {
       printf("%d%s", p_corrente->numero, "   ");
       p_corrente=p_corrente->p_prossimo;
      }
    
    
    Sarebbe complicato spiegare a parole il funzionamento dell'algoritmo proposto.

    Si puo' capire meglio disegnando parallelamente su un foglio le due liste,
    secondo le usuali convenzioni che si trovano nei testi di informatica,
    e poi modificando a penna i collegamenti fra i nodi.
  • Re: Esercizio su liste concatenate semplici [C]

    
    for( LT = L1->next; LT->next != L1; LT = LT->next);
    LT->next =  L2;
    for( LT = L2->next; LT->next != L2; LT = LT->next);
    L2->next = L1;
    
    ...
  • Re: Esercizio su liste concatenate semplici [C]

    Ciao Ragazzi, innanzitutto grazie per le risposte!
    Purtroppo però in tutti i compiti ho il prototipo da seguire, ovvero:

    struct lista *funzione(struct lista *L1, struct lista *L2) {
    CODICE
    return (Che lista devo restituire?);
    }


    mi sapreste dire come completare? Scusate ancora il disturbo, ma non riesco a superare questo esame proprio per questa tipologia di quesiti.
  • Re: Esercizio su liste concatenate semplici [C]

    Ti ho già scritto il codice!
    Altrimenti dimmi la data dell'esame e vado io a fartelo.
  • Re: Esercizio su liste concatenate semplici [C]

    Magari! Ahah...
    Il codice che hai scritto l'ho capito...ma il return non lo devo usare?
  • Re: Esercizio su liste concatenate semplici [C]

    Il codice postato lega la lista L1 alla lista L2 diventando così un'unica lista!
    Ora sia che tu ritorni L1 o L2 il risultato non cambia, quindi fai il return che più ti pare e piace.
  • Re: Esercizio su liste concatenate semplici [C]

    Non avevo letto che andavano anche ordinate! io le ho solo concatenate, vabbhe procediamo un passo alla volta.
Devi accedere o registrarti per scrivere nel forum
7 risposte