Newsgroup: it.comp.lang.c
Titolo: liste bidimensionali

Liste di liste.
Mi e' stato dato un compito all'apparenza semplice:
Creare un sorta di matrice utilizzando le liste.
Sinceramente mi sono incartato. Non riesco a capire come pote annidare delle
liste fra l'altro differenti:
la prima che genera le colonne e' cosi':
struct colonna {
    int numColonna;
    struct colonna *nextPtr;
};
La seconda che genera le righe e' cos':
struct riga {
    char *stringa;
    struct riga *nextPtr;
}
Come le annido? Inizialmente ho pensato di utilizzare una matrice di liste.
Ma mi si rammenta che non devo usare vettori.
Qualcuno puo' darmi una mano?
Grazie anticipatamente Tony
---
Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (
http://www.grisoft.com
).
Version: 6.0.633 / Virus Database: 405 - Release Date: 18/03/2004

 }
Se la richiesta è di riprodurre una matrice bidimensionale, cioé usare
obbligatoriamente 2 liste, io metterei un puntatore alla struttura
`cella' nella struttura `colonna', poi le racchiuderei ambedue nella
struct `matrice':
struct matrice{
        stuct colonna{
                struct colonna *nextPtr:
                struct cella *cptr;
        }Colonna;
        struct cella{
                char *stringa;
                struct stringa *nextPtr
        }Cella;
        unsigned x, y;
};
Bisogna immaginre una fila di oggetti `colonna' connessi ognuno con una
coda di oggetti cella, linkati fra loro, quindi ogni colonna::nextPtr
punta alla successiva colonna, colonna::cptr invece al primo oggetto
della lista di strutture cella.
Ad esempio, questa è la funzione di estrazione dei valori che
implementerei (occhio ché non l'ho compilata):
char *accedi_elemento(const struct matrice*matrix,unsigned x,unsigned y)
{
        struct colonna *coll;
        struct riga * row;
        if(x >=matrix->x  || y>=matrix->y)return NULL;
        for(unsigned i=0, coll=&matrix->Colonna; i<x; i++)coll=coll->nextPtr;
        for(unsigned i=0, row=coll->rptr;i<y; i++)riga=row->nextPtr;
        return row->stringa;
}
Un altro modo, se non ti è stato esplicitamente richiesta
l'implementazione con due tipi distinti di liste, è di farne una unica.
Come tu ben sai, infatti, le matrici allocate come qualsiasi vettore,
in modo lineare. Quindi io la implemeterei come una semplice lista
collegata; bisognerebbe solo fare occhio a convertire i doppi indici in
uno solo.
Ciao!
-- 
Per l'e-mail rimuovere le maiuscole e gli underscore

Grazie!
Non riesco a pensare, pero', come popolare la lista.
Praticamente cosa succede?
matrice è semplicemente una struct visto che non ha un puntatore allo stesso
tipo?
In oltre per accedere all'elemento char della lista cella devo utilizzare
(*matrice).(*Cella).(*stringa) ?
In oltre ho notato che nella funzione *accedi_elemento utilizzi dei
puntatori a colonna e riga che inizializzi come matrix->...... quindi
matrice è semplicemente un contenitore?va allocata memoria per matrice ogni
volta che inserisco una colonna con n righe o quando inserisco comunque un
elemento?
Praticamente quello che devo realizzare io è:
Una matrice che contenga nella prima colonna tutte le parole formate da 4
caratteri, nella seconda colonna tutte le parole formate da 5 caratteri e
cosi' via. Quindi quando leggo tale matrice devo poter "dire" stampami tutta
la matrice, stampami la colonna contenente le parole co 6 elementi etc. etc.
Di certo non è che voglio fatto il programma (anzi vi prego di non postarmi
la soluzione a questo problema) vorrei solo capire come impostare la
matrice.
Ciao Tony
"Zero" <fiqpgc@_SPAMMER_AL_CONFINO_IN_SIBERIA_tin.it> ha scritto nel
messaggio news:5yG7c.87106$z23.3...@news3.tin.it...



 comunque un elemento?
No, `matrice' è solo un contenitore per facilizzarsi la vita. Dentro ci
sono due liste collegate: quella delle colonne e quelle delle celle.
Ogni lista di celle è attaccata ad un'elemento della lista delle
colonne: ogni volta che devi aggiungere nuove celle devi badare ad
espandere congruamente tutt'e due le liste.
Un discorso a parte è l'eliminazione degli elementi.


 liste. Ma mi si rammenta che non devo usare vettori.
La soluzione della matrice trattata in modo 'lineare' è secondo me la
migliore, cioè con un'unica lista di colonne accedi all'elemento [i][j],
accedendo all'elemento n*i+j-esimo della lista, con n=numero di colonne
della matrice presa in esame.
Se per qualche ragione (richieste specifiche dell'esercizio, ecc) non vuoi
usare questa soluzione, potresti modificare la struttura riga in modo da
contenere un puntatore alla prima colonna della riga
struct riga {
    int numRiga;
    struct riga *nextPtr;
    struct colonna *firstcol;
}
Per accedere all'elemento [i][j], scorri la lista delle righe fino
all'i-esimo elemento ed una volta preso il puntatore delle colonne, puoi
scorrere fino alla j-esima colonna.
Ciao
-- 
none

 ha scritto nel messaggio
news:wp08c.92361$z23.3...@news3.tin.it...

---
Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (
http://www.grisoft.com
).
Version: 6.0.639 / Virus Database: 408 - Release Date: 22/03/2004

 ha scritto nel messaggio
news:wp08c.92361$z23.3...@news3.tin.it...

---
Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (
http://www.grisoft.com
).
