PDA

View Full Version : [C] code (unione)


lucas87
04-04-2007, 14:40
Ho il seguente esercizio da implementare :

Date due code in ingresso a valori interi in ordine crescente, scrivere una funzione che restituisca una terza coda che contenga i valori delle due code disposti in ordine crescente.

ed ora inserisco il codice che ho sviluppato, il problema, che orami da un periodo mi perseguita è che crasha, in questo caso eseguendo la funzione unisci_code.

Cerco qualcuno che mi dica dove sbaglio.

grazie in anticipo.



/*Date due code in ingresso a valori interi in ordine crescente,
scrivere una funzione che restituisca una terza coda che contenga
i valori delle due code disposti in ordine crescente.*/
#include<stdio.h>
#include<stdlib.h>

#define EMPTY 0
#define FULL 100

typedef unsigned int data;
typedef enum {true,false} boolean;

struct elem{
data d;
struct elem *next;
};

typedef struct elem elem;

struct coda{
int cnt;
elem *dietro;
elem *avanti;
};

typedef struct coda coda;

void inizializza(coda *c);
void ins_el_coda(coda *c, data el);
data del_el_testa(coda *c);
data testa(coda *c);
boolean empty(const coda *c);
boolean full(const coda *c);
void unisci_code(coda *c1,coda *c2,coda *c);


int main(void){
coda c1,c2,c;
int i,valore;
data num; /*numero elementi da inserire nella coda c1 e nella coda c2*/
inizializza(&c1);
inizializza(&c2);
inizializza(&c);

printf("quanti elementi vuoi inserire nella prima coda?\n");
scanf("%d",&num);
/*caricamento coda c1*/
printf("\nCARICAMENTO CODA 1\n\n");
for (i = 1 ; i <= num ; ++i){
if (!full(&c1)){
printf("inserisci elemento = ");
scanf("%u",&valore);
ins_el_coda(&c1,valore);
}
else{
printf("Impossibile inserire elemento, coda c1 piena");
break;
}
}

printf("\nquanti elementi vuoi inserire nella seconda coda?\n");
scanf("%d",&num);
/*caricamento coda c2*/
printf("\nCARICAMENTO CODA 2\n\n");
for (i = 1 ; i <= num ; ++i){
if (!full(&c2)){
printf("inserisci elemento = ");
scanf("%u",&valore);
ins_el_coda(&c2,valore);
}
else{
printf("Impossibile inserire elemento, coda piena");
break;
}
}


unisci_code(&c1,&c2,&c);

system("PAUSE");
}

void inizializza(coda *c){
c -> cnt = 0;
c -> dietro = NULL;
c -> avanti = NULL;
}

void ins_el_coda(coda *c,data el){
elem *p;
p = malloc(sizeof(elem));
p -> d=el;
p -> next = NULL;
if (!empty(c)){
c -> dietro -> next = p;
c -> dietro = p;
}
else
c -> avanti = c -> dietro = p;
c -> cnt++;
}

data del_el_testa(coda *c){
data dato;
elem *p;

dato = c -> avanti -> d;
c -> avanti = c -> avanti -> next;
c -> cnt--;
free(p);
return dato;
}

data testa(coda *c){
return(c -> avanti -> d);
}

boolean empty(const coda *c){
return((boolean) (c -> cnt == EMPTY));
}

boolean full(const coda *c){
return((boolean) (c -> cnt == FULL));
}

void unisci_code(coda *c1,coda *c2,coda *c)
{
while(!full(c1) && !full(c2))
{
if (testa(c1) <= testa(c2)) ins_el_coda(&c, del_el_testa(c1));
else ins_el_coda(&c, del_el_testa(c2));
}
while(!full(c1)) ins_el_coda(&c, del_el_testa(c1));
while(!full(c2)) ins_el_coda(&c, del_el_testa(c2));

}