Domanda Risolto LISTE AIUTO!!!!!!!!!!!!!!

Stato
Discussione chiusa ad ulteriori risposte.

aiutoo

Utente Iron
24 Maggio 2021
4
2
0
5
Ultima modifica da un moderatore:
C:
#include <stdio.h>
#include <stdlib.h>

// struttura dati
struct node_t{
    int value;
    struct node_t * next;
};


// inserimento nella lista di un intero in ordine crescente

struct node_t* inserimento_ordinato(struct node_t * lista, int num){
    struct node_t *tmp, *prox;

    tmp = (struct node_t*) malloc(sizeof(struct node_t));
    if(tmp != NULL){
        tmp->value=num;
        if(!lista){
            tmp->next=lista;
            lista=tmp;
        }
        else
            if(lista->value>=num){
                tmp->next=lista;
                lista=tmp;
            }
            else
                if(lista->next==NULL){
                    tmp->next=NULL;
                    lista->next=tmp;
                }
                else{
                
                    for(prox=lista;prox->next!=NULL && prox->next->value<num;prox=prox->next);
                    tmp->next=prox->next;
                    prox->next=tmp;
                }
    }
                
    else
          printf("Memoria esaurita!\n");
     return lista;
}

// creo una lista ordinata con i soli valori strettamente compresi tra min e max

struct node_t* selectitems(struct node_t * lista, int min, int max){
printf("sono qui");
    struct node_t* temp,*new=NULL;
    temp=lista;
    int val;
    
    while(temp->next!=NULL){
        if(temp->value<=max && temp->value>=min){
            val=temp->value;
            new=inserimento_ordinato(new,val);
        }
    }
    return new;
    
    
}


// stampo la lista

void stampa_lista(struct node_t * n){
    
    while(n!=NULL){
        printf("%d",n->value);
        n=n->next;
    }
    
    
    
    
}
// inserimento in coda: usato nel main per creare la lista di partenza. Funzione completa.
C:
struct node_t * inserisciInCoda(struct node_t * lista, int num){
  struct node_t *prec;
  struct node_t *tmp;

  tmp = (struct node_t *) malloc(sizeof(struct node_t));
  if(tmp != NULL){
    tmp->next = NULL;
    tmp->value = num;
    if(lista == NULL)
      lista = tmp;
    else{
      /*raggiungi il termine della lista*/
      for(prec=lista;prec->next!=NULL;prec=prec->next);
      prec->next = tmp;
    }
  } else
      printf("Memoria esaurita!\n");
  return lista;
}


int main(){
    struct node_t * head=NULL;
    struct node_t * new=NULL;
    int min;
    int max;
    
    head = inserisciInCoda(head, 1);
    head = inserisciInCoda(head, 3);
    head = inserisciInCoda(head, 5);
    head = inserisciInCoda(head, 3);
    head = inserisciInCoda(head, 7);
    head = inserisciInCoda(head, 2);
    
    
    printf("\n Lista originale: ");
    stampa_lista(head);
    
    printf("\n Inserisci i due valori min e max: ");
    scanf("%d %d", &min, &max);
    
    if(min<=max){
        
        new=selectitems(head,2,4);
    }
    else 
        new=selectitems(head,max,min);
    printf("\n Lista creata: ");
    stampa_lista(new); 

    return 0;
    
    
}
Messaggio unito automaticamente:

QUALCUNO SAPREBBE AIUTARMI, DOPO L'INSERIMENTO DI MIN MAX SI BLOCCA
 
Ultima modifica:
Se ti posso dare un consiglio, aggiungi
C:
// crea un nuovo nodo (senza successore)
struct node_t *crea_nodo(int num) {
  struct node_t *nodo = malloc(sizeof(struct node_t));

  if (nodo == NULL) {
    printf("Memoria esaurita!\n");
    exit(1);
  }

  nodo->value = num;
  return nodo;
}
e rimuovi tutti gli altri controlli sulla memoria esaurita.

Dopodiché
C:
// inserimento nella lista di un intero in ordine crescente
struct node_t *inserimento_ordinato(struct node_t *lista, int num) {
  struct node_t *nodo = crea_nodo(num);

  struct node_t *pred = NULL, *succ = lista;
  while (succ && succ->value < num) {
    pred = succ;
    succ = succ->next;
  }

  if (pred) pred->next = nodo;
  nodo->next = succ;

  return lista ? lista : nodo;
}

// creo una lista ordinata con i soli valori strettamente compresi tra min e max
struct node_t *selectitems(struct node_t *lista, int min, int max) {
  struct node_t *result = NULL;

  for (; lista; lista = lista->next) {
    if (min <= lista->value && lista->value <= max)
      result = inserimento_ordinato(result, lista->value);
  }

  return result;
}
e a questo punto ti conviene dare una ripulita anche a inserisciInCoda.

P.S. Abituati ad utilizzare il tag code, almeno non si perde la formattazione e c'è pure il syntax highlighting. Più tempo impieghi a scrivere un messaggio come si deve e più siamo propensi a darti una risposta, quindi se al posto di metterci 30 secondi ci metti 10 minuti alla fine è tutto di guadagnato. Vedendo un messaggio tutto incasinato (per di più scritto da un user che si chiama "aiuto", in un thread con un titolo del cavolo) mi passa la voglia di rispondere.
 
Se ti posso dare un consiglio, aggiungi
C:
// crea un nuovo nodo (senza successore)
struct node_t *crea_nodo(int num) {
  struct node_t *nodo = malloc(sizeof(struct node_t));

  if (nodo == NULL) {
    printf("Memoria esaurita!\n");
    exit(1);
  }

  nodo->value = num;
  return nodo;
}
e rimuovi tutti gli altri controlli sulla memoria esaurita.

Dopodiché
C:
// inserimento nella lista di un intero in ordine crescente
struct node_t *inserimento_ordinato(struct node_t *lista, int num) {
  struct node_t *nodo = crea_nodo(num);

  struct node_t *pred = lista;
  while (pred && pred->value > num) pred = pred->next;

  if (pred) {
    nodo->next = pred->next;
    pred->next = nodo;
  }

  return lista ? lista : nodo;
}

// creo una lista ordinata con i soli valori strettamente compresi tra min e max
struct node_t *selectitems(struct node_t *lista, int min, int max) {
  struct node_t *result = NULL;

  for (; lista; lista = lista->next) {
    if (min <= lista->value && lista->value <= max)
      result = inserimento_ordinato(result, lista->value);
  }

  return result;
}
e a questo punto ti conviene dare una ripulita anche a inserisciInCoda.

P.S. Abituati ad utilizzare il tag code, almeno non si perde la formattazione e c'è pure il syntax highlighting. Più tempo impieghi a scrivere un messaggio come si deve e più siamo propensi a darti una risposta, quindi se al posto di metterci 30 secondi ci metti 10 minuti alla fine è tutto di guadagnato. Vedendo un messaggio tutto incasinato (per di più scritto da un user che si chiama "aiuto", in un thread con un titolo del cavolo) mi passa la voglia di rispondere.
grazie!!
ho risolto comunque.
 
Stato
Discussione chiusa ad ulteriori risposte.