Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Nokia Innovation Day 2026: la sovranità europea passa dal mercato unico e dai laboratori italiani del gruppo
Nokia Innovation Day 2026: la sovranità europea passa dal mercato unico e dai laboratori italiani del gruppo
Politica, accademia e industria a confronto su mercato unico, sicurezza e competitività. Nei laboratori di Vimercate, Nokia ha mostrato le nuove generazioni di chip ottici e i test che ogni prodotto deve superare prima di arrivare sul mercato
In sella alla Fiido Nomads Pro: e-bike con motore centrale da 100 Nm per il divertimento a 360 gradi
In sella alla Fiido Nomads Pro: e-bike con motore centrale da 100 Nm per il divertimento a 360 gradi
Abbiamo assemblato e provato la Fiido Nomads Pro, evoluzione del modello da trekking già presente nella gamma, che migliora in tutto, soprattutto grazie al motore centrale, fluido e potente. Ottima app, costruzione solida e prezzo ok completano il quadro
ASUS Zenbook 14 (UX3480AA): tanta autonomia con uno chassis bello e robusto
ASUS Zenbook 14 (UX3480AA): tanta autonomia con uno chassis bello e robusto
Lo chassis in Ceraluminium è il cuore di questo notebook in edizione 2026, un modello pensato per garantire produttività con le tipiche applicazioni di produttività personale e capace di offrire un'autonomia di funzionamento lontano dalla presa di corrente da riferimento. Potenza, facilità di trasporto e costruzione robusta tutto in un notebook compatto.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 13-06-2005, 21:15   #1
devilman83
Member
 
Iscritto dal: Dec 2004
Messaggi: 67
liste in C

Ciao a tutti

ho un problema con le liste: devo confrontare un elemento passato come parametro con uno della lista, scandendo tutta la lista.

Grazie

Ciao

devilman83

devilman83 è offline   Rispondi citando il messaggio o parte di esso
Old 13-06-2005, 21:59   #2
VegetaSSJ5
Senior Member
 
L'Avatar di VegetaSSJ5
 
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
devilman non mi sembra difficile anzi... cerca di fare uno sforzo per farlo da solo, almeno fai un tentativo e scrivilo qui e vediamo come va.
VegetaSSJ5 è offline   Rispondi citando il messaggio o parte di esso
Old 14-06-2005, 02:30   #3
mjordan
Bannato
 
L'Avatar di mjordan
 
Iscritto dal: Mar 2002
Città: Pescara - 未婚・恋人なし Moto: Honda CBR 1000 RR ‫Casco: XR1000 Diabolic 3
Messaggi: 27578
Ciao.
Ti ho creato un programma completo che crea una lista, confronta un valore nella lista e stampa se lo ha trovato. Poi libera tutta la memoria deallocando i nodi, prima di uscire. Funziona, ma non l'ho testato granche' quindi qualche leak o qualche errorino ci potrebbe essere.
Questo e' il codice:

Codice:
/* -*-linux-c-*- */
#include <stdio.h>
#include <stdlib.h>

#define NUM_NODES 10 /* Il numero di nodi nella lista. */
#define VALUE 5 /* Il valore da confrontare */

/*
 * Semplice macro per controllare la corretta allocazione di malloc()
 */
#define MALLOC_CHECK(ptr) \
        if (!(ptr)){\
                fprintf(stderr, "Errore di allocazione!\n");\
                exit(EXIT_FAILURE);\
        }

/*
 * La lista e' piena o e' vuota? 
 */
#define LIST_IS_EMPTY(ptr) (!(ptr))

/*
 * Il nodo di una lista. `next' e' il prossimo nodo. `user_data' e' il valore intero del nodo
 */
typedef struct _list_node {
              struct _list_node * next;
              int user_data;
} list_node;

/*
 * La testa della lista. Contiene un puntatore ad una lista,
 * un puntatore all'ultimo nodo della lista e un campo che contiene
 * il numero totale di nodi della lista.
 */
typedef struct _list_head {
              struct _list_node * list;
              struct _list_node * last;
              unsigned long int no_nodes;
} list;

/*
 * Costruiamo una lista inserendo i nodi. 
 */
list * 
list_insert_head(list * head, int data)
{
	list_node * tmp = NULL;
	tmp = (list_node *)malloc(sizeof(list_node));

	MALLOC_CHECK(tmp);

	if (LIST_IS_EMPTY(head)) {
		head = (list *)malloc(sizeof(list));
		tmp->next = NULL;
		tmp->user_data = data;
	        head->list = tmp;
	        head->last = tmp;
	        head->no_nodes = 1;
	}
	else {
		tmp->next = head->list;
		head->list = tmp;
		tmp->user_data = data;
		head->no_nodes++;
	}

	return head;
}

/*
 * Confrontiamo un valore con i valori contenuti nei nodi della lista. 
 */
void
list_compare(list * head, int data)
{
	list_node * tmp = NULL;

	if (LIST_IS_EMPTY(head)) {
		fprintf(stderr, "Non confrontero' i nodi di una lista vuota!\n");
		exit(EXIT_FAILURE);
	}
	else {
		tmp = head->list;

		for (unsigned long int i = 1; i <= head->no_nodes; i++) {
			if (tmp->user_data == data)
				printf("Elemento %d trovato!\n", data);
			tmp = tmp->next;
		}
	}

	return;
}

/* 
 * Distruggiamo una lista. 
 */
void
list_free(list * head)
{
       list_node * tmp = NULL;

       if (LIST_IS_EMPTY(head)) {
               fprintf(stderr, "Lista vuota. Niente da liberare!\n");
               exit(EXIT_FAILURE);
       }

       while (head->list != NULL) {
               tmp = head->list;
               head->list = tmp->next;
               free(tmp);
       }

       free(head);
       puts("Lista distrutta, memoria liberata!");

       return;
}

int
main(void)
{
       list * my_list = NULL;
 
       /* Costruiamo una lista. */
       for (int i = 0; i < NUM_NODES; i++)
               my_list = list_insert_head(my_list, i);

       list_compare(my_list, VALUE);
       list_free(my_list);

       return 0;
}
Per scorrere la lista ho usato due metodi: un ciclo for() che si incrementa in base al numero totale di nodi presenti nella lista (determinati in fase di costruzione della lista, nella funzione list_compare() ) e il classico ciclo while() che scorre la lista fino a quando non trova un puntatore NULL (nella funzione list_free() ). Sono due metodi diversi per determinare quando una lista e' terminata usati intenzionalmente per farti vedere le differenze. Il primo metodo e' piu' "professionale" nel senso che consente di effettuare diverse operazioni su liste singolarmente concatenate in tempo costante, il secondo e' piu' "accademico", cioe' usato su liste minimali.
Nota che la testa della lista contiene anche un campo puntatore che punta all'ultimo nodo della lista. Anche questo e' intenzionale. Questo ti consente di fare delle variazioni sulla lista, per esempio per inserire in coda anziche in testa, sempre in tempo costante anziche' lineare

Ti allego il file, visto che questo dannato tag code sembra non funzionare piu' come una volta. E' una maledizione Non avere esitazione nel chiedere.
Ciao.

PS: Rinomina il file 'lista.txt' in 'lista.c' e compila. Questo e' stato l'ultimo pezzo di codice della mia giornata. Vado a nanna anche io
Byez.
Allegati
File Type: txt lista.txt (2.5 KB, 5 visite)

Ultima modifica di mjordan : 14-06-2005 alle 02:40.
mjordan è offline   Rispondi citando il messaggio o parte di esso
Old 14-06-2005, 22:46   #4
devilman83
Member
 
Iscritto dal: Dec 2004
Messaggi: 67
Grazie per l'aiuto.

Vegeta, non è che non mi va di farlo, è che il C lo conosco poco e per quanto riguarda le liste quasi niente.

Ho chiesto aiuto proprio per questo.

Mi dispiace avervi fatto perdere tempo per questa sciocchezza.

Grazie ancora

devilman83

devilman83 è offline   Rispondi citando il messaggio o parte di esso
Old 15-06-2005, 16:08   #5
mjordan
Bannato
 
L'Avatar di mjordan
 
Iscritto dal: Mar 2002
Città: Pescara - 未婚・恋人なし Moto: Honda CBR 1000 RR ‫Casco: XR1000 Diabolic 3
Messaggi: 27578
Altro che sciocchezza, le strutture di dati sono piu' importanti del conoscere un linguaggio di programmazione, a momenti!!!
Nessun programma degno di questo nome puo' fare a meno di una struttura di dati, quindi dacci sotto!!! Le liste non sono difficili da capire, ma per implementarle correttamente, specie in C o C++, devi aver capito bene il concetto di puntatore, quindi rimane uno dei migliori esercizi attualmente concepibili.

Quindi e' una bella idea sviluppare una serie di programmi che implementano varie operazioni sulle liste. Nel programma che ti ho fatto io ti ho implementato l'inserimento, lo scorrimento con comparazione e la distruzione di una lista. Sarebbe inteessante anche implementare l'inserimento in coda (che da come ti ho progettato la lista e' immediato ), il concatenamento di due liste, l'inversione, lo split di una lista in un determinato punto, la fusione di due liste, ecc. ecc. Quante se ne possono fare... Tutti esercizi utilissimi, non solo a livello "accademico" ma anche pratico. Dacci dentro.
mjordan è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Nokia Innovation Day 2026: la sovranità europea passa dal mercato unico e dai laboratori italiani del gruppo Nokia Innovation Day 2026: la sovranità e...
In sella alla Fiido Nomads Pro: e-bike con motore centrale da 100 Nm per il divertimento a 360 gradi In sella alla Fiido Nomads Pro: e-bike con motor...
ASUS Zenbook 14 (UX3480AA): tanta autonomia con uno chassis bello e robusto ASUS Zenbook 14 (UX3480AA): tanta autonomia con ...
MSI PRO MAX: QD-OLED ultrawide per lavorare, creare e giocare MSI PRO MAX: QD-OLED ultrawide per lavorare, cre...
Samsung Micro RGB R95H, il primo LCD a LED rossi, verdi e blu di Samsung alla prova del banco di misura Samsung Micro RGB R95H, il primo LCD a LED rossi...
Intel presenta le GPU D-Series fino a 48...
Un attacco informatico può far ma...
AMD Helion, fino a 32.768 core Zen 6 per...
Chiamate con numeri falsi: AGCOM sanzion...
Il radiotelescopio cinese FAST ha scoper...
Certificati TLS più brevi, Let's ...
Milano si candida a sede Onu per la gove...
Dopo Groq e Hugging Face, NVIDIA guarda ...
Thomas Zurbuchen entra in Blue Origin ne...
Qualcomm porta servizi e sicurezza nel g...
Microsoft porta l'inferenza IA sul propr...
Blue Origin aiuterà la NASA nella...
Scoperto pianeta 'ribelle': orbita al co...
smart #2 debutta a Parigi: batteria da 3...
Un certificato in scadenza può la...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 22:00.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v