Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2007
    Messaggi
    43

    aiutatemi concatenamento liste in C

    ciao

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

  2. #2
    Utente di HTML.it
    Registrato dal
    Nov 2007
    Messaggi
    43
    ho fatto questo....

    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;
    }
    ma non funziona!!!!dovè l'inghippo?

  3. #3
    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?

  4. #4
    Utente di HTML.it
    Registrato dal
    Nov 2007
    Messaggi
    43
    ke vuoi dire? la memoria viene allocata all'interno delle due funzioni copy e newconc....o sbaglio?

  5. #5
    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

  6. #6
    Utente di HTML.it
    Registrato dal
    Nov 2007
    Messaggi
    43
    è 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??

  7. #7
    Utente di HTML.it
    Registrato dal
    Nov 2007
    Messaggi
    43
    scusa ho incollato male....te lo rimando:

    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);
            }
        }
    ke ne pensi?

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.