Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Google Pixel 10 è compatto e ha uno zoom 5x a 899€: basta per essere un best-buy?
Google Pixel 10 è compatto e ha uno zoom 5x a 899€: basta per essere un best-buy?
Google Pixel 10 è uno smartphone che unisce una fotocamera molto più versatile rispetto al passato grazie allo zoom ottico 5x, il supporto magnetico Pixelsnap e il nuovo chip Tensor G5. Il dispositivo porta Android 16 e funzionalità AI avanzate come Camera Coach, mantenendo il design caratteristico della serie Pixel con miglioramenti nelle prestazioni e nell'autonomia. In Italia, però, mancano diverse feature peculiari basate sull'AI.
Prova GeForce NOW upgrade Blackwell: il cloud gaming cambia per sempre
Prova GeForce NOW upgrade Blackwell: il cloud gaming cambia per sempre
L'abbonamento Ultimate di GeForce NOW ora comprende la nuova architettura Blackwell RTX con GPU RTX 5080 che garantisce prestazioni tre volte superiori alla precedente generazione. Non si tratta solo di velocità, ma di un'esperienza di gioco migliorata con nuove tecnologie di streaming e un catalogo giochi raddoppiato grazie alla funzione Install-to-Play
Ecovacs Deebot X11 Omnicyclone: niente più sacchetto per lo sporco
Ecovacs Deebot X11 Omnicyclone: niente più sacchetto per lo sporco
Deebot X11 Omnicyclone implementa tutte le ultime tecnologie Ecovacs per l'aspirazione dei pavimenti di casa e il loro lavaggio, con una novità: nella base di ricarica non c'è più il sacchetto di raccolta dello sporco, sostituito da un aspirapolvere ciclonico che accumula tutto in un contenitore rigido
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 02-07-2011, 11:47   #1
devil_prince
Junior Member
 
Iscritto dal: May 2011
Messaggi: 17
[C]Lista lineare che non và

Ragazzi devo creare questa lista lineare completa di menù per inserimento, eliminazione e visualizzazione della lista. Per ora ho implementato l'inserimento in testa e la visualizzazione, ma mi danno dei problemi. Provando col debbagger è come se la function dell'inserimento in testo non aggiornasse i puntatori dopo aver inserito l'elemento...vi passo il codice:
Codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct persona{
              char nome[20];
              struct persona *p_next;} Persona;


void insl_testa(char [] , Persona **);
void insl_nodo(char [] , Persona **);
void print_lista(Persona *);
void main ()
{
    int op, menu=100;
    Persona *head, *punt;
    char dato[20];
   head=NULL;//creiamo la lista
  while (menu<=100){
  puts("\n\n\n=======================");
puts("GESTIONE DI UNA LISTA");
puts("=======================\n\n");
puts("Selezionare l'operazione:\n");
puts("1=Visualizzare la lista");
puts("2=Inserire un elemento");
puts("3=eliminare un elemento");
scanf("%d",&op);

switch (op) {
case 1: print_lista(&head); break;
case 2 :     printf("Inserie il nuovo nome: ");scanf("%s",dato);
             insl_testa(dato,&head);
         /*else {
             printf("Inserie il nuovo nome: ");scanf("%s",dato);
            insl_nodo(dato,&punt);} break;*/

    }
  }
}
void insl_testa (char dato[20], Persona **p_head)
{
    Persona *ptr;
    ptr=calloc(1,sizeof(Persona));//allochiamo memoria per il nuovo nodo
    ptr->nome[20]=dato[20];//assegna alla nuova memoria allocata il nuovo nodo
    ptr->p_next=*p_head;//il puntatore successivo assume il valore di quello di testa (cioè il punt di testa non è più di testa)
    *p_head=ptr;//aggiorniamo head al nuovo nodo, il nuovo nodo diventa puntato dal puntatore di testa
}
void insl_nodo(char dato[20], struct persona **p_punt)
{
    struct persona *ptr;
    ptr=calloc(1,sizeof(struct persona));
    ptr->nome[20]=dato[20];
    ptr->p_next=(*p_punt)->p_next;
    (*p_punt)->p_next=ptr;
    *p_punt=ptr;
}
void print_lista(Persona *pl)
{
    printf("\n\n");
    printf("lista: ");
    while (pl){
        printf("%s\n", pl->nome[20]);
        pl = pl->p_next;
            }
    printf("\n\n");
}
devil_prince è offline   Rispondi citando il messaggio o parte di esso
Old 02-07-2011, 13:04   #2
tuccio`
Senior Member
 
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
Codice:
    ptr->nome[20]=dato[20];//assegna alla nuova memoria allocata il nuovo nodo
forse quello che intendevi era questo?

Codice:
strncpy(ptr->nome, dato, 19);
ptr->nome[19] = '\0'; // strncpy non assicura che ci sia il terminatore
tuccio` è offline   Rispondi citando il messaggio o parte di esso
Old 02-07-2011, 13:18   #3
devil_prince
Junior Member
 
Iscritto dal: May 2011
Messaggi: 17
no infatti mi sono accorto anche io di questo errore, ora ho fatto due struct così posso usare '=' come assegnazione
Codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct info{
                char nome[20];} Info;
typedef struct persona{
              Info info;
              struct persona *p_next;} Persona;


void insl_testa(Info , Persona **);
void insl_nodo(char [] , Persona **);
void print_lista(Persona *);
void main ()
{
    int op, menu=100;
    Persona *head, *punt;
    Info dato;
   head=NULL;//creiamo la lista
  while (menu<=100){
  puts("\n\n\n=======================");
puts("GESTIONE DI UNA LISTA");
puts("=======================\n\n");
puts("Selezionare l'operazione:\n");
puts("1=Visualizzare la lista");
puts("2=Inserire un elemento");
puts("3=eliminare un elemento");
scanf("%d",&op);

switch (op) {
case 1: print_lista(&head); break;
case 2 :     printf("Inserie il nuovo nome: ");scanf("%s",dato.nome);
             insl_testa(dato,&head); break;
         /*else {
             printf("Inserie il nuovo nome: ");scanf("%s",dato);
            insl_nodo(dato,&punt);} break;*/

    }
  }
}
void insl_testa (Info dato, Persona **p_head)
{
    Persona *ptr;
    ptr=calloc(1,sizeof(Persona));//allochiamo memoria per il nuovo nodo
    ptr->info=dato;//assegna alla nuova memoria allocata il nuovo nodo
    ptr->p_next=*p_head;//il puntatore successivo assume il valore di quello di testa (cioè il punt di testa non è più di testa)
    *p_head=ptr;//aggiorniamo head al nuovo nodo, il nuovo nodo diventa puntato dal puntatore di testa
}
/*void insl_nodo(char dato[20], struct persona **p_punt)
{
    struct persona *ptr;
    ptr=calloc(1,sizeof(struct persona));
    ptr->nome[20]=dato[20];
    ptr->p_next=(*p_punt)->p_next;
    (*p_punt)->p_next=ptr;
    *p_punt=ptr;
}*/
void print_lista(Persona *pl)
{
    printf("\n\n");
    printf("lista: ");
    while (pl){
        printf("%s\n", pl->info);
        pl = pl->p_next;
            }
    printf("\n\n");
}
solo che ho ancora problemi quando stampo la lista...mi stampa solo l'ultimo nome che ho inserito e poi subito dopo <null>
devil_prince è offline   Rispondi citando il messaggio o parte di esso
Old 02-07-2011, 13:33   #4
tuccio`
Senior Member
 
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
ops niente letto male

ps:

Codice:
        printf("%s\n", pl->info);
eseguendo il tuo codice, ma stampando pl->info.nome invece di pl->info funziona, onestamente non me lo saprei spiegare, visto che non mi sembra sensato il padding di una struct che contiene un array di char, però va be'

Ultima modifica di tuccio` : 02-07-2011 alle 13:59.
tuccio` è offline   Rispondi citando il messaggio o parte di esso
Old 02-07-2011, 13:44   #5
devil_prince
Junior Member
 
Iscritto dal: May 2011
Messaggi: 17
Quote:
Originariamente inviato da tuccio` Guarda i messaggi
ops niente letto male
scusa, che significa?
devil_prince è offline   Rispondi citando il messaggio o parte di esso
Old 02-07-2011, 14:01   #6
tuccio`
Senior Member
 
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
Quote:
Originariamente inviato da devil_prince Guarda i messaggi
scusa, che significa?
che avevo risposto, ma avevo letto la parte commentata del codice e non posso deletare i post

comunque ho editato sopra, leggi
tuccio` è offline   Rispondi citando il messaggio o parte di esso
Old 02-07-2011, 14:16   #7
devil_prince
Junior Member
 
Iscritto dal: May 2011
Messaggi: 17
ho editato come dici tu, ma non funzione ancora, mi stampa dei caratteri casuali
devil_prince è offline   Rispondi citando il messaggio o parte di esso
Old 02-07-2011, 14:22   #8
tuccio`
Senior Member
 
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
ah, avevo dimenticato

Codice:
case 1: print_lista(&head); break;
questo l'hai editato in print_lista(head) ?
tuccio` è offline   Rispondi citando il messaggio o parte di esso
Old 02-07-2011, 14:38   #9
devil_prince
Junior Member
 
Iscritto dal: May 2011
Messaggi: 17
Ok ultima versione...ho aggiunto anche il campo eta, ma mi crasha quando inserisco le informazioni con la scanf
Codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct persona{
           char nome[20];
           short eta;
           struct persona *p_next;} Persona;


void insl_testa(char [] , short , Persona **);
void insl_nodo(char [] , short, Persona **);
void print_lista(Persona *);
void main ()
{
   int op, menu=100;
   Persona *head, *punt;
   char dato_n[20]; short dato_e;
   head=NULL;//creiamo la lista

   while (menu<=100)
   {
      puts("\n\n\n=======================");
      puts("GESTIONE DI UNA LISTA");
      puts("=======================\n\n");
      puts("Selezionare l'operazione:\n");
      puts("1=Visualizzare la lista");
      puts("2=Inserire un elemento");
      puts("3=eliminare un elemento");
      scanf("%d",&op);

      switch (op)
      {
         case 1: print_lista(head); break;

         case 2 :if (head==NULL){
                    printf("Inserie il nuovo nome: ");scanf("%s",dato_n);
                    printf("Inserie l'eta': ");scanf("%d",dato_e);
                    insl_testa(dato_n,dato_e,&head); break;}
                else{
                    printf("Inserie il nuovo nome: ");scanf("%s",dato_n);
                    printf("Inserie l'eta': ");scanf("%d",dato_e);
                    insl_nodo(dato_n,dato_e,&punt); break;}
       }
   }
}
void insl_testa (char dato_n[20], short dato_e, Persona **p_head)
{
   Persona *ptr;
   ptr=calloc(1,sizeof(Persona));//allochiamo memoria per il nuovo nodo
   strcpy(ptr->nome,dato_n);//assegna alla nuova memoria allocata il nuovo nodo
   ptr->eta=dato_e;
   ptr->p_next=*p_head;//il puntatore successivo assume il valore di quello di testa (cioè il punt di testa non è più di testa)
   *p_head=ptr;//aggiorniamo head al nuovo nodo, il nuovo nodo diventa puntato dal puntatore di testa
}
void insl_nodo(char dato_n[20], short dato_e, struct persona **p_punt)
{
   struct persona *ptr;
   ptr=calloc(1,sizeof(struct persona));
   strcpy(ptr->nome,dato_n);
   ptr->eta=dato_e;
   ptr->p_next=(*p_punt)->p_next;
   (*p_punt)->p_next=ptr;
   *p_punt=ptr;
}
void print_lista(Persona *pl)
{
   printf("\n\n");
   printf("lista: \n");
   while (pl){
      printf("%s\n", pl->nome);
      pl = pl->p_next;
         }
   printf("\n\n");
}
devil_prince è offline   Rispondi citando il messaggio o parte di esso
Old 02-07-2011, 15:12   #10
tuccio`
Senior Member
 
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
Codice:
scanf("%d",dato_e);
dovrebbe essere
Codice:
scanf("%d",&dato_e);
tuccio` è offline   Rispondi citando il messaggio o parte di esso
Old 02-07-2011, 15:15   #11
devil_prince
Junior Member
 
Iscritto dal: May 2011
Messaggi: 17
Quote:
Originariamente inviato da tuccio` Guarda i messaggi
Codice:
scanf("%d",dato_e);
dovrebbe essere
Codice:
scanf("%d",&dato_e);
Si hai ragione
devil_prince è offline   Rispondi citando il messaggio o parte di esso
Old 02-07-2011, 16:01   #12
devil_prince
Junior Member
 
Iscritto dal: May 2011
Messaggi: 17
Ora ho creato anche una funzione per l'inserimento in coda, però appena inserisco il secondo nome il primo assume valori random sia se uso la funzione in testa sia quella in cosa, perde il valore precedentemente meorizzato, come faccio per conervarlo?
Codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct{
            char nome[20];
            short eta;} Info;
typedef struct persona{
           Info info;
           struct persona *p_next;} Persona;


void insl_testa(Info , Persona **);
void insl_coda (Info , Persona **);
void insl_nodo(Info , Persona **);
void print_lista(Persona *);
void main ()
{
   int op, menu=100;
   Persona *head, *punt;
   Info dato;
   head=NULL;//creiamo la lista

   while (menu<=100)
   {
      puts("\n\n\n=======================");
      puts("GESTIONE DI UNA LISTA");
      puts("=======================\n\n");
      puts("Selezionare l'operazione:\n");
      puts("1=Visualizzare la lista");
      puts("2=Inserire un elemento");
      puts("3=eliminare un elemento");
      scanf("%d",&op);

      switch (op)
      {
         case 1: print_lista(head); break;

         case 2 :if (head==NULL){
                    printf("Inserie il nuovo nome: ");scanf("%s",dato.nome);
                    printf("Inserie l'eta': ");scanf("%d",&dato.eta);
                    insl_testa(dato,&head);break;}
                else{
                    printf("Inserie il nuovo nome: ");scanf("%s",dato.nome);
                    printf("Inserie l'eta': ");scanf("%d",&dato.eta);
                        if(strcmp(punt->info.nome,dato.nome)<0){
                            insl_testa(dato,&head);}
                        else{
                            insl_coda(dato,&head);}

                     }; break;
       }
   }
}
void insl_testa (Info dato, Persona **p_head)
{
   Persona *ptr;
   ptr=calloc(1,sizeof(Persona));//allochiamo memoria per il nuovo nodo
   //assegna alla nuova memoria allocata il nuovo nodo
   ptr->info=dato;
   ptr->p_next=*p_head;//il puntatore successivo assume il valore di quello di testa (cioè il punt di testa non è più di testa)
   *p_head=ptr;//aggiorniamo head al nuovo nodo, il nuovo nodo diventa puntato dal puntatore di testa
}
/*void insl_nodo(char dato_n[20], short dato_e, struct persona **p_punt)
{
   struct persona *ptr;
   ptr=calloc(1,sizeof(struct persona));
   strcpy(ptr->nome,dato_n);
   ptr->eta=dato_e;
   ptr->p_next=(*p_punt)->p_next;
   (*p_punt)->p_next=ptr;
   *p_punt=ptr;
}*/
void insl_coda (Info dato, Persona **p_head)
{
    Persona *ptr;
    ptr=calloc(1,sizeof(Persona));
    ptr->info=dato;
    ptr->p_next=NULL;
    (*p_head)->p_next=ptr;
}
void print_lista(Persona *pl)
{
   printf("\n\n");
   printf("lista: \n");
   while (pl){
      printf("%s\t%d\n", pl->info.nome,pl->info.eta);
      pl = pl->p_next;
         }
   printf("\n\n");
}

Ultima modifica di devil_prince : 02-07-2011 alle 16:49. Motivo: aggiornato
devil_prince è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Google Pixel 10 è compatto e ha uno zoom 5x a 899€: basta per essere un best-buy? Google Pixel 10 è compatto e ha uno zoom ...
Prova GeForce NOW upgrade Blackwell: il cloud gaming cambia per sempre Prova GeForce NOW upgrade Blackwell: il cloud ga...
Ecovacs Deebot X11 Omnicyclone: niente più sacchetto per lo sporco Ecovacs Deebot X11 Omnicyclone: niente più...
Narwal Flow: con il mocio orizzontale lava i pavimenti al meglio Narwal Flow: con il mocio orizzontale lava i pav...
Panasonic 55Z95BEG cala gli assi: pannello Tandem e audio senza compromessi Panasonic 55Z95BEG cala gli assi: pannello Tande...
Novità dalle analisi dell'asteroi...
La PS6 sarà più potente del previsto: ec...
Sony svela Xperia 10 VII: è il nu...
Amazon Weekend da urlo: iPhone 16 a prez...
Spotify diffida ReVanced: chiesta la rim...
Spazzolini elettrici Oral-B iO in super ...
Samsung Galaxy Watch8 Classic e Watch7 a...
Blue Origin prosegue lo sviluppo di Blue...
Roborock Saros 10 e 10R dominano il merc...
Apple scatenata su Amazon: tutti gli sco...
Canon EOS C50 è la nuova videocam...
ASUS ProArt P16 arriva in Italia: la wor...
Fujifilm presenta l'obiettivo FUJINON GF...
Il grafene ha appena 'infranto' una legg...
Metroid Prime Beyond: arriva un trailer ...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 16:26.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v