|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
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"); } |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
|
Codice:
ptr->nome[20]=dato[20];//assegna alla nuova memoria allocata il nuovo nodo Codice:
strncpy(ptr->nome, dato, 19); ptr->nome[19] = '\0'; // strncpy non assicura che ci sia il terminatore |
![]() |
![]() |
![]() |
#3 |
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"); } |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
|
ops niente letto male
ps: Codice:
printf("%s\n", pl->info); ![]() Ultima modifica di tuccio` : 02-07-2011 alle 13:59. |
![]() |
![]() |
![]() |
#5 |
Junior Member
Iscritto dal: May 2011
Messaggi: 17
|
|
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
|
|
![]() |
![]() |
![]() |
#7 |
Junior Member
Iscritto dal: May 2011
Messaggi: 17
|
ho editato come dici tu, ma non funzione ancora, mi stampa dei caratteri casuali
![]() |
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
|
ah, avevo dimenticato
Codice:
case 1: print_lista(&head); break; |
![]() |
![]() |
![]() |
#9 |
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"); } |
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
|
Codice:
scanf("%d",dato_e); Codice:
scanf("%d",&dato_e); |
![]() |
![]() |
![]() |
#11 |
Junior Member
Iscritto dal: May 2011
Messaggi: 17
|
|
![]() |
![]() |
![]() |
#12 |
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 |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 16:26.