#include #define ROZMIAR 25 typedef struct { int rok, miesiac, dzien; } tData; typedef struct { char nazwisko[ROZMIAR], imie[ROZMIAR]; tData dataUr; char kierunek[100]; }tStudent; typedef struct { tStudent student; struct tElement *prev, *next; }tElement; typedef tElement* tWsk; tWsk P=NULL, K=NULL; tStudent nowaOsoba(); void main() { int n; printf("Dane ilu osob chcesz dodac?: "); scanf("%d", &n); dodajDane(&P, &K, n); wyswietlListe(P); } int rokPrzest(int rok) { if((rok%4==0 && rok%100!=0)||rok%400==0) return 1; else return 0; } int maxDzienM(int rok, int miesiac) { switch(miesiac) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: return 31; case 2: if (rokPrzest(rok)) return 29; else return 28; case 4; case 6; case 9; case 11; return 30; default: return 0; } } int dataOK(tData x) { if(x.miesiac<1 || x.miesiac>12 || x.dzien<1 || x.dzien>maxDzienM(x.rok, x.miesiac)) return 0; else return 1; } tStudent nowaOsoba() { tStudent x; chara z printf("Nazwisko: "); scanf("%s", x.nazwisko); printf("Imie: "); scanf("%s", x.imie); printf("Data urodzenia(dzien miesiac rok): "); scanf("%d %d %d", &x.dataUr.dzien, &xdataUr.miesiac, x.dataUr.rok); while!dataOK(x.dataUr)) { printf("Data nieprawidlowa. \nSproboj ponownie:\n"); printf("Data urodzenia(dzien miesiac rok): "); scanf("%d%d%d", &x.dataUr.dzien, &x.dataUr.miesiac, &x.dataUr.rok); } return x; } wyswietlOsobe(tStudent x) { printf("%s %s %2d.%2d.%4d r.\n", x.nazwisko, x.imie, x.dataUr.dzien, x.dataUr.miesiac, x.dataUr.rok) } int dataNaLiczbe(Data x) { return (x.rok<<9)+(x.miesiac<<5) +x.dzien; } tWsk miejsceWstawienia(tWsk P, tStudent x) { int pom=dataNaLiczbe(x.dataUr); while(P!=NULL && pom>dataNaLiczbe(P->student.dataUr)) P=P->next; return P; } void dodajDoListy(tWsk *P, tWsk *K, tStudent x) { tWsk Q, W, pom; Q=(tElement*)malloc(sizeof(tElement)); Q->student=x; if(*P==NULL) { *P=Q; *K=Q; Q->prev=NULL; Q->next=NULL; } else { W=miejsceWstawienia*P, x); if(W==*P) { (*P)->prev=Q; Q->next=Q; Q->prev=*K; *K=Q; } else if(W==NULL) { (*K)->next=Q; Q->prev=*K; *K=Q; } else { pom=W->prev; pom->next=Q; Q->prev=W->prev; W->prev=Q; Q->next=W; } } } void wyswietlListe(tWsk P) { while(P!=NULL) { wyswietlOsobe(P->student); P=P->next; } } void dodajDane(tWsk *P, tWsk *K, int n) { int i; tStudent x; for(i=1; i<=n; i++) { printf("Wprowadz dane %d osoby:\n", i); x=nowaOsoba(); dodajDoListy(&(*P), &(*K), x); } }