[C] Intersezione ordinata di due liste
Inviato: 24/12/2018, 12:46
Ciao a tutti! Ho iniziato i primi esercizi sulle liste e dopo i primi (pochi) successi mi sono bloccato su questo esercizio:
"Scrivere un programma che acquisisca da tastiera due successioni di interi positivi, entrambe terminate da un numero negativo, e le inserisca in due liste distinte. Scegliere se realizzare una procedura o una funzione che, prese
in input le due liste, crei una terza lista contenente l’intersezione ordinata tra le due precedenti: non vi devono quindi essere elementi ripetuti e i valori devono essere memorizzati in ordine crescente. Si stampi il contenuto della
lista intersezione"
Prima di tutto ho provato a fare una funzione che crei l'intersezione delle due liste, poi farei una per ordinarla. Il punto è che non va la prima funzione.
"Scrivere un programma che acquisisca da tastiera due successioni di interi positivi, entrambe terminate da un numero negativo, e le inserisca in due liste distinte. Scegliere se realizzare una procedura o una funzione che, prese
in input le due liste, crei una terza lista contenente l’intersezione ordinata tra le due precedenti: non vi devono quindi essere elementi ripetuti e i valori devono essere memorizzati in ordine crescente. Si stampi il contenuto della
lista intersezione"
Prima di tutto ho provato a fare una funzione che crei l'intersezione delle due liste, poi farei una per ordinarla. Il punto è che non va la prima funzione.
- Codice:
#include <stdio.h>
#include <stdlib.h>
#define FALSE 0
#define TRUE 1
struct elemento{
int info;
struct elemento * next;
};
typedef struct elemento ElementoLista;
typedef ElementoLista* ListaDiElementi;
ListaDiElementi crealista(){
ListaDiElementi lista,aux;
int n;
scanf("%d",&n);
if(n<0) {
lista=NULL;
return(lista);
}
else{
//creo il primo elemento
lista=malloc(sizeof(ElementoLista));
lista->info=n;
aux=lista;
while(n>=0){
scanf("%d",&n);
if(n>=0){
aux->next=malloc(sizeof(ElementoLista));
aux=aux->next;
aux->info=n;
}
}
aux->next=NULL;
return(lista);
}
}
void stampalista(ListaDiElementi lista){
while(lista!=NULL){
printf("%d",lista->info);
lista=lista->next;
printf("\n");
}
}
ListaDiElementi intersezione(ListaDiElementi *lista1, ListaDiElementi *lista2){
ListaDiElementi lista3,p,i,aux;
int trovato=FALSE;
int primavolta=TRUE;
p=*lista1;
i=*lista2;
while(p->next!=NULL){
while(i->next!=NULL && !trovato){
if((p->info)==(i->info)){
trovato=TRUE;
if(primavolta){
lista3=malloc(sizeof(ElementoLista));
lista3->info=p->info;
aux=lista3;
primavolta=FALSE;
}
else{
aux->next=malloc(sizeof(ElementoLista));
aux=aux->next;
aux->info=p->info;
}
}
i=i->next;
}
p=p->next;
}
aux->next=NULL;
return(lista3);
}
int main() {
ListaDiElementi lista1,lista2,lista3;
lista1=crealista();
lista2=crealista();
lista3=intersezione(&lista1, &lista2);
stampalista(lista3);
return 0;
}