Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Deep Tech Revolution: così Area Science Park apre i laboratori alle startup
Deep Tech Revolution: così Area Science Park apre i laboratori alle startup
Siamo tornati nel parco tecnologico di Trieste per il kick-off del programma che mette a disposizione di cinque startup le infrastrutture di ricerca, dal sincrotrone Elettra ai laboratori di genomica e HPC. Roberto Pillon racconta il modello e la visione
HP OMEN MAX 16 con RTX 5080: potenza da desktop replacement a prezzo competitivo
HP OMEN MAX 16 con RTX 5080: potenza da desktop replacement a prezzo competitivo
HP OMEN MAX 16-ak0001nl combina RTX 5080 Laptop e Ryzen AI 9 HX 375 in un desktop replacement potente e ben raffreddato, con display 240 Hz e dotazione completa. Autonomia limitata e calibrazione non perfetta frenano l'entusiasmo, ma a 2.609 euro è tra le proposte più interessanti della categoria.
Recensione Google Pixel 10a, si migliora poco ma è sempre un'ottima scelta
Recensione Google Pixel 10a, si migliora poco ma è sempre un'ottima scelta
Google ha appena rinnovato la sua celebre serie A con il Pixel 10a, lo smartphone della serie più conveniente se consideriamo il rapporto tra costo e prestazioni. Con il chip Tensor G4, un design raffinato soprattutto sul retro e l'integrazione profonda di Gemini, il colosso di Mountain View promette un'esperienza premium a un prezzo accessibile. E il retro non ha nessuno scalino
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 13-06-2005, 22: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, 22: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, 03: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 03:40.
mjordan è offline   Rispondi citando il messaggio o parte di esso
Old 14-06-2005, 23: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, 17: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


Deep Tech Revolution: così Area Science Park apre i laboratori alle startup Deep Tech Revolution: così Area Science P...
HP OMEN MAX 16 con RTX 5080: potenza da desktop replacement a prezzo competitivo HP OMEN MAX 16 con RTX 5080: potenza da desktop ...
Recensione Google Pixel 10a, si migliora poco ma è sempre un'ottima scelta Recensione Google Pixel 10a, si migliora poco ma...
6G, da rete che trasporta dati a rete intelligente: Qualcomm accelera al MWC 2026 6G, da rete che trasporta dati a rete intelligen...
CHUWI CoreBook Air alla prova: design premium, buona autonomia e qualche compromesso CHUWI CoreBook Air alla prova: design premium, b...
Il nuovo MacBook Neo ha una memoria SSD ...
Xbox Project Helix, le prime specifiche ...
Annunci pubblicitari sulla TV quando cam...
Prezzi aumentati del 50% durante la nott...
Sconti studiati per singolo utente: Sony...
Addio alla Kia Niro EV, il crossover sar...
Apple crede nel suo iPhone Fold: la prod...
Fortnite, un nuovo listino per i pacchet...
Ecco i nuovi Sonos Play ed Era 100 SL: d...
Razer svela il futuro del gaming potenzi...
Tre robot Narwal in offerta: pulizia aut...
Gracenote denuncia OpenAI: ChatGPT addes...
Microsoft AI Tour Milano: dall'efficienz...
Asus ExpertBook Ultra: Intel Core Ultra ...
Intel presenta i processori desktop Core...
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: 02:01.


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