inserire e stampare due elementi di una lista c89

Gius1805

Nuovo Utente
10
0
Ciao a tutti,
devo inserire n elementi in una lista, chiedere due indici e stampare gli elementi nella i-esima posizione.
C:
#include <stdlib.h>
#include <stdio.h>

typedef struct nodo_{
    int num;
    struct nodo_ *next;
}nodo_t;

nodo_t* inserisciInCoda(nodo_t * l, int num);

int main(){
    int n, num, i, indice;
    nodo_t* ciao=NULL;
    nodo_t* testa=NULL;
  
    printf("inserire numeri da inserire: ");
    scanf("%d", &n);
    for(i=0; i<n; i++){
        scanf("%d", &num);
        inserisciInCoda(ciao, num);
    }

    printf("inserire indice: ");
    scanf("%d", &indice);
    for(i=0; i<indice; i++)
        ciao->next;
    printf("%d\n", ciao->num);
    printf("inserire secondo indice: ");
    scanf("%d", &indice);
    for(i=0; i<indice; i++)
        ciao->next;
    printf("%d\n", ciao->num);

}

nodo_t* inserisciInCoda(nodo_t * l, int num){
    nodo_t *tmp, *prec;
    tmp = malloc(sizeof(nodo_t));
    if(tmp != NULL){
        tmp->num = num;
        tmp->next = NULL;
        if(l == NULL)
            l = tmp;
        else{
            for(prec=l; prec->next!=NULL; prec=prec->next);
            prec->next = tmp;
            }
    } else
        printf("Mem. esaurita!\n");
    return l; 
}
Dopo aver chiesto il primo indice viene questo errore:
Codice:
Segmentation fault (core dumped)
Qualcuno che riesce a trovare l'errore?
Grazie in anticipo!!!
 

pabloski

Utente Èlite
2,668
740
Intanto il segfault è qui

Codice:
        inserisciInCoda(ciao, num);

il puntatore alla testa è passato per valore, per cui non può semplicemente essere aggiornato dall'interno della funzione con

Codice:
l = tmp;

Devi fare

Codice:
        ciao = inserisciInCoda(ciao, num);

Poi c'è un altro errore nella parte di ricerca.
 

bigendian

Utente Attivo
260
120
OS
Linux forever, freedom
Oppure puoi usare un ** (pointer to pointer), tipo

Codice:
int inserisciInCoda(nodo_t  ** l, int num){

    *l = tmp;

return 0;  /* tutto ok */

}
 

Gius1805

Nuovo Utente
10
0
Intanto il segfault è qui

Codice:
        inserisciInCoda(ciao, num);

il puntatore alla testa è passato per valore, per cui non può semplicemente essere aggiornato dall'interno della funzione con

Codice:
l = tmp;

Devi fare

Codice:
        ciao = inserisciInCoda(ciao, num);

Poi c'è un altro errore nella parte di ricerca.
C:
typedef struct nodo_{
    int num;
    struct nodo_ *next;
}nodo_t;

nodo_t* inserisciInCoda(nodo_t * l, int num);

int main(){
    int n, num, i, indice;
    nodo_t* ciao=NULL;
    
    printf("inserire numeri da inserire: ");
    scanf("%d", &n);
    for(i=0; i<n; i++){
        scanf("%d", &num);
        ciao=inserisciInCoda(ciao, num);
    }

    printf("inserire indice: ");
    scanf("%d", &indice);
    for(i=1; i<indice; i++)
        ciao=ciao->next;
    printf("%d\n", ciao->num);
    printf("inserire secondo indice: ");
    scanf("%d", &indice);
    for(i=1; i<indice; i++)
        ciao=ciao->next;
    printf("%d\n", ciao->num);

}

nodo_t* inserisciInCoda(nodo_t * l, int num){
    nodo_t *tmp, *prec;
    tmp = malloc(sizeof(nodo_t));
    if(tmp != NULL){
        tmp->num = num;
        tmp->next = NULL;
        if(l == NULL)
            l = tmp;
        else{
            for(prec=l; prec->next!=NULL; prec=prec->next);
            prec->next = tmp;
            }
    } else
        printf("Mem. esaurita!\n");
    return l;   
}
Dovrei aver corretto tutti gli errori.
 

bigendian

Utente Attivo
260
120
OS
Linux forever, freedom
Ci sono ancora problemi,
- secondo indice e0 sbagliato, devi riportare ciao a inizio lista. Per farlo, il puntatore al primo nodo deve essere
salvato o statico. Oppure, non partire da i=1 ma da i del precedente indice richiesto.
- se come secondo indice usi l'ultimo immesso, seg fault, ti lascio capire perche

Alcune altre cose,
- indici in genere si intendono da 0, non che sia obbligatorio per questo caso dove usi le linked list, va bene da 1
- codice buono, anche se vedo qualche mancanza di spazi o altre sciocchezze. Forse e' il formattatore.
Per chi inizia col C io suggerisco sempre https://www.kernel.org/doc/html/v4.10/process/coding-style.html (uno stile come un altro, ma consente coerenza)
 
Ultima modifica:

Gius1805

Nuovo Utente
10
0
Ci sono ancora problemi,
- secondo indice e0 sbagliato, devi riportare ciao a inizio lista. Per farlo, il puntatore al primo nodo deve essere
salvato o statico. Oppure, non partire da i=1 ma da i del precedente indice richiesto.
- se come secondo indice usi l'ultimo immesso, seg fault, ti lascio capire perche

Alcune altre cose,
- indici in genere si intendono da 0, non che sia obbligatorio per questo caso dove usi le linked list, va bene da 1
- codice buono, anche se vedo qualche mancanza di spazi o altre sciocchezze. Forse e' il formattatore.
Per chi inizia col C io suggerisco sempre https://www.kernel.org/doc/html/v4.10/process/coding-style.html (uno stile come un altro, ma consente coerenza)
Salvo la testa in un altra variabile in questo modo.
C:
int main(){
    int n, num, i, indice;
    nodo_t* ciao = NULL;
    nodo_t* testa = NULL;
    
    printf("inserire numeri da inserire: ");
    scanf("%d", &n);
    for(i = 0; i < n; i++){
        scanf("%d", &num);
        ciao = inserisciInCoda(ciao, num);
    }

    testa = ciao;
    printf("inserire indice: ");
    scanf("%d", &indice);
    for(i = 0; i < indice-1; i++)
        ciao = ciao->next;
    printf("%d\n", ciao->num);
    ciao = testa;
    printf("inserire secondo indice: ");
    scanf("%d", &indice);
    for(i = 1; i < indice-1; i++)
        ciao = ciao->next;
    printf("%d\n", ciao->num);

}
 

pabloski

Utente Èlite
2,668
740
Ma perchè ciao, se hai quell'altra variabile, dal nome autoesplicativo, chiamata testa? :D
 

bigendian

Utente Attivo
260
120
OS
Linux forever, freedom
Si a parte i nomi ora funziona.

Ho come l'impressione che tu non abbia molto amore per il C, ma che ti interessava esclusivamente che funzioni. Ho indovinato ? :)

Se invece non ho indovinato, suggerisco, anche per programmi semplici, cercare di usare uno stile professionale.
- per ogni malloc,. in chiusura dovrai avere un "free", perdite di memoria le puoi verificare con valgrind in linux
- rispettare un codying style
- usare nomi variabili piu esplicativi possibili, piuttosto che pippo pluto e ciao topolino
- commenti in punti complessi

Saluti ;)
 

Gius1805

Nuovo Utente
10
0
Si a parte i nomi ora funziona.

Ho come l'impressione che tu non abbia molto amore per il C, ma che ti interessava esclusivamente che funzioni. Ho indovinato ? :)

Se invece non ho indovinato, suggerisco, anche per programmi semplici, cercare di usare uno stile professionale.
- per ogni malloc,. in chiusura dovrai avere un "free", perdite di memoria le puoi verificare con valgrind in linux
- rispettare un codying style
- usare nomi variabili piu esplicativi possibili, piuttosto che pippo pluto e ciao topolino
- commenti in punti complessi

Saluti ;)
In realtà mi sta piacendo ma sono ancora all'inizio quindi visto quello che stai scrivendo penso di aver dato troppa importanza alla riuscita del programma invece che all'eleganza del prodotto. Grazie dei consigli, mi saranno di aiuto😉
 

Entra

oppure Accedi utilizzando

Hot: PS5 VS XBOX X/S?

  • Playstation 5

    Voti: 436 63.5%
  • XBOX Series X/S

    Voti: 251 36.5%

Discussioni Simili