Aggiungere un nodo ad una lista concatenata

di Anonimizzato22732 il
8 risposte
Ciao!

Stavo provando a scrivere un codice per aggiungere un nodo ad una lista concatenata. L'esempio del libro (che ho provato a copiare su CodeBlocks) non funziona, perciò ho provato da sola a farlo.

Per prima cosa ho fatto una lista con 4 nodi e ho provato a printarla con MostraLista. Poi ho provato a creare e aggiungere il nuovo nodo q.

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

struct nodo{
    int chiave;
    struct nodo *succ;
    struct nodo *prec;
};

typedef struct nodo nodo;

void MostraLista(nodo *lista);
nodo NuovoNodo(nodo *nodo,int chiave);


int main()
{

    nodo p1 = {1, NULL, NULL};
    nodo p2 = {2, NULL, NULL};
    nodo p3 = {3, NULL, NULL};
    nodo p4 = {4, NULL, NULL};

    p1.succ = &p2;
    p2.succ = &p3;
    p3.succ = &p4;

    p4.prec = &p3;
    p3.prec = &p2;
    p2.prec = &p1;

    int *lista = &p1;

    MostraLista(lista);

    printf("\n---------------\n");

    NuovoNodo(nodo ????, int chiave); //non so come mandare con nodo

    return 0;
}


void MostraLista(nodo *lista){

    nodo *tmp = lista;

    while( tmp != NULL){
        printf("%d\n", tmp->chiave);
        tmp = tmp->succ;
    }
}

nodo NuovoNodo(nodo *nodo, int chiave){ //ho usato nodo NuovoNodo perché il mio prof faceva così, il libro usava void

    nodo q = malloc(sizeof(nodo));

    //voglio aggiungere un nodo tra p1 e p2, dando per scontato che ci sia memoria sufficiente per farlo

    q->prec = p1;
    q->succ = p1->succ;
    p1->succ->prec = q;
    p1->succ = q;


}
è evidente che ho sbagliato qualcosa... ma cosa?

8 Risposte

  • Ma i vecchi nodi li modifichi?
  • In teoria no, voglio solo aggiungerne uno nuovo..
  • E normale che non ti funzioni perche il nuovo nodo e scollegato!
    allora una lista funziona nel seguente modo:
    punt.prec punt. succ campo ;struttura base
    adesso situazione iniziale
    null 2 campo
    1 3 campo
    2 4 campo
    3 null campo
    vogliamo aggiungere il nodo 5 alla fine della lista
    null 2 campo
    1 3 campo
    2 4 campo
    3 5 campo (punt. succ = 5 rappresenta il nuovo nodo)
    4 null campo (sarà il nuovo nodo.)
    vogliamo aggiungere il nuovo nodo 5 tra il secondo e il terzo
    null 2 campo
    1 5 campo inserisco qui il nuovo nodo che sarà : 1 5 ; modifico il puntatore successivo del 2 nodo e lo faccio puntare al nuovo nodo
    5 4 campo ; modifico il puntatore precedente del 3 nodo affinche punti al nuovo nodo.
    3 null campo
    2 3 campo (qusto e il nuovo nodo) ; il puntatore precedente puntera al nodo 2 mentre quello successivo punterà al nodo 3. ciò perchè vogliamo inserire un nuovo nodo tra il 2 e il terzo.
    se hai qualche altra domanda chiedi
  • "campo" per cosa starebbe..?
  • Campo sarebbe il dato del nodo non ha molto senso costruire una lista solo con i puntatori!
    comunque campo sarebbe quello che tu chiami chiave.
  • Senti proprio non va, non è che puoi correggermi il codice? La teoria credo di averla capita, il problema sta nel renderla codice
  • Qui si corregge codice o si spiega come fare ma non si risolvono gli esercizi!
    non c'è codice da correggere!
    devi semplicemente aggiungere le parti che mancano.
    prima della chiamata alla funzione nuovo nodo fai accettare 2 interi per stabilire dove vuoi mettere il nuovo nodo.
    diciamo tra ed y
    allora nella funzione nuovo nodo devi:
    leggere la lista fino al nodo y
    all'interno del nodo letto modifichi il puntatore precedente con il valore del nuovo nodo.
    rileggi la lista fino al nodo tra
    all'interno del nodo letto modifichi il puntatore successivo con il valore del nuovo nodo.
    rileggi la lista fino al nuovo nodo
    puntatore precedente = tra
    puntatore successivo = y
    chiave = valore del nuovo nodo.
    e il gioco e fatto.
    per aiutarti con il codice da scrivere

    modifica la routine mostra lista
    mettendo una condizione che lo faccia fermare al nodo desiderato.
    fatti restituire i due puntatori.
    la funzione nuovo nodo la crei nel seguente modo:
    mostra lista modificata fino a y
    modifichi il puntatore precedente
    mostra lista modificata fino a tra
    modifichi puntatore successivo
    mostra lista modificata fino al nuovo nodo
    puntatore precedente = tra
    puntatore successivo = y
    chiave = valore del nodo.

    non è difficile
    io ti ho spiegato come fare adesso sta a te scrivere il codice.
  • Guarda ho letto il regolamento, ero solo disperata e ho provato a chiedere, non capendo.
    Grazie lo stesso.
Devi accedere o registrarti per scrivere nel forum
8 risposte