Fusione di due elenchi

di il
8 risposte

Fusione di due elenchi

Salve ragazzi.
Avrei un problema riguardo un esercizio in cui mi si chiede di unire due elenchi che io devo ordinare per cognome.

Non riesco a trovare il passo dove sbaglio. Posto il codice.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAXCHAR 25 //Numero per allocare gli array
#define NA 4  //Numero record elenco A
#define NB 4  //Numero record elenco B
#define NC 8

//Struct Elenco
struct ELENCO{
    char nome[MAXCHAR];
    char cognome[MAXCHAR];
    char domicilio[MAXCHAR];
    char numero_telefonico[10];
};

void ordina (struct ELENCO elenco[], int n);
void scambia (struct ELENCO elenco[], int i, int j);
void fusione(struct ELENCO elencoa[], struct ELENCO elencob[], struct ELENCO elencoc[]);

int main()
{
    int i;

    //Creazione dei due elenchi
    struct ELENCO elencoa[NA],elencob[NB],elencoc[NC];
    strcpy(elencoa[0].cognome, "Medio");
    strcpy(elencoa[0].nome, "bbb");
    strcpy(elencoa[0].domicilio, "Via Romagna");
    strcpy(elencoa[0].numero_telefonico, "0818888888");
    strcpy(elencoa[1].cognome, "Aaaa");
    strcpy(elencoa[1].nome, "Eduardo");
    strcpy(elencoa[1].domicilio, "Via Romagna");
    strcpy(elencoa[1].numero_telefonico, "0818888888");
    strcpy(elencoa[2].cognome, "Medio");
    strcpy(elencoa[2].nome, "Bbbb");
    strcpy(elencoa[2].domicilio, "Via Romagna");
    strcpy(elencoa[2].numero_telefonico, "0818888888");
    strcpy(elencoa[3].cognome, "Claudio");
    strcpy(elencoa[3].nome, "Edmuno");
    strcpy(elencoa[3].domicilio, "Via Romagna");
    strcpy(elencoa[3].numero_telefonico, "0818888888");

    strcpy(elencob[0].cognome, "Sampei");
    strcpy(elencob[0].nome, "Eduardo");
    strcpy(elencob[0].domicilio, "Via Romagna");
    strcpy(elencob[0].numero_telefonico, "0818888888");
    strcpy(elencob[1].cognome, "Hulk");
    strcpy(elencob[1].nome, "Eduardo");
    strcpy(elencob[1].domicilio, "Via Romagna");
    strcpy(elencob[1].numero_telefonico, "0818888888");
    strcpy(elencob[2].cognome, "Aaaa");
    strcpy(elencob[2].nome, "aa");
    strcpy(elencob[2].domicilio, "Via Romagna");
    strcpy(elencob[2].numero_telefonico, "0818888888");
    strcpy(elencob[3].cognome, "Peppino");
    strcpy(elencob[3].nome, "Edmuno");
    strcpy(elencob[3].domicilio, "Via Romagna");
    strcpy(elencob[3].numero_telefonico, "0818888888");

    //Uso della funzione ordina per ordinare gli elementi dei due elenchi
    ordina(elencoa, NA);
    ordina(elencob, NB);

    fusione(elencoa,elencob,elencoc);

    for(i=0;i<NC;i++)
    {
        puts(elencoc[i].cognome);
        puts(elencoc[i].nome);
        printf("\n");
    }

    return 0;
}

void ordina (struct ELENCO elenco[], int n) {
    int i,j,min;

    for(i=0;i<n;i++) {
        min=i;
        for(j=i+1;j<n;j++)
        {
            if(strcmp(elenco[min].cognome,elenco[j].cognome) > 0) {
                min=j;
            } else if(strcmp(elenco[min].cognome,elenco[j].cognome) == 0) {
                if(strcmp(elenco[min].nome,elenco[j].nome) > 0) {
                    min=j;
                }
            }
        }
        if(i != min)
        {
            scambia(elenco,i,min);
        }
    }
}

void scambia (struct ELENCO elenco[], int i, int j) {
    char tempnome[MAXCHAR], tempcognome[MAXCHAR],tempindirizzo[MAXCHAR],tempnumero[10];
    strcpy(tempcognome, elenco[i].cognome);
    strcpy(tempnome, elenco[i].nome);
    strcpy(tempindirizzo,elenco[i].domicilio);
    strcpy(tempnumero,elenco[i].numero_telefonico);
    strcpy(elenco[i].cognome,elenco[j].cognome);
    strcpy(elenco[i].nome,elenco[j].nome);
    strcpy(elenco[i].domicilio,elenco[j].domicilio);
    strcpy(elenco[i].numero_telefonico,elenco[j].numero_telefonico);
    strcpy(elenco[j].cognome,tempcognome);
    strcpy(elenco[j].nome,tempnome);
    strcpy(elenco[j].domicilio,tempindirizzo);
    strcpy(elenco[j].numero_telefonico,tempnumero);
}

void fusione(struct ELENCO elencoa[], struct ELENCO elencob[], struct ELENCO elencoc[]) {
    int i=0,j=0,k=0;
    while (i < NA && j < NB) {
        if(strcmp(elencoa[i].cognome,elencob[j].cognome) < 0)
        {
            strcpy(elencoc[k].cognome,elencoa[i].cognome);
            strcpy(elencoc[k].nome, elencoa[i].nome);
            strcpy(elencoc[k].domicilio, elencoa[i].domicilio);
            strcpy(elencoc[k++].numero_telefonico,elencoa[i++].numero_telefonico);
        } else if(strcmp(elencoa[i].cognome,elencob[j].cognome) > 0) {
            strcpy(elencoc[k].cognome,elencob[j].cognome);
            strcpy(elencoc[k].nome, elencob[j].nome);
            strcpy(elencoc[k].domicilio, elencob[j].domicilio);
            strcpy(elencoc[k++].numero_telefonico,elencob[j++].numero_telefonico);
        } else {
            if(strcmp(elencoa[i].nome,elencob[j].nome) >= 0) {
                strcpy(elencoc[k].cognome,elencob[j].cognome);
                strcpy(elencoc[k].nome, elencob[j].nome);
                strcpy(elencoc[k].domicilio, elencob[j].domicilio);
                strcpy(elencoc[k++].numero_telefonico,elencob[j++].numero_telefonico);
            } else if (strcmp(elencoa[i].nome,elencob[j].nome) < 0) {
                strcpy(elencoc[k].cognome,elencoa[i].cognome);
                strcpy(elencoc[k].nome, elencoa[i].nome);
                strcpy(elencoc[k].domicilio, elencoa[i].domicilio);
                strcpy(elencoc[k++].numero_telefonico,elencoa[i++].numero_telefonico);
            }
        }
        while (i < NA) {
            strcpy(elencoc[k].cognome,elencoa[i].cognome);
            strcpy(elencoc[k].nome, elencoa[i].nome);
            strcpy(elencoc[k].domicilio, elencoa[i].domicilio);
            strcpy(elencoc[k++].numero_telefonico,elencoa[i++].numero_telefonico);
        }
        while (j < NB) {
            strcpy(elencoc[k].cognome,elencob[j].cognome);
            strcpy(elencoc[k].nome, elencob[j].nome);
            strcpy(elencoc[k].domicilio, elencob[j].domicilio);
            strcpy(elencoc[k++].numero_telefonico,elencob[j++].numero_telefonico);
        }
    }
}
Dov'è che sbaglio?

8 Risposte

  • Re: Fusione di due elenchi

    Ciao, dovresti spiegare qual è esattamente il problema. Gli array non vengono ordinati oppure la fusione non funziona? Mostraci l'output
  • Re: Fusione di due elenchi

    Provando a fare l'ordinamento della prima struct per esempio mi ordina i primi due e non gli ultimi due...
    Mi sembra che però l'algoritmo sia giusto...
  • Re: Fusione di due elenchi

    La lunghezza del campo telefonico è di 10 caratteri ... ne devi usare di più se ne usi 10 nei dati che hai usato ...
  • Re: Fusione di due elenchi

    Maledetto carattere terminatore! Mi ha fatto impazzire è vero, che sbadato.

    Risolto questo però non mi funziona la fusione, mi mette prima gli elementi dell'elenco a poi quelli di b...

    Edit: risolto aggiungendo i vari k++;i++;j++; come singole istruzioni invece di metterle nella strcpy.
  • Re: Fusione di due elenchi

    Occhio anche a queste righe

    for(i=0;i<n;i++) {
    min=i;
    for(j=i+1;j<n;j++)

    perché i+1 sfora ...
  • Re: Fusione di due elenchi

    Si è vero. Non so perchè quando l'ho copiato avevo n...ma l'ho corretto già prima con n-1.
  • Re: Fusione di due elenchi

    Dovresti fare più attenzione ...

    tempnumero[10];
  • Re: Fusione di due elenchi

    oregon ha scritto:


    Dovresti fare più attenzione ...

    tempnumero[10];
    Esattamente, me ne sono subito accorto ripensando al problema che avevo avuto ieri, così ho subito aggiunto una define senza modificare sempre i valori
Devi accedere o registrarti per scrivere nel forum
8 risposte