Domanda Aiuto puntatori C

Stato
Discussione chiusa ad ulteriori risposte.

Sheppard96

Utente Silver
11 Dicembre 2012
40
9
0
50
Ultima modifica:
Buongiorno,questa mattina ho svolto il test di programmazione I universitario e tornato a casa volevo svolgere il problema sul compilatore,ma ad un certo punto di codice mi crasha e non riesco a capire il motivo. Vi posto sia la traccia che la mia soluzione. Grazie per l'attenzione.
Traccia
Il programma legge o genera una lista di n nodi contenente una sequenza di numeri compressi RLE e costruisce una seconda lista contenente la sequenza decompressa.
Non si possono usare array/liste ausiliare e variabili globali.
La mia soluzione è stata:
#include <stdio.h>
#include <stdlib.h>
struct nodo{
int dato;
int ripetizione;
struct nodo *next;
};
struct nodo2{
int dato;
struct nodo2 *next;
};
struct nodo *Crea(){
struct nodo *p,*start,*last;
int i,n,x,rip;
printf("Quanti nodi vuoi inserire?\n");
scanf("%d",&n);
for(i=0;i<n;i++){
printf("Inserisci il dato\n");
scanf("%d",&x);
printf("inserisci la ripetizione del dato\n");
scanf("%d",&rip);
p=(struct nodo*)malloc(sizeof(struct nodo));
if(i==0)
start=p;
else
last->next=p;
p->dato=x;
p->ripetizione=rip;
p->next=NULL;
last=p;
}
return start;
}
sstruct nodo* print(struct nodo*p){
if(p==NULL)
printf("->Null\n");
else{
printf("(%d,%d)",p->dato,p->ripetizione);
return print(p->next);
}
}
struct nodo2* print2(struct nodo2 *p){
if(p==NULL)
printf("NULL\n");
else{
printf("%d->",p->dato);
return print2(p->next);
}
}
struct nodo2* Lista(struct nodo *p){
struct nodo2 *primo,*secondo;
int n,x,i;
secondo=(struct nodo2*)malloc(sizeof(struct nodo));
primo=secondo;
while(p!=NULL){
n=p->ripetizione;
for(i=0;i<n;i++)
{
printf("%d = secondo\n",terzo->dato);
secondo->dato=p->dato;
secondo=terzo->next;
}
p=p->next;
}
secondo->next=NULL;
primo=primo->next;
return (primo);

}

int main(){
struct nodo *primo;
struct nodo2 *secondo;
primo=Crea();
print(primo);
secondo=Lista(primo);
print2(secondo);
}
La logica è la seguente:
Fino al caricamento è tutto regolare,la funzione "crea" mi crea la lista compressa,e la funzione "print" mi stampa la suddetta lista. La funzione "Lista" mi dovrebbe riempire la nuova lista decompressa e dovrebbe far tornare il puntatore al primo nodo. Ma durante l'esecuzione mi crasha,e non capisco perchè. Possibilmente si dovrebbe aggiustare questo programma e non scriverne uno nuovo. Grazie a tutti per la collaborazione e buona giornata.
 
Possibilmente si dovrebbe aggiustare questo programma e non scriverne uno nuovo.
La funzione Lista era sbagliata, te l'ho riscritta nello stesso stile in cui hai scritto la funzione Crea.
C:
#include <stdio.h>
#include <stdlib.h>

struct nodo{
    int dato;
    int ripetizione;
    struct nodo *next;
};

struct nodo2{
    int dato;
    struct nodo2 *next;
};

struct nodo *Crea(){
    struct nodo *p,*start,*last;
    int i,n,x,rip;
    printf("Quanti nodi vuoi inserire?\n");
    scanf("%d",&n);
    for(i=0;i<n;i++){
        printf("Inserisci il dato\n");
        scanf("%d",&x);
        printf("inserisci la ripetizione del dato\n");
        scanf("%d",&rip);
        p=(struct nodo*)malloc(sizeof(struct nodo));
        if(i==0)
            start=p;
        else
            last->next=p;
        p->dato=x;
        p->ripetizione=rip;
        p->next=NULL;
        last=p;
    }
    return start;
}

void print(struct nodo*p){
    if(p==NULL)
        printf("->Null\n");
    else{
        printf("(%d,%d)",p->dato,p->ripetizione);
        print(p->next);
    }
}

void print2(struct nodo2 *p){
    if(p==NULL)
        printf("NULL\n");
    else{
        printf("%d->",p->dato);
        print2(p->next);
    }
}

struct nodo2 *Lista(struct nodo* l){
    struct nodo2 *p,*start = NULL,*last;
    int i;
    while (l != NULL)
    {
        for(i = 0; i < l->ripetizione; i++){
            p=(struct nodo2*)malloc(sizeof(struct nodo2));
            if(start == NULL)
                start=p;
            else
                last->next=p;
            p->dato = l->dato;
            p->next=NULL;
            last=p;
        }
        
        l = l->next;
    }
    return start;
}


int main(){
    struct nodo *primo;
    struct nodo2 *secondo;
    primo=Crea();
    print(primo);
    secondo=Lista(primo);
    print2(secondo);
}
 
  • Mi piace
Reazioni: Sheppard96
Prova ad inizializzare last all'inizio della funzione
Comunque dovresti eseguire il debug del codice per vedere in quale punto genere l'errore e rimediare di conseguenza
 
Ho risolto,funziona perfettamente. Era io che avevo messo male una riga. Grazie mille a tutti per la collaborazione e la cortesia.
 
Stato
Discussione chiusa ad ulteriori risposte.