ciao
ho un vettore di puntatori a liste....dovrei concatenarle in una nuova lista!! come posso fare???? aiutatemi x favore......
ciao
ho un vettore di puntatori a liste....dovrei concatenarle in una nuova lista!! come posso fare???? aiutatemi x favore......
ho fatto questo....
ma non funziona!!!!dovè l'inghippo?codice: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; }
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?
ke vuoi dire? la memoria viene allocata all'interno delle due funzioni copy e newconc....o sbaglio?
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
è 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??
scusa ho incollato male....te lo rimando:
ke ne pensi?codice: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); } }