PDA

View Full Version : [C] Liste di Liste


TorpedoBlu
25-09-2004, 10:15
c'è un modo per costruire liste di liste? io ho messo una lista orizzontale e dentro ogni nodo di questa c'è la testa di una lista verticale, è giusto?
C'è un modo per scorrere e muoversi agevolmente in una struttura del genere???

ragazzi sono in crisi devo fare questo progetto per l'Uni, ma sono incasinato chi ci da un'occhiata?

http://homes.dsi.unimi.it/~fiorenti/labalg03/zoom.pdf


grazie

TorpedoBlu
26-09-2004, 18:22
up

TorpedoBlu
28-09-2004, 23:23
rsgszzi un aiuto! :muro:

anx721
29-09-2004, 00:08
La lista di liste va bene costruita in quel modo. Il progetto è tropp lungo per mettermi a leggerlo...sorry

TorpedoBlu
29-09-2004, 13:16
ora mi han detto che quello che ho fatto e' una cazzata, ma io pensavo di aver lavorato bene, mi han detto di usare dei grafi e quindi una lista di adiacenze... non so, vi posto il codice, ditemi se fa schifo...


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

typedef int dato;

struct nodo_lista{
dato d;
struct nodo_lista *next;
struct nodo_lista *head;
};

typedef struct nodo_lista NODO;
typedef NODO *LINK;


/* prende come parametro il puntatore alla lista e la coordinata
(il dato contenuto nel nodo) e restituisce 1 se è contenuto nella lista,
0 altrimenti*/
int esiste(LINK h, int coordinata){
int ris=0;
while(h!=NULL){
if(coordinata == h->d){ ris=1; break; }
if(coordinata < h->d) break;
h=h->next;
}
return ris;
}



/* prende come parametri il puntatore alla lista e il dato da inserire e
ritorna il puntatore al nodo immesso*/



LINK inserisciNodo(LINK h, int coordinata){

int i=coordinata;
LINK temp, temp2, ris;
printf("inserisci \n");
if(h==NULL){
printf("il nodo è Null \n");
h=malloc(sizeof(NODO));
h->d=coordinata;
h->head=NULL;
h->next=NULL;

ris=h;
printf("creato : %d",h->d);
}

else {
printf("\nil nodo non è NULL ");
while(!esiste(h,i)){
i--;
if(i<0)break; /*se il dato risultasse da inserire in testa*/
}
/* se il dato da inserire non esiste procedi all'inserimento creando un nodo*/
printf("\nwhile ");
if(i!=coordinata){
printf("\nif ");
if(!(i<0)){
while(h!=NULL){
if(h->d==i) break;
h=h->next;
}
temp=malloc(sizeof(NODO));
temp->d=coordinata;
temp->head=NULL;
temp->next=h->next;
h->next=temp;
printf("\n- inserito : %d\n\n",h->next->d);
/*ritorna il puntatore al nodo inserito*/
ris =h->next;
}
else{
temp2=h;
temp=malloc(sizeof(NODO));
temp->d=coordinata;
temp->head=NULL;
temp->next=temp2;
h=temp;
printf("\n- inserito : %d\n\n",h->d);
ris=h;
}
}
else{
printf("\nelse");
while(h!=NULL){
if(h->d==coordinata) break;
h=h->next;
}
printf("\n-il dato esiste gia");
/*ritorna il nodo che esisteva gia*/
ris = h;
}
}
return ris;
}

/* prende come parametro il puntatore alla lista, e le coordinate della cella
inserendo la cella in modo appropriato */
LINK inserisciCella(LINK HEAD, int x, int y){
LINK colonna, temp, primo;
printf("inserisci Cella");
if((HEAD==NULL)||(HEAD->d>x)){
printf("!!!!!!!!!!!!!!!!!ULTIMA MODIFICA!!!!!!!!!!!!!!!!!");
temp=HEAD;
primo =malloc(sizeof(NODO));
primo ->d =x;
primo ->next =temp;
primo ->head=NULL;
HEAD=primo;
printf("\n\n\nil valore di HEAD nodo ora e': %d\n\n",HEAD->d);
colonna=HEAD;
}
else
colonna=inserisciNodo(HEAD,x);
printf("\ninserito x \n");


if((colonna->head==NULL)||(colonna->head->d>y)){
colonna->head=inserisciNodo(colonna->head, y);
}
else
inserisciNodo(colonna->head, y);
printf("\ninserito y nella colonna del %d\n",colonna->d);
return HEAD;
}


/* prende come parametro il puntatore alla lista e ne stampa tutti gli elementi*/

void stampaLista(LINK HEAD){
int i=0;
LINK TAIL;
TAIL=HEAD;
if(TAIL==NULL)
printf("\nLista Vuota");
while(TAIL!=NULL){
printf("\nil nodo numero : %d è :%d",i++,TAIL->d);
TAIL=TAIL->next;
if(TAIL==NULL)
printf("\nil nodo numero : %d è :NULL",i++);
}
}

void stampaListaAdiacenze(LINK HEAD){
printf("\nasse X");
stampaLista(HEAD);
while(HEAD!=NULL){
printf("\ncolonna del %d",HEAD->d);
stampaLista(HEAD->head);
HEAD=HEAD->next;
}
}




int main(void){
/* il problema è nell'inserimento del primo nodo della cella, cercare un modo
per riuscire ad inserire il rpimo nodo, poi il tutto viene da se */

LINK HEAD, temp;
int i=0, scelta, ascissa, ordinata, num_celle=0;

printf("\nimmetti x:");
scanf("%d",&ascissa);
printf("\nimmetti y:");
scanf("%d",&ordinata);
printf("1 per continuare :\n");
scanf("%d",&scelta);

HEAD = malloc(sizeof(NODO));
HEAD->next =NULL;
HEAD->d =ascissa;
HEAD->head = malloc(sizeof(NODO));
HEAD->head->next =NULL;
HEAD->head->d =ordinata;
num_celle++;
stampaListaAdiacenze(HEAD);

while(scelta==1){

printf("\nimmetti x:");
scanf("%d",&ascissa);
printf("\nimmetti y:");
scanf("%d",&ordinata);
printf("1 per continuare :\n");
scanf("%d",&scelta);
HEAD =inserisciCella(HEAD,ascissa,ordinata);
num_celle++;

}

stampaListaAdiacenze(HEAD);
printf("\n\nnumero delle celle inserite :%d",num_celle);

return 0;
}

TorpedoBlu
01-10-2004, 18:05
up