PDA

Visualizza la versione completa : [c] operazione sulle liste


visualnic
01-06-2004, 19:21
Ho postato un nuovo messaggio perche quello di prima non mi ha cagato nessuno ...

Cerco di fare una domanda pi generale

Ho una lista che contiene n stringhe

volevo fare le seguenti operazioni su tale lista:

- verificare se nella lista sono contenute stringhe uguali

- se si quante uguali tra loro

- stampare a video le stringhe nell'ordine da quelle ripetute pi volte a quelle non ripetute

GRAZIE A TUTTI CIAO

:bh:

Michele Facchin
01-06-2004, 19:33
Io farei in questo modo:

- Crei una nuova lista ma stavolta oltre al campo stringa, metti anche un contatore.

- Crei un nuovo elemento (e) settando a zero i due campi.

- Ordini la lista delle tue stringhe.


- Scorri la lista ordinata, se il valore della stringa corrente diverso da quello del elemento nuovo (e, che al inizio sar NULL) inserisci la stringa e ne crei uno in sucessione.
Altrimenti vai avanti finch non trovi una stringa diversa da quella di (e), incrementando ogni volta il contatore.

- Vai avanti cos finch non hai finito tutta la lista.

- In questo modo avrai una lista contenente di cui ogni elemento contiene una stringa, e quante volte esse si ripete.

- Ordini la nuova lista.

- La stampi.

bye

visualnic
01-06-2004, 20:42
Pesantissimo io ho una lista del genere:


struct List
{
char *el;
struct List *next;
struct List *prev;
};

void init(struct List *aux, char *el);
void add(struct List *aux, char *el);

void init(struct List *aux, char *el)
{
assert(aux != NULL);
//Bisogna allocare la memoria prima di effettuare la copiatura
aux -> el = (char *)malloc(254 * sizeof(char));
strcpy(aux->el, el);
aux->next = NULL;
aux->prev = NULL;
}

void add(struct List *aux, char *el)
{
assert(aux != NULL);
while(aux->next != NULL)
aux = aux->next;
struct List *tmp = (struct List *)malloc(sizeof(struct List));
//Bisogna allocare la memoria prima di effettuare la copiatura
tmp -> el = (char *)malloc(254 * sizeof(char));
strcpy(tmp->el, el);
tmp->next = NULL;
tmp->prev = aux;

aux->next = tmp;
}

puoi farmi un esempio?

GRAZIE CIAO

anx721
01-06-2004, 21:23
Puoi fare qlcosa del genere:



//Struttura per mantenere il numero di occorrenze di una stringa

struct ListCount
{
char *el;
struct ListCount *next;
int count;
};

//La seguente funzione prende in input una lista di List e
//restituisce una lista di ListCount, costiutita da tanti elementi
//quanti sono le stringhe diverse, e per ognuna il campo count
//contiene il numero di occorrenze della stringa

struct ListCount *buildListCount(struct List lis){
//Il puntatore a ListCount che sar resituito come risultato
struct ListCount * lisCount= NULL;
//scorriamo la lista di stringhe
for(;lis != NULL; lis = lis -> next){
//se listCount non ancora inizializzato creiamo il
//primo elemento e ci inseriamo la prima stringa
//della lista
if(lisCount == NULL){
lisCount =(struct ListCount *)malloc(sizeof(struct ListCount));
lisCount -> el = lis -> el;
lisCount -> next = NULL;
lisCount -> count = 1;
}
//altrimenti scorriamo lisCount; se la stringa
//corrente gia presente incrementiamo il campo
//count, se no aggiungiamo un nuovo elemento
//alla lista lisCount per la stringa corrente
else{
ListCount *temp = lisCount;
//ultimo elemento non nullo di lisCount
ListCount *last = NULL;
for(; temp != NULL; temp = temp -> next){
if(strcmp(lis -> el, temp -> el) == 0){
temp -> count = temp -> count + 1;
break;
}
last = temp;
}
//Se la stringa non stata trovata temp == NULL
//quindi creiamo un nuovo elemento nella lista
if(temp == NULL){
last -> next = (struct ListCount *)malloc(sizeof(struct ListCount));
last = last -> next;
last -> el = lis -> el;
last -> next = NULL;
last -> count = 1;
}
}
}
return lisCount;
}


A questo punto, se vuoi stampare le stringhe in ordine decrescente di occorrenze puoi ordinare la lista restituita da buidListCount in base al campo el, e poi stamparla.

PS: il codice non l'ho testato, quindi potrebbe contenere errori, per come idea corretto,

:ciauz:

visualnic
02-06-2004, 14:50
ok grazie ma non ho capito molto ...

comunque mi da errore qui:


struct ListCount *buildListCount(struct List lis){

Ma devo sostituire tutto il mio codice dove definisco la mia lista con quello che hai postato tu? oppure devo implementare le due porzioni di codice?

Perch nel mio prg successivamente nel main (), aggiungo elementi nella lista mediante una cosa del genere:



struct List *head = NULL;
struct List *temp = NULL;


while(fgets(s,254,FileIn))
{
if (strstr (s, par) != NULL)
{
if(head == NULL){
head = (struct List *)malloc (sizeof(struct List));
init(head, s);
}
else
add(head, s);

temp = head;

y++;
}
else
x++;
}
while(temp != NULL)
{
printf("%s\n", temp ->el);
temp = temp ->next;
}
c = -1;
fclose(FileIn);

}


QUALCUNO RIESCE A SCHIARIRMI UN PO LE IDEE?

grazie

ciao

Luc@s
02-06-2004, 16:05
http://www.librinformatica.it/novita/libri03/aw1534.htm

ti schiarira le idee :D

anx721
02-06-2004, 17:51
La riga su cui ti da errore sostituiscila con:

struct ListCount *buildListCount(struct List *lis){

Questo codice va AGGIUNTO al tuo, prima del main, non va a sostituire niente.

:ciauz:

visualnic
02-06-2004, 19:32
ho apportato alcune modifiche ora non da pi nessun errore ...


struct ListCount
{
char *el;
struct ListCount *next;
int count;
};

//La seguente funzione prende in input una lista di List e
//restituisce una lista di ListCount, costiutita da tanti elementi
//quanti sono le stringhe diverse, e per ognuna il campo count
//contiene il numero di occorrenze della stringa

struct ListCount *buildListCount(struct List *lis){
//Il puntatore a ListCount che sar resituito come risultato
struct ListCount * lisCount = NULL;
//scorriamo la lista di stringhe
for(lis != NULL; lis = lis -> next;)
{
//se listCount non ancora inizializzato creiamo il
//primo elemento e ci inseriamo la prima stringa
//della lista
if(lisCount == NULL){
lisCount =(struct ListCount *)malloc(sizeof(struct ListCount));
lisCount -> el = lis -> el;
lisCount -> next = NULL;
lisCount -> count = 1;
}
//altrimenti scorriamo lisCount; se la stringa
//corrente gia presente incrementiamo il campo
//count, se no aggiungiamo un nuovo elemento
//alla lista lisCount per la stringa corrente
else
{
struct ListCount *temp = lisCount;
//ultimo elemento non nullo di lisCount
struct ListCount *last = NULL;
for(; temp != NULL; temp = temp -> next){
if(strcmp(lis -> el, temp -> el) == 0){
temp -> count = temp -> count + 1;
break;
}
last = temp;
}
//Se la stringa non stata trovata temp == NULL
//quindi creiamo un nuovo elemento nella lista
if(temp == NULL){
last -> next = (struct ListCount *)malloc(sizeof(struct ListCount));
last = last -> next;
last -> el = lis -> el;
last -> next = NULL;
last -> count = 1;
}
}
}
return lisCount;
}

visualnic
02-06-2004, 19:44
Io ora nel MAIN ho questo codice che mi stampa tutta la mia lista anche i duplicati :


struct List *head = NULL;
struct List *temp = NULL;


while(fgets(s,254,FileIn))
{
if (strstr (s, par) != NULL)
{
if(head == NULL){
head = (struct List *)malloc (sizeof(struct List));
init(head, s);
}
else
add(head, s);

temp = head;

y++;
}
else
x++;
}
while(temp != NULL)
{
printf("%s\n", temp ->el);
temp = temp ->next;

}

c = -1;
fclose(FileIn);

}

Il codice postato nel post precedente definisce un COUNT ALLA LISTA

come posso vedere quante volte ripetuta una stessa stringa nella mia lista ?

Per esempio la mia lista composta da:

vasco rossi
rino gaetano
vasco rossi
vasco rossi
rino gaetano
patty pravo

voglio vedere quante volte sono ripetute le stesse stringhe nella lista e stamparle a video nel seguente modo:

vasco rossi
rino gaetano
patty pravo

vasco rossi per primo perch contenuto 3 volte
rino gatano secondo perch contenuto 2 volte
e per ultima patty pravo ch presente solo una volta


Spero di essere stato chiaro


GRAZIE A TUTTI DI NUOVO

CIAO CIAO

anx721
02-06-2004, 20:32
Se head la tua lista originaria fai cosi:

struct ListCount *listCount = buildListCount(head);

A questo punto listCount contiene tutte lel stringhe una sola volta e per ognuna di esse indicato il numero di occorrenze nel campo count. Per stamparle in base al numero di occorrenze devi ordinare la lista in base al campo count, utilizzando un algoritmo di ordinamento.

:ciauz:

Loading