Torna indietro   Hardware Upgrade Forum > Software > Programmazione

iPhone 17 Pro: più di uno smartphone. È uno studio di produzione in formato tascabile
iPhone 17 Pro: più di uno smartphone. È uno studio di produzione in formato tascabile
C'è tanta sostanza nel nuovo smartphone della Mela dedicato ai creator digitali. Nuovo telaio in alluminio, sistema di raffreddamento vapor chamber e tre fotocamere da 48 megapixel: non è un semplice smartphone, ma uno studio di produzione digitale on-the-go
Intel Panther Lake: i processori per i notebook del 2026
Intel Panther Lake: i processori per i notebook del 2026
Panther Lake è il nome in codice della prossima generazione di processori Intel Core Ultra, che vedremo al debutto da inizio 2026 nei notebook e nei sistemi desktop più compatti. Nuovi core, nuove GPU e soprattutto una struttura a tile che vede per la prima volta l'utilizzo della tecnologia produttiva Intel 18A: tanta potenza in più, ma senza perdere in efficienza
Intel Xeon 6+: è tempo di Clearwater Forest
Intel Xeon 6+: è tempo di Clearwater Forest
Intel ha annunciato la prossima generazione di processori Xeon dotati di E-Core, quelli per la massima efficienza energetica e densità di elaborazione. Grazie al processo produttivo Intel 18A, i core passano a un massimo di 288 per ogni socket, con aumento della potenza di calcolo e dell'efficienza complessiva.
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


iPhone 17 Pro: più di uno smartphone. È uno studio di produzione in formato tascabile iPhone 17 Pro: più di uno smartphone. &Eg...
Intel Panther Lake: i processori per i notebook del 2026 Intel Panther Lake: i processori per i notebook ...
Intel Xeon 6+: è tempo di Clearwater Forest Intel Xeon 6+: è tempo di Clearwater Fore...
4K a 160Hz o Full HD a 320Hz? Titan Army P2712V, a un prezzo molto basso 4K a 160Hz o Full HD a 320Hz? Titan Army P2712V,...
Recensione Google Pixel Watch 4: basta sollevarlo e si ha Gemini sempre al polso Recensione Google Pixel Watch 4: basta sollevarl...
Samsung è sempre più prota...
ChatGPT ha pregiudizi politici? Ecco cos...
Un solo iPhone rubato ha portato alla sc...
Xiaomi 17 Ultra sta arrivando: ecco come...
Il Motorola Edge 70 non ha più se...
Alcuni Galaxy S26 utilizzeranno il chip ...
Amazon, ecco i super sconti del weekend:...
Scovare un bug di sicurezza sui disposit...
Offerta Amazon su NordVPN: proteggi 10 d...
ECOVACS DEEBOT X8 PRO OMNI in offerta su...
Scope elettriche Tineco in offerta su Am...
Offerta Amazon sui robot EUREKA J15 Ultr...
Chrome disattiverà automaticament...
Tornano tutti e 4 i colori disponibili p...
Super sconto su iPhone 16: Amazon abbass...
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: 18:26.


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