PDA

Visualizza la versione completa : [C] Concatenamento di liste


renton76
03-12-2007, 19:57
ciao

ho un vettore di puntatori a liste....dovrei concatenarle in una nuova lista!! come posso fare???? aiutatemi x favore......

renton76
03-12-2007, 20:07
ho fatto questo....



Node *copy(Node *l1)
{
Node *tmp,*tmp2;

if(l1==NULL) return NULL;
else
{
tmp = (Node *)malloc(sizeof(Node));
tmp->record = l1->record;
tmp2=tmp;
l1=l1->next;
while(l1!=NULL)
{
tmp = (Node *)malloc(sizeof(Node));
tmp = tmp->next;
tmp->record = l1->record;
l1=l1->next;
}
}
return tmp2;
}

Node *newconc(Node *l1, Node *l2)
{
Node *tmp, *last;

if(l1==NULL) return copy(l2);
else
{
last= (Node *)malloc(sizeof(Node));
tmp = last;
last->record = l1->record;
l1=l1->next;
while(l1!=NULL)
{
last = (Node *)malloc(sizeof(Node));
last = last->next;
last->record = l1->record;
l1=l1->next;
}
last->next=copy(l2);
}
return tmp;
}

void crea_templist()
{

Node *tmp=NULL;
int i;

for(i=0;i<hashTableSize;i++)
tmp=newconc(tmp,tmpHash[i]);

for(;tmp!=NULL;tmp=tmp->next)
{
printf("%s\n",&tmp->record.nome_job);
}
// return tmp;
}


ma non funziona!!!!dovè l'inghippo?

duonovembre
04-12-2007, 00:50
premetto che non ho letto bene il codice e che dato ke e' tardi potrei dire uno svarione:

ma non dovresti allocare memoria per node L1+ node L2 per poter concatenare L1 e L2 o reallocare memoria per la lista iniziale?

renton76
04-12-2007, 02:10
ke vuoi dire? la memoria viene allocata all'interno delle due funzioni copy e newconc....o sbaglio?

duonovembre
05-12-2007, 00:46
la struttura della tua lista e':

L1: |Elem1|Elem2|Elem3|... |ElemN|
stile array di elementi
oppure
Elem1 -> Elem2 -> Elem3..
ogni oggetto punta al seguente?

se e' la prima devi unire le due strutture allocando memoria per entrambe

se e' la seconda semplicemente l'ultimo tuo elemento deve puntare al primo della lista seguente

renton76
05-12-2007, 12:30
è la seconda....ma nn riesco a fare puntare l'ultimo della lista al primo dell'altra lista!!!

[code]

Node *testa=NULL;
Node *coda =NULL;
Node *t;

// prendo la testa della lista
for(i=0;i<hashTableSize;i++)
{
if(hashTable[i]!=NULL)
{
t = hashTable[i];

for(;t!=NULL;t=t->next)
{
Node *tmp;
if (( testa = tmp = malloc(sizeof(Node))) == 0) {
printf("Impossibile inserire memoria piena\n");
return;
}
tmp->record=t->record;
tmp->next=t->next;
coda = tmp;
break;

}
t = hashTable[i]->next;
for(;t!=NULL;t=t->next)
{
Node *tmp;
if ((tmp = malloc(sizeof(Node))) == 0) {
printf("Impossibile inserire memoria piena\n");
return;
}
tmp->record=t->record;
tmp->next=t->next;
printf("tmp1 = %s \n",tmp->record.nome_job);
coda = tmp;
}
j=i;
printf("testa = %s \n",testa->record.nome_job);
printf("coda = %s \n",coda->record.nome_job);
break;
}
}

// Continuo a costruire la lista
for(i=j+1;i<hashTableSize;i++)
{
if(hashTable[i]!=NULL)
{
t=hashTable[i];

for(;t!=NULL;t=t->next)
{

Node *tmp;
if (( tmp = malloc(sizeof(Node))) == 0) {
printf("Impossibile inserire memoria piena\n");
return;
}
if(coda->next == NULL){printf("Cambio lista\n");}//coda->next=tmp;} tmp->record=t->record;
printf("tmp2 = %s \n",tmp->record.nome_job);
tmp->next=t->next;
coda=tmp;
}
printf("testa = %s \n",testa->record.nome_job);
printf("coda2 = %s \n",coda->record.nome_job);
}
}
L'aggiornamento che dici tu dovrebbe avvenire nell'istruzione in grassetto...o no??

renton76
05-12-2007, 12:35
scusa ho incollato male....te lo rimando:




Node *testa=NULL;
Node *coda =NULL;
Node *t;

for(i=0;i<hashTableSize;i++)
{
if(hashTable[i]!=NULL)
{
printf("i= %d\n",i);
t = hashTable[i];

for(;t!=NULL;t=t->next)
{
Node *tmp;
if (( testa = tmp = malloc(sizeof(Node))) == 0) {
printf("Impossibile inserire memoria piena\n");
return;
}
tmp->record=t->record;
tmp->next=t->next;
coda = tmp;
break;

}
t = hashTable[i]->next;
for(;t!=NULL;t=t->next)
{
Node *tmp;
if ((tmp = malloc(sizeof(Node))) == 0) {
printf("Impossibile inserire memoria piena\n");
return;
}
tmp->record=t->record;
tmp->next=t->next;
printf("tmp1 = %s \n",tmp->record.nome_job);
coda = tmp;
}
j=i;
printf("testa = %s \n",testa->record.nome_job);
printf("coda = %s \n",coda->record.nome_job);
break;
}
}

// Continuo a costruire la lista
for(i=j+1;i<hashTableSize;i++)
{
if(hashTable[i]!=NULL)
{
t=hashTable[i];

for(;t!=NULL;t=t->next)
{

Node *tmp;
if (( tmp = malloc(sizeof(Node))) == 0) {
printf("Impossibile inserire memoria piena\n");
return;
}
if(coda->next == NULL){printf("Cambio lista\n");coda->next=tmp;} tmp->record=t->record;
printf("tmp2 = %s \n",tmp->record.nome_job);
tmp->next=t->next;
coda=tmp;
}
printf("testa = %s \n",testa->record.nome_job);
printf("coda2 = %s \n",coda->record.nome_job);
}
}




ke ne pensi?

Loading