PDA

Visualizza la versione completa : [C] Liste: come incorporare una lista in un'altra senza allocare altro spazio


mawjuve
26-06-2009, 00:49
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............
:dhò: :berto: :dhò:

MrX87
26-06-2009, 01:32
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

LeleFT
26-06-2009, 09:32
@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. :ciauz:

mawjuve
26-06-2009, 11:55
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:

#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); }

MrX87
26-06-2009, 14:08
si ma se devi fare due liste uguali...perchè fare 2 strutture diverse?!?!? cioè perchè fare questo:


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ì:


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

mawjuve
26-06-2009, 14:29
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!! :ciauz: :yuppi:

mawjuve
26-06-2009, 15:31
L'ho corretto in questo modo...dovrebbe essere giusto....spero...grazie mille....alla proxima :yuppi: :ciauz: :ciauz:


#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); }

Loading