[Linguaggio C] Sottoliste dispari

di il
1 risposte

[Linguaggio C] Sottoliste dispari

Leggere un intero n>0 e un k<n. Costruire una lista L di n numeri interi casuali minori di 50 e stampare la lista. Individuare e stampare tutte le sottoliste di k elementi di L la cui somma sia dispari.

IMPORTANTE: Organizzare il programma in funzioni (una per generare la lista, una per stamparla, una per le sottoliste).

Esempio. Sia n = 9 e k = 3. Supponiamo che venga generata la lista:

15 --> 17 --> 37 --> 27 --> 21 --> 32 --> 5 --> 37 --> 9 --> NULL

allora vengono stampate le seguenti sottoliste di 3 elementi la cui somma è dispari:

15 --> 17 --> 37 -->NULL
17 --> 37 --> 27 -->NULL
37 --> 27 --> 21 -->NULL
5 --> 37 --> 9 -->NULL

Questo è ciò che ho fatto io:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

struct nodo *crealista();
void stampalista(struct nodo *p);
int sottolistedispari ();
struct nodo{
       int dato;
       struct nodo *next;
};

main()
{
      struct nodo *start, *p, *q;
      start = crealista();
      stampalista (start);
      printf("\n\n\n");
      sottolistedispari();
      system("PAUSE");
      return 0;
}

struct nodo *crealista()
{
       struct nodo *p, *start, *last;
       int i, n, x;
       start = NULL;
       srand(time(NULL));
       printf ("Quanti nodi ha la lista? \n");
       scanf("%d", &n);
       if(n<=0){
                printf("Inserisci un numero di nodi maggiore di zero: \n");
                scanf("%d", &n);
       }
       for(i=0; i<n; i++){
                p = (struct nodo *)malloc(sizeof (struct nodo));
       if(i == 0)
         start = p;
       else
         last->next = p;
         p->dato = rand() % (1) + 25;
         p->next = NULL;
         last = p;
       }
printf("\n\n\n");
return(start);
}

void stampalista(struct nodo *p)
{
     while(p != NULL){
             printf("%d -->", p->dato);
             p = p->next;
     }
printf("NULL \n\n\n");
}

int sottolistedispari ()
{
    struct nodo *p, *start, *last;
    int i, j, k, n, somma;
    printf("Quanti nodi hanno le sottoliste? \n");
    scanf("%d", &k);
    if(k >= n){
         printf("Inserisci un numero di nodi delle sottoliste inferiore a quello della lista: \n");
    }
    
    for(i=0; i<n; i++){
             for(j=n; j<n-k; j++){
                      somma = somma + p;
                      p = p->next;
             }
      if(somma % 2 != 0){
             stampalista(start);
      }
    }
return;
}
Sicuramente ho sbagliato ad effettuare la somma ma non riesco a venirne a capo.
Spero che qualcuno di voi possa aiutarmi...con le liste sono davvero impreparato.
Grazie in anticipo

1 Risposte

  • Re: [Linguaggio C] Sottoliste dispari

    Cercando di sistemarlo un pò sono arrivato a questo:
    #include<stdio.h>
    #include<stdlib.h>
    #include<time.h>
    
    struct nodo *crealista();
    void stampalista(struct nodo *p);
    void sottolistedispari (int somma, int k);
    struct nodo{
           int dato;
           struct nodo *next;
    };
    
    main()
    {
          int somma, k;
          struct nodo *start, *p;
          start = crealista();
          stampalista (start);
          printf("\n\n\n");
          sottolistedispari(somma, k);
          system("PAUSE");
          return 0;
    }
    
    struct nodo *crealista()
    {
           struct nodo *p, *start, *last;
           int i, n, x;
           start = NULL;
           srand(time(NULL));
           do {
             printf ("Quanti nodi ha la lista? \n");
             scanf("%d", &n);
           } while(n<=0);
           for(i=0; i<n; i++){
                    p = (struct nodo *)malloc(sizeof (struct nodo));
           if(i == 0)
             start = p;
           else
             last->next = p;
             p->dato = rand() % (1) + 25;
             p->next = NULL;
             last = p;
           }
    printf("\n\n\n");
    return(start);
    }
    
    void stampalista(struct nodo *p)
    {
         while(p != NULL){
                 printf("%d -->", p->dato);
                 p = p->next;
         }
    printf("NULL \n\n\n");
    }
    
    void sottolistedispari (int somma, int k)
    {
        struct nodo *p;
        int j, n, i;
        do {
        	printf("Inserisci un valore di k minore di n: ");
        	scanf("%d", &k);
        } while(k>=n);
        somma = 0;
        for(i=0; i<=(n-k); i++){
          for(j=0; j<k; j++){
                 somma = somma + p->dato;
                 p = p->next;
          }
          if(somma % 2 != 0){
                 
                 stampalista(p);
                 
          }
          
        }
    }
    Quando parte e do a video l'ordine della lista e delle sottoliste si blocca.
    Non so che parametro passa alla stampalista nella funzione sottolistedispari (sono sicuro che stampalista(p) sia sbagliato).
    Qualcuno può aiutarmi???
Devi accedere o registrarti per scrivere nel forum
1 risposte