Puntatori a struttura dati

di il
5 risposte

Puntatori a struttura dati

Salve ragazzi sto studiando le principali strutture dati:code,liste,alberi,grafi e mi trovo di fronte ad un dubbio che non mi da la possibilità di implementare con sicurezza le mie funzioni.
Il dubbio è assocciato ai puntatori a struttura...mi spiego meglio
negli appunti del mio professore io mi trovo dinanzi a strutture di questo tipo:
typedef struct nodo{
int valore;
struct nodo next*;
}Nodo;
a livello pratico io so che la struct Nodo mi crea elementi di questo tipo: ora nel chiamare le funzioni principali associate alla struttura(push e pop ad esempio) viene usato come tipo di ritorno un puntatore alla struttura nodo:
per esempio

perchè e necessario questo puntatore????
l'unica possibile spiegazione che mi viene in mente e che deve esistere un puntatore a struttura
tale da accedere alla cella di memoria in cui si crea il nodo della struttura.

qualcuno mi spiega chiaramente come funziona logicamente????
cioè questo puntatore a struttura mi serve per svolgere tutte le varie operazioni di inserimento,estrazione,stampa???
è il puntatore a struttura che scorre dentro la lista è mi restituisce,mi aggiunge o mi stampa???

5 Risposte

  • Re: Puntatori a struttura dati

    Talvolta mi trovo di fronte a funzioni push definite in tal modo ora il comportamento di questa push e della precedente sono uguali per il comportamento natura del C che gestisce il passaggio di variabili a funzione per copia???
  • Re: Puntatori a struttura dati

    tanoferr ha scritto:




    perchè e necessario questo puntatore????
    l'unica possibile spiegazione che mi viene in mente e che deve esistere un puntatore a struttura
    Sì, il puntatore che ti ritornano le due funzione push() e pop() ti serve a puntare alla testa della lista. Nel caso push() punterà al primo nodo appena aggiunto nella lista e che quindi ora rappresenta la testa, nel caso pop() punterà al nodo che puntava il nodo che hai appena eliminato e che quindi rappresenta la nuova testa della lista.

    P.S : per il secondo metodo push() che hai pubblicato, quello rappresenta un inserimento di un nodo in una lista doppiamente concatenata.
  • Re: Puntatori a struttura dati

    Ok tutto chiaro per il secondo push avevo sbagliato dovevo pubblicare questo: volevo sapere se in ugual maniera posso usare per la push sia la funzione con restituzione del puntatore,sia quella con doppio puntatore senza restituzione...e il perchè dovrebbe essere associato al modo in cui il C modifica un valore per copia...vero???
    ovviamente la secondo è per creare una lista FIFO mentre la prima per una lista LIFO
  • Re: Puntatori a struttura dati

    Un altra cosa la necessità di definire un puntatore a struttura è associata a tutte le strutture dati???nel senso che è necessario definire un puntatore a struttura anche con grafi e alberi per poter svolgere le varie operazioni??
  • Re: Puntatori a struttura dati

    tanoferr ha scritto:


    un altra cosa la necessità di definire un puntatore a struttura è associata a tutte le strutture dati???nel senso che è necessario definire un puntatore a struttura anche con grafi e alberi per poter svolgere le varie operazioni??
    Dipende dalla struttura dati e se questa sia dinamica o meno. Ad esempio se ti occorre uno stack statico o una lista statica (quindi di dimensione fissa) puoi tranquillamente usare un array. Chiaramente poi ci sarebbero da valutare i costi computazionali per cercare un elemento, inserirlo, eliminarlo. Poi altro discorso ancora sulla gestione della memoria, nel caso statico allochi già tutto all'inizio e deallochi alla fine, nel caso dinamico allochi memoria mano mano che aggiungi un nodo e man mano che lo rimuovi.
    Quindi il tutto dipende da come si implementa la struttura dati.
    Ad esempio per una lista:
    • -Supponiamo il caso in cui è implementata con un array. Eliminare un elemento, in linea generale senza usare strutture ausiliarie, potrebbe comportarti lo shiftare un sottoinsieme di elementi che nel caso peggiore sono tutti gli n elmenti(dove n rappresenta la dimensione dell'array). Pertanto questa operazione ha complessità O(n).
      -Supponiamo il caso in cui è implementata tramite puntatori. Eliminare un elemento ha una complessità pressochè costante (devi solo aggiornare un paio di puntatori).

    tanoferr ha scritto:


    e il perchè dovrebbe essere associato al modo in cui il C modifica un valore per copia...vero???
    Sulla differenza tra passaggio di parametri per valore e per "riferimento"(ovvero l'indirizzo di memoria) tramite puntatore potremmo farci una lezione universitaria sopra. La differenza è sottile perché stai sempre passando un valore, ma solo che in un caso passi il valore vero e proprio della variabile nell'altro passi il suo indirizzo.
    A questo link spiega bene la differenza anche con esempi, come la nota funzione swap sempre presente quando ci si imbatte un questo tipo di discussioni:
    http://cs-fundamentals.com/tech-interview/c/difference-between-call-by-value-and-call-by-reference-in-c.php
Devi accedere o registrarti per scrivere nel forum
5 risposte