Benvenuto su Inforge
Rimuovi la pubblicità e partecipa alla più grande comunità italiana sul mondo digitale presente sul web sin dal 2007.
Iscriviti

Domanda Problema liste concatenate C

Bynary01

Utente Bronze
3 Ottobre 2016
52
0
40
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;
        }
    }
}
 

St3ve

Utente Platinum
12 Ottobre 2011
2,077
1,360
665
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.
 

Bynary01

Utente Bronze
3 Ottobre 2016
52
0
40
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
 
Banner pubblicitario per Bright Data su Inforge.net azienda di vendita Proxy, Data Collector e Content Unlocker
Supporta Inforge con un acquisto su NordVPN

St3ve

Utente Platinum
12 Ottobre 2011
2,077
1,360
665
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.