PDA

Visualizza la versione completa : [C] Creazione e ricerca elemento in array di liste


JErikaM
04-01-2012, 17:11
Ciao a tutti :)
Ho un problema (non piccolo _) con un argomento del C..
Gli array di liste..
Gli array e le liste singolarmente non mi sono troppo ostiche, ma insieme un bel p!

Sto cercando di creare un programmino che crei un array di liste e poi vi cerchi all'interno un elemento se presente oppure no!
Ho iniziato ad abbozzare il codice per quanto ho potuto la mia logica pare non funzionare...



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

struct cella
{
int valore;
struct cella *next;
};

int main()
{
struct cella *temp;
struct cella *nuovo;
struct cella *testa;
int i;
struct cella *array[3];

for(i=0;i<3;i++) //inizializzo a NULL le teste
{
array[i]=NULL;
}

printf("Inserisco gli elementi nella lista 1");
printf("\n");
scanf("%d", &nuovo);
nuovo = (struct cella*)malloc(sizeof(struct cella));
nuovo->next = testa;
testa = nuovo;
scanf("%d", &array[0]->valore);

system("pause");
return 0;

}

Teoricamente fino a qui dovrei poter inserire almeno un elemento alla lista 1 che risiede nella prima cella dell'array!
Tuttavia quando compilo, il programma da errore e si chiude dopo l'inserimento dell'elemento...
potete aiutarmi?
Non so dove sbattere la testa _

Grazie davvero!

shodan
04-01-2012, 17:33
Le scanf scrivono dove non dovrebbero, dato che usi puntatori non inizializzati.
Ti riporto il codice teoricamente corretto per inserire un elemento. (non testato)


int main() {
int i;
struct cella *array[3];
for(i=0;i<3;i++) { //inizializzo a NULL le teste
array[i]=NULL;
}

printf("Inserisco gli elementi nella lista 1\n");
array[0] = (struct cella*)malloc(sizeof(struct cella));
array[0]->next = NULL;
scanf("%d", &array[0]->valore);
printf("%d\n", array[0]->valore);
free(array[0]);
system("pause");
return 0;
}

JErikaM
04-01-2012, 17:53
Originariamente inviato da shodan
Le scanf scrivono dove non dovrebbero, dato che usi puntatori non inizializzati.
Ti riporto il codice teoricamente corretto per inserire un elemento. (non testato)


int main() {
int i;
struct cella *array[3];
for(i=0;i<3;i++) { //inizializzo a NULL le teste
array[i]=NULL;
}

printf("Inserisco gli elementi nella lista 1\n");
array[0] = (struct cella*)malloc(sizeof(struct cella));
array[0]->next = NULL;
scanf("%d", &array[0]->valore);
printf("%d\n", array[0]->valore);
free(array[0]);
system("pause");
return 0;
}


grazie funziona!
array[0]->next = NULL; per con questo codice non si limita a creare una lista di un elemento? cio se io replicassi l'inserimento per dire 3 volte...



printf("Inserisco gli elementi nella lista 1\n");
array[0] = (struct cella*)malloc(sizeof(struct cella));
array[0]->next = NULL;
scanf("%d", &array[0]->valore);
printf("Inserisco gli elementi nella lista 1\n");
array[0] = (struct cella*)malloc(sizeof(struct cella));
array[0]->next = NULL;
scanf("%d", &array[0]->valore);
printf("Inserisco gli elementi nella lista 1\n");
array[0] = (struct cella*)malloc(sizeof(struct cella));
array[0]->next = NULL;
scanf("%d", &array[0]->valore);

i valori del secondo e terzo inserimento si aggiungerebbero alla lista?

grazie ancora :P

shodan
04-01-2012, 18:18
No, li sostituiscono.
Cos si aggiungono.


printf("Inserisco gli elementi nella lista 1 - 1\n");
array[0] = (struct cella*)malloc(sizeof(struct cella));
array[0]->next = NULL;
scanf("%d", &array[0]->valore);

printf("Inserisco gli elementi nella lista 1 - 2\n");
array[0]->next = (struct cella*)malloc(sizeof(struct cella));
array[0]->next->next = NULL;
scanf("%d", &array[0]->next->valore);

printf("Inserisco gli elementi nella lista 1 - 3\n");
array[0]->next->next = (struct cella*)malloc(sizeof(struct cella));
array[0]->next->next->next = NULL;
scanf("%d", &array[0]->next->next->valore);


Va da se che improponibile una cosa del genere.
Tieni presente che ogni singola cella l'array contiene solo il primo elemento di una lista diversa, per cui una volta individuata la lista che ti interessa, trattarla non diverso da una lista qualsiasi.

JErikaM
04-01-2012, 18:22
Originariamente inviato da shodan
No, li sostituiscono.
Cos si aggiungono.


printf("Inserisco gli elementi nella lista 1 - 1\n");
array[0] = (struct cella*)malloc(sizeof(struct cella));
array[0]->next = NULL;
scanf("%d", &array[0]->valore);

printf("Inserisco gli elementi nella lista 1 - 2\n");
array[0]->next = (struct cella*)malloc(sizeof(struct cella));
array[0]->next->next = NULL;
scanf("%d", &array[0]->next->valore);

printf("Inserisco gli elementi nella lista 1 - 3\n");
array[0]->next->next = (struct cella*)malloc(sizeof(struct cella));
array[0]->next->next->next = NULL;
scanf("%d", &array[0]->next->next->valore);


Va da se che improponibile una cosa del genere.
Tieni presente che ogni singola cella l'array contiene solo il primo elemento di una lista diversa, per cui una volta individuata la lista che ti interessa, trattarla non diverso da una lista qualsiasi.

giusto!!
son ormai le 6.30 o.o sar fusa...son qui da tutt'oggi!

ora mi metto a fare una stampa complessiva e poi vado mangiare. provo ad andare avanti e domani ti faccio sapere :D grazie davvero :)

JErikaM
05-01-2012, 15:09
mi sono messa da una mezzoretta a fare la ricerca..se il valore non presente nelle liste me lo segnala correttamente, se invece c' mi segnala in modo sbagliato dove si trova..
se tipo ho il valore 1 sia in lista 1 - 2 -3 mi conta il tutto come una lista unica...e tipo mi dice
il valore 1 in cella 3, 6, 9 perch secondo lui ho una cosa del genere
123123123


printf("\n\n Inserisci il valore da cercare nella lista: ");

scanf("%d",&numerodacercare);
trovato = 0;
count = 0;
for(i=0;i<3;i++)
{
temp = array[i]; //puntatore temporaneo per scorrere la lista e non perdere il riferimento alla testa
while (temp != NULL)
{
count++;
if (temp->valore == numerodacercare)
{
trovato = 1;

}
temp = temp->next;
}
if (trovato)
printf("\n\n Il valore %d e\' presente in lista nella cella %d\n ",numerodacercare,count);
else
printf("\n\n Il valore selezionato NON e\' presente in lista\n ");
system("pause");
}



edit: ho notato che non lo trova neanche u.u la mia era solo una coincidenza...non riesce a entrare nelle diverse liste..

shodan
05-01-2012, 15:17
Il count = 0 va messo tra il temp e il while, altrimenti si incrementa e basta.

JErikaM
05-01-2012, 15:26
ho inserito il count = 0;
qui

temp = array[i];
count = 0;
while (temp != NULL)

ma se lo compilo ho una situazione cos


http://i277.photobucket.com/albums/kk71/ErikaSparrow/Senzatitolo1jhj.jpg

shodan
05-01-2012, 15:40
Anche trovato va azzerato qui:


temp = array[i];
count = 0;
trovato = 0;
while (temp != NULL)


Comunque hai mostrato solo una iterazione del ciclo for. E in quella iterazione non c' il 6. Le prossime che mostrano?

JErikaM
05-01-2012, 15:44
in che senso le prossime iterazioni? quello dovrebbe essere il risultato avuto dopo lo svolgimento dell'intero for...

Loading