Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    23

    esercizio LIFO programmazione C Aiutoooooo

    Ciao a tutti....Sto impazzendo con un es. d'esame... mi chiede di creare due liste (in un certo modo)....e qui ci sono...dopodichè devo creare una funzione che modifica la prima lista L1 in modo che incorpori anche gli elementi della seconda lista L2 secondo il seguente criterio:
    -Si parte dalla lista L1 e si collegano ordinatamente gli elementi di L2 in modo da alternare un elemento di L1 con un elemento di L2.
    Cioè se:
    L1 = 1, 2, 3, 4.
    L2 = 7, 8, 9, 10.
    Dopo la modifica sarà L1 = 1 , 7, 2, 8, 3, 9, 4, 10.

    Ok solo che il testo mi da delle restrizioni. IL PROBLEMA E' CHE NON POSSO ALLOCARE NUOVO SPAZIO DOPO LA CREAZIONE DELLE 2 LISTE. Altrimenti potrei allocare spazio per ogni elemento e fare l'inserimento.
    E non posso neppure creare una terza lista.
    Vi prego ditemi che avete la soluzione............
    :berto:

  2. #2
    Utente di HTML.it L'avatar di MrX87
    Registrato dal
    Jun 2007
    Messaggi
    500
    ehi ciao...ho fato uno sguardo e direi che per quanto riguarda il problema :
    "NON POSSO ALLOCARE NUOVO SPAZIO DOPO LA CREAZIONE DELLE 2 LISTE" bhè basta che tu inserisci gli elementi della seconda lista tra quelli della prima!! fai solo degli scambi di puntatori...in questo modo dovresti riuscire anche a risolvere il secondo problema, ovvero che non devo creare una terza lista!
    se non mi sono spiegato bene o se non è quello che t serviva fammi sapere!
    ciao
    "Non può piovere per sempre" Il Corvo
    Forza Vigor!

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304

    Moderazione

    @mawjuve: leggi bene il regolamento del forum. Il titolo non era affatto conforme. L'ho aggiustato io. In secondo luogo, posta un po' di codice che permetta agli altri di capire dove sbagli/hai problemi.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  4. #4
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    23
    Ciao ,scusate per gli errori sono nuovo del forum...cercherò di non fare più errori...Grazie per la disponibilità...
    Allora il codice è questo....il problema si trova nella funzione modifica....mi da l errore:
    <cannot convert 'L1*' to 'L2*'>..... Come se non potessi interagire tra puntatori di diverse liste....Penso sia l'idea che ha avuto MrX87.... se nn sbaglio ..
    Ecco il codice:
    codice:
     #include <stdio.h>
    #include <malloc.h>
    #include <stdlib.h>
    #define N 30
    typedef struct l1{                   //DICHIARAZIONE STRUTTURE
    			         int info;
                      struct l1 *next;
                      }*p;
    typedef struct l1 L1;
    
    typedef struct l2{
    			         int info;
                      struct l2 *next;
                      }*q;
    typedef struct l2 L2;
    
    L1 *crea_lista1(L1*,int);              //PROTOTIPI
    L2 *crea_lista2(L2*,int);
    void stampa(L1*);
    void stampa(L2*);
    L1*modifica(L1*,L2*);
    
    
    main(){                     //MAIN
    
    L1*inizio1=NULL,*aux1;
    L2*inizio2=NULL,*aux2;
    int somma=0;
    srand(time(NULL));
    
    do{
    inizio1=crea_lista1(inizio1,rand()%20);
    aux1=inizio1;
    
    inizio2=crea_lista2(inizio2,rand()%20);
    aux2=inizio2;
    
    somma+=aux1->info+aux2->info;}
    while(somma<N);                   //CONTROLLO
    
    printf("Somma = %d  \n",somma);
    stampa(inizio1);
    stampa(inizio2);
    
    modifica(inizio1,inizio2);
    stampa(inizio1);
    
    
    free(inizio1);
    free(inizio2);
    fflush(stdin);
    getchar();
    }                                //FINE MAIN
                                             //IMPLEMENTAZIONE FUNZIONI
    L1 *crea_lista1(L1*inizio,int dato)      //CREA LIFO L1
    {
     L1*p;
     p=(L1*)malloc(sizeof(L1));
     p->info=dato;
     p->next=inizio;
     return(p);
     }
    
    L2 *crea_lista2(L2*inizio,int dato)      //CREA LIFO L2
    {
     L2*q;
     q=(L2*)malloc(sizeof(L2));
     q->info=dato;
     q->next=inizio;
     return(q);
     }
    
    void stampa(L1*inizio)                //STAMPA L1
    { printf("La lista L1 =\n");
     while(inizio)
     {
      printf(" %d ",inizio->info);
      inizio=inizio->next;
      }printf("\n");
    }
    
    void stampa(L2*inizio)                //STAMPA L2
    {
     printf("La lista L2 =\n");
     while(inizio)
     {
      printf(" %d ",inizio->info);
      inizio=inizio->next;
      }printf("\n");
    
    }
    
     L1*modifica(L1*inizio1,L2*inizio2)        //MODIFICA L1
    {
     L1 *aux1=inizio1;
     L2 *aux2=inizio2;
    
     inizio2=inizio2->next;
     aux1=aux1->next;
     aux2->next=aux1;
     inizio1->next=aux2;
    
    
     aux2=inizio2;
    
     return(inizio1);       }

  5. #5
    Utente di HTML.it L'avatar di MrX87
    Registrato dal
    Jun 2007
    Messaggi
    500
    si ma se devi fare due liste uguali...perchè fare 2 strutture diverse?!?!? cioè perchè fare questo:
    codice:
    typedef struct l1{                   //DICHIARAZIONE STRUTTURE
    			         int info;
                      struct l1 *next;
                      }*p;
    typedef struct l1 L1;
    
    typedef struct l2{
    			         int info;
                      struct l2 *next;
                      }*q;
    typedef struct l2 L2;
    non è più logico fare così:
    codice:
    typedef struct lista {               
    			         int info;
                      struct lista *next;
                      }Ls;
    int main ()
    {
        Ls *head1, *head2;
        head1 = NULL;
        head2 = NULL;
        .........
        .........
        return 0;
    }
    in questo modo fai una sola struttura però poi nel main fai due puntatori alla stessa struttura...e quindi è come se avessi 2 liste...che però possono contenere le stesse informazioni....in questo modo puoi interaggire con le 2 liste e fare i cambiamenti dei puntatori tra head1 e head2!!
    spero di essermi spiegato abbastanza bene...se ci sono dubbi o se non è una buona soluzione, fammi sapere...ciao
    "Non può piovere per sempre" Il Corvo
    Forza Vigor!

  6. #6
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    23
    Grazie....Era un mio dubbio....sono alle prime armi, non sapevo se e come potesse fare... tra qualche minuto provo a modificare il programma....e metto il codice..... Sicuramente mi hai risolto il problema.....Grazie!!

  7. #7
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    23
    L'ho corretto in questo modo...dovrebbe essere giusto....spero...grazie mille....alla proxima

    codice:
    #include <stdio.h>
    #include <malloc.h>
    #include <stdlib.h>
    #define N 150
    typedef struct lista {               
    			         int info;
                      struct lista *next;
                      }Ls;
    
    
    
    Ls *crea_lista(Ls*,int);              //PROTOTIPI
    
    void stampa(Ls*);
    Ls*modifica(Ls*,Ls*);
    
    
    main(){                     //MAIN
    
    Ls*inizio1=NULL,*aux1;
    Ls*inizio2=NULL,*aux2;
    int somma=0;
    srand(time(NULL));
    
    do{
    inizio1=crea_lista(inizio1,rand()%20);
    aux1=inizio1;
    
    inizio2=crea_lista(inizio2,rand()%20);
    aux2=inizio2;
    
    somma+=aux1->info+aux2->info;
    }
    while(somma<N);                   //CONTROLLO
    
    printf("\nL1 : ");
    stampa(inizio1);
    printf("\nL2 : ");
    stampa(inizio2);
    
    
    modifica(inizio1,inizio2);
    
    printf("\nLa lista L1 modificata :\n");
    stampa(inizio1);
    
    
    free(inizio1);
    free(inizio2);
    fflush(stdin);
    getchar();
    }                                //FINE MAIN
                                             //IMPLEMENTAZIONE FUNZIONI
    Ls *crea_lista(Ls*inizio,int dato)      //CREA LIFO L1
    {
     Ls*p;
     p=(Ls*)malloc(sizeof(Ls));
     p->info=dato;
     p->next=inizio;
     return(p);
     }
    
    void stampa(Ls*inizio)                //STAMPA L1
    {
     while(inizio)
     {
      printf(" %d ",inizio->info);
      inizio=inizio->next;
      }printf("\n");
    }
    
    
     Ls*modifica(Ls*inizio1,Ls*inizio2)        //MODIFICA L1
    {
     Ls *aux1=inizio1;
     Ls *aux2=inizio2;
    
     do{inizio2=inizio2->next;
    
        aux2->next=aux1->next;
        aux1->next=aux2;
    
        aux2=inizio2;
        aux1=aux1->next->next;
        }while(inizio2!=NULL);
    
     return(inizio1);       }

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.