Domanda Problema liste concatenate C

Bynary01

Utente Silver
3 Ottobre 2016
57
32
0
73
salve ragazzi, in vista degli esami mi sto. esercitando con il. linguaggio C e sto provando ad implementare le liste concatenate ma mi sono imbattuto in un problemino che sono sicuro sia banale ma non riesco a risolverlo:
praticamente quando vado a stampare la mia sequenza di nodi (si tratta di linked lists) il compilatore stampa solo il valore del nodo di testa, andando a fare un poi di debug mi sono reso conto che il problema potrebbe non essere la funzione che stampa i nodi in sequenza bensì quella che crea diversi nodi e li lega alla head (lista_in() ) poiché nel debugger viene visualizzato solo il valore dei primi due nodi (testa e successivo) dopodiché appare un errore se provo a visualizzare quello dopo.
potete aiutarmi? incollo il codice
C:
#include <stdio.h>
#include <stdlib.h>

struct nodo {
    int val;
    struct nodo* succ;
};
typedef struct nodo nodo;

nodo* lista_new(int);
nodo* lista_in(nodo*, int);
void lista_print(nodo*);






int main(){
    nodo* head = lista_new(9);
    head = lista_in(head, 10);
    lista_print(head);


    return 0;
}

void lista_print(nodo *head){
    nodo *tmp_nd = head;
    while(tmp_nd->succ != NULL){
        printf("valore nodo : %d \n",tmp_nd->val);
        tmp_nd = tmp_nd->succ;
    }
}

nodo* lista_new(c){
    nodo* head = malloc(sizeof(nodo));
    head->val = c;
    head->succ = NULL;
    return head;
}

nodo* lista_in(nodo* head, int x){
    nodo* tmp_nd = head;
    for(int  i; i < x; i++){
        if (tmp_nd->succ == NULL) {
            nodo* nd = malloc(sizeof(nodo));
            nd->val = i;
            tmp_nd->succ = nd;
            tmp_nd = nd;
    return head;
        }
    }
}
 
Per stampare la lista
C:
void lista_print(nodo* head) {
    nodo* tmp_nd = head;
    while (tmp_nd != NULL) {
        printf("valore nodo : %d \n", tmp_nd->val);
        tmp_nd = tmp_nd->succ;
    }
}
altrimenti non stampi il nodo che ha come successivo NULL (i.e., non stampi l'ultimo nodo).

Per creare una nuova lista
C:
nodo* lista_new(int c) {
    nodo* head = malloc(sizeof(nodo));
    head->val = c;
    head->succ = NULL;
    return head;
}
ti sei dimenticato di specificare che il parametro è un intero.

Per inserire un nodo in coda
C:
nodo* lista_in(nodo* head, int x) {
    nodo* tmp_nd = head;
    while (tmp_nd->succ != NULL) {
        tmp_nd = tmp_nd->succ;
    }
    tmp_nd->succ = lista_new(x);
    return head;
}
il while serve per raggiungere la coda (i.e., il nodo che ha NULL come successore) e la chiamata a lista_new serve per creare/allocare un nuovo nodo.

P.S. Se ti vuoi allenare, c'è anche programmiamo con inforge. Il progetto (bruteforce) è attualmente in corso e sta sera verrà postata la seconda feature.
 
ti ringrazio, adesso il codice funziona, hai per caso idea come posso fare per integrare questi nodi in una struct lista?:
mi spiego meglio:
ho una struct lista di questo tipo:
C:
struct lista {
    nodo* a;
    int n; //numero di caselle occupate
    int c; //capacità effettiva
};
come posso fare a far si che i nodi vadano effettivamente nella lista in modo da poter "richiamare" i. singoli nodi come un elemento di un array?
e. g. lista.a[0] ritorna il primo nodo
 
Ti ricordo che non hai scritto il codice per cancellare la lista. Ad ogni malloc deve corrispondere una free, altrimenti hai memory leaks.

Capacità effettiva non ti serve. Se implementi le liste come resizable-array, in un'area contigua di memoria, ha senso avere una lista più lunga del necessario per ammortizzare il costo dell'espansione. Tu però hai una linked list e allungarla non richiede riallocazioni.


come posso fare a far si che i nodi vadano effettivamente nella lista in modo da poter "richiamare" i. singoli nodi come un elemento di un array?
Fai delle funzioni che prendono struct lista invece che struct nodo*. La testa della lista è quella che tu hai chiamato a, per il resto procedi come hai già fatto.