Krat0s
18-05-2011, 21:21
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.
#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;
}
}
Secondo le intenzioni utilizzo due liste, una per i dipendenti e l'altra con gli indirizzi che puntano agli elementi cercati....se qualcuno può dargli un'occhiata...
#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;
}
}
Secondo le intenzioni utilizzo due liste, una per i dipendenti e l'altra con gli indirizzi che puntano agli elementi cercati....se qualcuno può dargli un'occhiata...