Esercizio

di il
3 risposte

Esercizio

Salve, mi é stato dato il seguente esercizio da svolgere in c.
"Scrivere una funzione che data unal ista di interi L (con eventual iripetizioni) ed un valore k, restituisca una lista L2 di puntatori agli elementi di L che contengono i lvalore k. Scrivere un main che 1)crei la lista L ;2) prenda in input k; 3)crei la lista L2; 4) Stampi il contenuto puntato da L2."

Questo é il mio codice
#include <stdio.h>
struct elem {
	int k;
	struct elem *next;
};
 
struct elem2{
    struct elem *e;
    struct elem *next;
};
struct elem *insElemInTesta(struct elem *top,int k);
struct elem *eliminaLista(struct elem *top);
struct elem2 *eliminaLista2(struct elem2 *top2);
struct elem *riempiLista();
void stampaLista2(struct elem2 *top2);
struct elem2 *riempilista2(struct elem *top, struct elem2 *top2,int k);
int main()
{
    struct elem *top;
    struct elem2 *top2;
    int k;
    top=riempiLista();
    printf("Dammi l´elemento da puntare:");
    scanf("%d",&k);
    top2=riempilista2(top,top2,k);
    stampaLista2(top2);
    top=eliminaLista(top);
    top2=eliminaLista2(top2);

    return 0;
}

struct elem *nuovoElemento(int k){
	struct elem *nuovo= (struct elem *)malloc(sizeof(struct elem));
	nuovo->k=k;
	nuovo->next=NULL;
	return nuovo;
}
struct elem *insElemInTesta(struct elem *top,int k){
	struct elem *nuovo= nuovoElemento(k);
	nuovo->next=top;
	return nuovo;
}

struct elem *eliminaLista(struct elem *top){
	struct elem *c;
	while (top != NULL){
		c=top;
		top=c->next;
		free(c);		
	}
	return top;
}

struct elem2 *eliminaLista2(struct elem2 *top2){
	struct elem *c;
	while (top2 != NULL){
		c=top2;
		top2=c->next;
		free(c);		
	}
	return top2;
}

struct elem *riempiLista(){
	struct elem *top=NULL;
	int n,i,k;
	printf("Quanti elementi vuoi inserire?");
	scanf("%d",&n);
	for (i=0;i<n;++i) {
		printf("Dammi l'elemento %d:",i+1);
		scanf("%d",&k);
		top=insElemInTesta(top,k);
	}
	return top;
}

void stampaLista2(struct elem2 *top2){
	while (top2!=NULL) {
		printf("%p -->",top2->e);
		top2=top2->next;
	}
	printf("NULL\n");
}
struct elem2 *nuovoElemento2(struct elem2 *top2, struct elem *tmp){
	struct elem2 *nuovo= (struct elem2 *)malloc(sizeof(struct elem2));
	nuovo->e=&tmp;
	nuovo->next=NULL;
	return nuovo;
}

struct elem2 *insElemInTesta2(struct elem2* top2, struct elem *tmp){
	struct elem2 *nuovo= nuovoElemento2(top2,tmp);
	nuovo->next=top2;
	return nuovo;
}

struct elem2 *riempilista2(struct elem *top, struct elem2 *top2,int k){
    struct elem *tmp=top;
    while(tmp->next!=NULL){
        if(tmp->k==k) {
          struct elem2 *nuovo=insElemInTesta2(top2,tmp);
        }
        tmp=tmp->next;
    }
    return top2;
}[/size]
Qualcuno mi puó aiutare, mi stampa sempre null
Grazie in anticipo

3 Risposte

  • Re: Esercizio

    Ho aggiunto anche #include <stdlib.h>
  • Re: Esercizio

    Hai fatto bene.
    La funzione riempilista2, a parte che si ferma al penultimo elemento, non aggiorna il puntatore a top2 dopo aver aggiunto l'elemento. Andrebbe fatta così:
    
    struct elem2 *riempilista2(struct elem *top, struct elem2 *top2,int k){
        struct elem *tmp=top;
        while(tmp!=NULL){
            if(tmp->k==k) {
              top2 = insElemInTesta2(top2,tmp);
            }
            tmp=tmp->next;
        }
        return top2;
    }
    
    Ci sono comunque diversi errori sparsi per il codice dovuti all'uso sbagliato dei tipi, dai un'occhiata a tutti i warning del compilatore.
    Il primo sta nella struct elem2, dove next dovrebbe puntare a *elem2, non *elem.
  • Re: Esercizio

    Grazie mille!
Devi accedere o registrarti per scrivere nel forum
3 risposte