Algoritmo fusione

di il
4 risposte

Algoritmo fusione

Premetto che sono nuovo del forum e non conosco bene come funziona.. dovrei scirvere una funzione C che realizza l'algoritmo di fusione su una lista collegata a puntatori, in ingresso ho due doppi puntatori ptrptr1 e ptrptr2 che puntano uno alla prima e uno alla seconda metà della lista, entrambe le parti sono ordinate. La lista finale deve essere generata su ptrptr1 senza utilizzare nuove allocazioni di memoria per lo spostamento.
Il mio problema è legato all'utlizzo dei puntatori, in particolare a come controllare gli elementi di ptrptr1 e quelli di ptrptr2 e all'inserimento senza nuova allocazione di memoria..
Spero che qualcuno possa essermi di aiuto!
Grazie

4 Risposte

  • Re: Algoritmo fusione

    Mi scuso ma mi sono dimenticato di mettere il programma che ho scritto io:

    #include <stdio.h>
    #include <stdlib.h>
    typedef unsigned int boolean;
    #define TRUE 1
    #define FALSE 0



    void main(void)
    {
    struct list {
    float value;
    struct list *next_ptr;
    };


    void merge(struct list *ptrptr1, struct list *ptrptr2)
    {

    while(ptrptr1->next_ptr!=ptrptr2 && ptrptr2!=NULL)
    {
    if(ptrptr1->value < ptrptr2->value)
    ptrptr1=ptrptr1->next_ptr;
    else
    {ptrptr1->next_ptr=ptrptr2;
    ptrptr2=ptrptr2->next_ptr;
    }
    printf("lista ordinata\n");
    }
    }
    return;
    }


    Vi sarei grato se potreste indicarmi gli errori e le eventuali correzioni
    Grazie
  • Re: Algoritmo fusione

    
    ptrptr1->next_ptr!=ptrptr2
    
    secondo me hai capito il problema male. Se la lista è unica e i due puntatori puntano alla stessa lista (già ordinata) non devi fare nessun spostamento. Se le liste sono due e tutte e due sono ordinate ma sono liste diverse allora puoi eseguire il merge ma non puoi fare quella comparazione che stai faccendo perche le due liste non appartengono ad una lista unica ma sono due distinte.
  • Re: Algoritmo fusione

    Il testo dell'esercizio è questo:
    Scrivere la funzione C che realizza l'algoritmo di fusione su una lista collegata con puntatori. La funzione riceve in ingresso due doppi puntatori ptrptr1 e ptrptr2,dove ptrptr1 punta alla prima metà della lista e ptrptr2 alla seconda metà della lista. Le due semi-liste puntate da ptrptr1 e ptrptr2 sono
    ordinate. La lista risultato ordinata deve essere puntata da ptrptr1 e deve essere generata spostando gli elementi delle due semi-liste senza utilizzare nuove allocazioni/deallocazioni della memoria (NOTA: la lista puntata da ptrptr2 è una sottolista di quella puntata da ptrptr1).
    Questo è il mio programma:
    #include <stdio.h>
    #include <stdlib.h>

    struct list {
    float value;
    struct list *next_ptr;
    };
    void init( struct list ** ptrptr );


    void main(void)
    {
    int value;
    struct list *ptr;
    int i;
    int N;// numero elementi lista

    init(&ptr);
    printf("quanti elementi contiene la lista(numero pari):\n");
    scanf("%d",&N);
    for (i=1;i<=N;i++)
    {
    printf( "inserisci elemento (la lista deve essere ordinata in due parti): \n" );
    scanf( "%d",ptr->value );
    printf("elemento\n");
    printf("%d",ptr->value);
    ptr=ptr->next_ptr;
    }

    void merge(struct list *ptrptr1, struct list *ptrptr2)
    {
    while (ptr->value < ptr->next_ptr->value)// ptrptr1 punta i valori della lista fino a quando non si arriva a metà, cioè l'elemento successivo non è ordinato
    {
    ptrptr1->value=ptr->value;
    ptr=ptr->next_ptr;
    }
    ptrptr2->value=ptr->next_ptr->value;


    while(ptrptr1!=NULL && ptrptr2!=NULL)
    {
    if(ptrptr1->value < ptrptr2->value)
    ptrptr1=(ptrptr1->next_ptr);
    else
    {
    ptrptr1->next_ptr=ptrptr2;
    ptrptr2=ptrptr2->next_ptr;
    }
    printf("%d lista ordinata\n",ptrptr1);
    }
    }
    return;
    }
    void init( struct list ** ptrptr )
    /* inizializzazione
    */
    {
    *ptrptr = NULL;
    }
  • Re: Algoritmo fusione

    OK allora il discorso è diverso: la lista è unica e hai due dottoliste ordinate. il loop lo devi fare dal ptrptr2 fino alla fine e non dal primo fino a che non incontra il ptrptr2. crea un funzione che prende un puntatore della sottolista puntata dal ptrptr2 e lo inserisce nel posto giusto nella sottolista puntata dal ptrptr1.
Devi accedere o registrarti per scrivere nel forum
4 risposte