Problema programma C e liste.

di il
1 risposte

Problema programma C e liste.

Ciao a tutti avrei un problema da sottoporvi ecco la traccia:
Leggere n e costruire una lista di n numeri casuali compresi tra 1 e 9. Stampare la lista. Costruire una seconda lista in cui ogni elemento x della prima lista sia ripetuto x volte. Stampare la seconda lista.

Esempio. Sia n=5 e supponiamo che la prima lista sia la seguente:
4--2--1--5--7--NULL
Allora viene generata la seguente lista:
4--4--4--4--2--2--1--5--5--5--5--5--7--7--7--7--7--7--7--NULL

IMPORTANTE: Organizzare il programma in funzioni (una per generare la prima lista, una per costruire la seconda, una per stampare). Non utilizzare array o liste ausiliarie, non introdurre variabili globali.
Sono in alto mare sulla costruzione della seconda lista. Grazie per l' aiuto.

Qui sotto posto quello che sono riuscito a fare:
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
void concatena(struct nodo *a, struct nodo *b);
float medialista(struct nodo *p);
struct nodo *crealista();
void printlista(struct nodo *p);
struct nodo {
int dato;
struct nodo *next;
};
main() 
{
    struct nodo *u, *v;
    u = crealista();
    printlista (u);
    v = crealista();
    printlista(v);
    if (medialista(u) > medialista(v)) {
       concatena(u, v);
       printlista(u);
       } 
    else {
         concatena(v, u);   
         printlista(v);
    }
    system ("pause");
    return(0);
}
float medialista(struct nodo *p) {
    int somma = 0, n = 0;
    while (p != NULL) {
          somma = somma + p->dato;
          n++;
          p = p->next;
    }
    return((float)somma/n);
}
void concatena(struct nodo *a, struct nodo *b) {
    struct nodo *p;
    p = a;
    while (p->next != NULL) {
          p = p->next;
    }
    p->next = b;
    return;
}
struct nodo *crealista() 
{
       struct nodo *p, *start, *last;
       int i, n, x;
       start = NULL;
       srand (time (NULL));
       printf("quanti nodi ha la lista ?  ");
       scanf("%d", &n);
       for (i=0; i<n; i++){
           p = (struct nodo *) malloc (sizeof (struct nodo));
           if (i == 0) 
                 start = p;
           if (i != 0) 
                 last->next = p;
           p->dato = rand()%10;
           p->next = NULL;
           last = p;
       }
       printf ("\n\n");
       return(start);
}
void printlista(struct nodo *p) 
{
      while (p != NULL) {
            printf("%d --> ", p->dato);
            p = p->next;
      }
      printf("NULL\n\n\n");
}
NB questo programma che è simile svolge questo: Aggancio di due liste
Letti in input n e m, costruire due liste di n ed m numeri interi casuali compresi tra 0 e 9 e stamparle. Agganciare la lista la cui media dei valori sia minore in coda a quella con la media dei valori maggiore. Stampare la lista.

1 Risposte

  • Re: Problema programma C e liste.

    Ciao ,

    Scusami ma questo codice che hai incollato non c' entra con la traccia . Allora potresti fare in questo modo:

    La funzione crealista vabbene per la prima lista ( quella che genera i numeri tra 1 e 9 ) ma non vabbene per la seconda lista , cioè devi creare una funzione inserisci , in modo tale che puoi inserire ogni volta un valore nella seconda lista in modo tale che puoi fare questo:
    
    struct nodo* u;
    int val;
    u=inserisci(u,val);
    
    In questo modo puoi fare che per ogni valore della prima lista chiami una funzione la quale passi il valore e compie un ciclo da 0 a valore-1 nel quale chiamerà sempre la funzione inserisci con lo stesso valore.
    
    struct Nodo* concatena( struct nodo* p ) {
        struct nodo* secondalista;
        while ( p!= 0 )
        {
            secondalista=combina( p>-dato, secondalista );
            p = p->next;
        }
        return secondalista;
    }
    
    struct nodo* combina ( int valore , struct nodo* lista ) {
            for ( int i = 0 ; i < valore ; i++ ) 
                      lista=inserisci(lista,valore);
            return lista;
    }
    
    Penso che in questo modo sia fattibile , devi fare solo la funzione inserisci. Spero sia stato chiaro ^^

    Distinti saluti,
    Alessandro
Devi accedere o registrarti per scrivere nel forum
1 risposte