|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Jun 2008
Messaggi: 109
|
[C] Problema con le liste
Ciao a tutti....mi hanno introdotto ieri le liste all'università e ho provato a fare un programmino. Praticamente inserisco il numero di dipendenti dell'azienda, i loro dati (nome e data di assunzione), inserisco un anno da ricercare e mi restituisce i nomi dei dipendenti assunti in quell'anno. Solamente che se io lo faccio partire in modalità debug mi funziona, altrimenti no. Uso Dev C++ su win Xp.
Codice:
#include <stdio.h>
#include <stdlib.h>
struct data {int giorno,mese,anno;};
typedef struct data Data;
struct dipendente { char nome[20];
Data datassunzione;
};
typedef struct dipendente dip;
struct El { dip info;
struct El *next;
};
typedef struct El elemento;
typedef elemento *Listadidipendenti;
struct Punt { elemento *puntatore;
struct Punt *next;};
typedef struct Punt puntavalore;
typedef puntavalore *Listadipuntatori;
void Inizializza(Listadidipendenti *lista);
void Inizializza2(Listadipuntatori *lispunt);
void Inseriscidati(Listadidipendenti *lista,int numero);
void Ricerca(Listadidipendenti lista,Listadipuntatori *lispunt, int anno);
void Scrivilista(Listadipuntatori lispunt);
main()
{
int numerodip,anno;
Listadidipendenti lista;
Listadipuntatori listapunt;
Inizializza(&lista);
Inizializza2(&listapunt);
printf("Inserire il numero di dipendenti: ");
scanf("%d",&numerodip);
Inseriscidati(&lista,numerodip);
printf("\n\nInserire l'anno da cercare: ");
scanf("%d",&anno);
Ricerca(lista,&listapunt,anno);
printf("\n\nLISTA DEI DIPENDENTI ASSUNTI NELL'ANNO %d:\n",anno);
Scrivilista(listapunt);
system("PAUSE");
}
void Inizializza(Listadidipendenti *lista)
{
*lista = NULL;
}
void Inizializza2(Listadipuntatori *lispunt)
{
*lispunt = NULL;
}
void Inseriscidati(Listadidipendenti *lista,int numero)
{
int i,j;
char c;
Listadidipendenti aux;
for (i=1;i<=numero;i++) {
aux=malloc(sizeof(dip));
printf("\nInserire il nome del dipendente numero %d: ",i);
for (j=0;j<20;j++) aux->info.nome[j] = '0';
j=1;
scanf("%c",&c);
do { scanf("%c",&c);
if (c != '\n') aux->info.nome[j] = c;
j++;
}
while (c!='\n');
printf("Inserire la data di assunzione: ");
scanf("%d %d %d",&aux->info.datassunzione.giorno,&aux->info.datassunzione.mese,&aux->info.datassunzione.anno);
aux->next = *lista;
*lista = aux;
}
}
void Ricerca(Listadidipendenti lista,Listadipuntatori *lispunt, int anno)
{
Listadipuntatori aux;
while (lista!=NULL) {
if (lista->info.datassunzione.anno == anno) {
aux = malloc(sizeof(puntavalore));
aux->puntatore = lista; aux->next=*lispunt;
*lispunt = aux;
}
lista = lista->next;
}
}
void Scrivilista(Listadipuntatori lispunt)
{
int i=0;
while (lispunt != NULL) {
i=0;
while (lispunt->puntatore->info.nome[i]!='0') { putchar(lispunt->puntatore->info.nome[i]);
i++;
}
printf("\n");
lispunt= lispunt->next;
}
}
|
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Feb 2006
Città: Parma
Messaggi: 3010
|
Varie osservazioni:
Frammenti esemplicativi: Codice:
struct dipendente
{
char nome[ LENGTH_NOME ];
Data datassunzione;
};
typedef struct dipendente Dipendente;
struct elemento
{
Dipendente info;
struct elemento *next;
};
typedef struct elemento El;
void InserisciDati( El **lista, const int numero )
{
int i;
El *aux;
for( i = 1; i <= numero; ++i )
{
aux = (El*)malloc( sizeof( El ) );
memset( (void*)aux, 0x00, sizeof( El ) );
printf( "\nInserire il nome del dipendente numero %d: ", i );
scanf( "%s", aux->info.nome );
printf( "Inserire la data di assunzione.\n" );
printf( "Giorno: " );
scanf( "%d", &aux->info.datassunzione.giorno );
printf( "Mese: " );
scanf( "%d", &aux->info.datassunzione.mese );
printf( "Anno: " );
scanf( "%d", &aux->info.datassunzione.anno );
aux->next = *lista;
*lista = aux;
}
}
__________________
~Breve riferimento ai comandi GNU/Linux (ormai non molto breve...) |
|
|
|
|
|
#3 |
|
Member
Iscritto dal: Jun 2008
Messaggi: 109
|
Domani do un'occhiata più lucida a ciò che hai scritto e al codice....a caldo ti posso dire che il typedef che mi hai segnalato lo usa la prof nel codice e almeno per ora ce lo devo mettere perchè è una che vuole vedere le cose scritte come le spiega lei....per l'immissione del nome non abbiamo visto le stringhe, quindi ho fatto un pò a caso....darò un'occhiata, e cerco di snellire il tutto. Ma sul codice hai visto qualche errore che mi può pregiudicare il funzionamento del programma?
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Feb 2006
Città: Parma
Messaggi: 3010
|
Direi che non torna la dimensione di questo malloc:
Codice:
void Inseriscidati(Listadidipendenti *lista,int numero)
{
int i,j;
char c;
Listadidipendenti aux;
for (i=1;i<=numero;i++) {
aux=malloc(sizeof(dip));
Poi c'è un errore nelle stringhe Krat0s: tutti gli info.nome iniziano con un cararattere '0' per colpa di j.
__________________
~Breve riferimento ai comandi GNU/Linux (ormai non molto breve...) |
|
|
|
|
|
#5 |
|
Member
Iscritto dal: Jun 2008
Messaggi: 109
|
Perfetto, corretti gli errori....poi mi metterò a sistemare il resto ed ottimizzare il tutto...grazie per l'aiuto
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 12:47.


















