inserire e stampare due elementi di una lista c89

Gius1805

Nuovo Utente
12
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,868
916
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.
 
U

Utente cancellato 371741

Ospite
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
12
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.
 
U

Utente cancellato 371741

Ospite
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 da un moderatore:

Gius1805

Nuovo Utente
12
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);

}
 
U

Utente cancellato 371741

Ospite
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
12
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?
 

Ci sono discussioni simili a riguardo, dai un'occhiata!

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili