Sulle Liste...

di il
13 risposte

Sulle Liste...

Ho un imminente esame (data fissata per il 5 Settembre a meno di cambiamenti) e dato che per me è solo un'integrazione, devo esercitarmi sulle liste!
Per questo posto un pò di codice che sto facendo da qualche settimana giusto per riprendere confidenza con il Linguaggio C...
Accetto ovviamente qualsiasi consiglio per migliorare l'implementazione del mio codice che risulta anccora grezzo e basilare ...
Posto per ora la creazione di una lista con stampa e la ricerca di un elemento (anche nel caso l'elemento non sia presente)...

Grazie

PS: per semplificare la lettura ho diviso la funzione della ricerca in un code differente...

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

struct nodo {
	int info;
	struct nodo *next;
};

struct nodo *crea_lista();
void stampa(struct nodo *l);
struct nodo *ricerca(struct nodo *l, int val);

int main() {
	
	struct nodo *lista = NULL;
	int elem;
	lista = crea_lista();
	stampa(lista);
	
	printf("\n");
	printf("\n Inserisci il valore da ricercare --> ");
	scanf("%d", &elem);
	printf("\n Valore trovato --> %d", ricerca(lista, elem)->info);
	
	printf("\n\n");
	system("PAUSE");
	return 0;
}

struct nodo *crea_lista() {
	int n, i;
	struct nodo *p, *pNext;
	
	printf("\n Digita il numero di elementi della lista --> ");
	scanf("%d", &n);
	
	if(n != 0) {
		p = malloc(sizeof(struct nodo));
		printf("\n Inserisci il valore [1] --> ");
		scanf("%d", &p->info);
		pNext = p;
		for(i = 2; i <= n; i++) {
			pNext->next = malloc(sizeof(struct nodo *));
			pNext = pNext->next;
			printf("\n Inserisci il valore [%d] --> ", i);
			scanf("%d", &pNext->info);
		}
		pNext->next = NULL;
	}
	else {
		p = NULL;
		printf("\n LISTA VUOTA \n");
	}
	return p;
}

void stampa(struct nodo *l) {
	printf("\n La Lista --> ");
	while(l != NULL) {
		printf(" |%d| ", l->info);
		l = l->next;
	}
	printf("NULL");
}
Questa è la porzione di codice per la ricerca di un elemento!

struct nodo *ricerca(struct nodo *l, int val) {
	int count = 0;
	while(l != NULL) {
		if (l->info == val) {
			count ++;
		}
		l = l->next;
	}
	if(count != 0) {
		printf("\n Il valore inserito [%d] e' stato trovato!", val);
	}
	else {
		printf("\n Il valore non e' presente nella lista!");
	}
	printf("\n Valore trovato %d volte", count);
	return l;
}

13 Risposte

  • Re: Sulle Liste...

    Nella crea_lista al primo elemento non viene impostato a NULL il puntatore al successivo. Se hai una lista con un solo elemento, questo diventa un problema.

    Sarebbe più opportuno separare il codice che parla con l'utente da quello che esegue le operazioni sulla lista. Ad esempio la tua crea_lista la chiamerei riempi_lista, che di volta in volta chiede i valori all'utente e poi chiama una una aggiungi_nodo, la quale si occuperà delle allocazioni.
    Lo stesso vale per l'altra funzione, dove tra l'altro devi decidere se deve essere un conteggio di occorrenze o la ricerca di un elemento. Nel primo caso ritorna un numero, nell'altro un puntatore. Puoi farle entrambe per esercitarti.
  • Re: Sulle Liste...

    Non ho letto il codice in modo approfondito, ma in linea di massima sono d'accordo con quanto detto da @Alexv.

    Nello specifico il mio consiglio è quello di implementare le seguenti funzioni elementari:

    - aggiungi_in_testa();
    - aggiungi_in_coda();
    - aggiungi_in_ordine();
    - stampa();
    - elimina_nodo();
    - trova_occorrenza();
    - elimina_occorrenze();

    e a tal proposito, al fine di avere un codice più chiaro e conciso, utilizzerei i puntatori doppi (per esempio il prototipo della prima funzione in tal caso dovrebbe essere void aggiungi_in_testa(nodo **p, const int info))
  • Re: Sulle Liste...

    Ok, grazie a tutti!
    Nella crea_lista al primo elemento non viene impostato a NULL il puntatore al successivo. Se hai una lista con un solo elemento, questo diventa un problema.
    Cioè dovrei impostare pNext->next = NULL nella funzione crea_lista?
    Se hai una lista con un solo elemento, questo diventa un problema.
    Premesso che il programma fa il suo dovere anche con un solo elemento, perchè sarebbe un problema? Scusami ma non mi è chiaro!!!


    Nel frattempo, visto che non ho avuto tempo per controllare sul forum, c'è qualcuno che ha già svolto tutte queste operazioni elementari?
    Così da avere un riscontro e postare solo quello che proprio non riesco a capire...
  • Re: Sulle Liste...

    Vincenzo.79 ha scritto:


    Ok, grazie a tutti!
    Cioè dovrei impostare pNext->next = NULL nella funzione crea_lista?

    Premesso che il programma fa il suo dovere anche con un solo elemento, perchè sarebbe un problema? Scusami ma non mi è chiaro!!!
    Ho notato che l'hai fatto già dopo il for, pardon, non l'avevo visto.
    Certo, l'ultimo elemento deve puntare a NULL, anche se è unico, altrimenti non sa che la lista è finita.
    Nel frattempo, visto che non ho avuto tempo per controllare sul forum, c'è qualcuno che ha già svolto tutte queste operazioni elementari?
    Così da avere un riscontro e postare solo quello che proprio non riesco a capire...
    Il forum è pieno di richieste sulle liste.
    Controlla prima di tutto sul materiale che ti hanno dato da studiare, almeno sei sicuro di non trovare cose errate. Puoi dare anche un'occhiata qui, ovviamente non imparare algoritmi a memoria, assicurati di averli capiti, che poi all'esame conta che siano corretti.
  • Re: Sulle Liste...

    Ho provato in questo modo (mi stampa solo l'ultimo elemento quindi non è corretto)
    struct nodo *riempi_lista() {
    	struct nodo *p;
    	int i;
    	printf("\n La Lista -->");
    	for(i = 0; i < 10; i++) {
    		p = (struct nodo *)malloc(sizeof(struct nodo));
    		p->info = i;
    		p = p->next;
    	}
    	p->next = NULL;
    }
  • Re: Sulle Liste...

    Io ribadisco il mio consiglio di implementare delle funzioni elementari (partendo dalla funzione aggiungi_in_testa()) da utilizzare come mattoncini base per l'implementazione di funzioni man mano più articolare,poi ovviamente sei libero di fare come vuoi.
  • Re: Sulle Liste...

    Gli argomenti del programma per l'integrazione sono, grosso modo, quelli che mi avete elencato per quanto riguarda la gestione delle liste, in più c'è codice per funzioni I/O standard per i file...

    Grazie...
  • Re: Sulle Liste...

    Sinceramente non ho capito il senso del tuo ultimo messaggio!
  • Re: Sulle Liste...

    Nippolo ha scritto:


    Sinceramente non ho capito il senso del tuo ultimo messaggio!
    Voleva solo confermare gli argomenti che devo trattare...null'altro...
  • Re: Sulle Liste...

    Ecco il primo pezzo di codice sull'inserimento in testa di un carattere...
    (questo è quello che c'è sulle slide)...
    ho provato ma ovviamente non mi funziona...
    void insert_h(char* buf) {
    	struct stringa* p;
    	p = (struct stringa*)malloc(sizeof(struct stringa));
    	
    	// Alloco la memoria per il carattere successivo
    	p->str = (char*)malloc((strlen(buf) + 1)*sizeof(char));
    	strcpy(p->str, buf);
    	
    	// Assegno al nodo successivo la testa
    	p->next = head;
    	head = p;
    }
    La variabile head da qualche parte ovviamente va inizializzata, devo capire dove...
    NB: i commenti li ho inseriti io...potrebbero essere anche errati...
  • Re: Sulle Liste...

    Prima di entrare nel merito della questione avrei una domanda: che significa "questo è quello che c'è sulle slide"?


    P.S.
    Secondo me non ha alcun senso chiamare la struct "stringa", meglio il classico "nodo".
  • Re: Sulle Liste...

    Nippolo ha scritto:


    Prima di entrare nel merito della questione avrei una domanda: che significa "questo è quello che c'è sulle slide"?
    questo codice è quello che che il prof. ha messo a disposizione per gli studenti...(ricordo che io devo solo fare un'integrazione)...
    Per essere più chiari, sto cercando di fare in questo modo:
    Seguo cmq le slide per gli argomenti principali e poi cerco di approfondirli dove mi capita (a volte meglio on line perchè il libro di testo non sempre è sufficiente).
    Spero di essere stato chiaro.
    P.S.
    Secondo me non ha alcun senso chiamare la struct "stringa", meglio il classico "nodo".
    Si si, indubbiamente, poi personalizzerò il codice, per ora riporto pari pari quello degli esempi che dovrei seguire...
  • Re: Sulle Liste...

    Vincenzo.79 ha scritto:


    questo codice è quello che che il prof. ha messo a disposizione per gli studenti...(ricordo che io devo solo fare un'integrazione)...
    Quel codice così com'è non potrà mai compilare.

    Vincenzo.79 ha scritto:


    La variabile head da qualche parte ovviamente va inizializzata, devo capire dove...
    Il problema non è l'inizializzazione, ma il fatto che la suddetta variabile non viene proprio dichiarata.
    In ogni caso mi sembra ovvio che la variabile head deve essere passata alla funzione come argomento.
    Inoltre se vuoi che la funzione di inserimento in testa sia di tipo void devi obbligatoriamente utilizzare i puntatori doppi, sai farlo?
Devi accedere o registrarti per scrivere nel forum
13 risposte