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
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;
}
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.