Fisierul tip.h
/* tipul unui nod al listei ce implementeaza evidenta */
typedef struct nod_lista
{
char *nume; /* nume */
char *loc_munca; /* locul de munca */
int varsta; /* varsta */
struct nod_lista *alf; /* inlantuirea in ordine alfabetica */
struct nod_lista *varcr; /* inlantuirea in ordinea
crescatoarea a varstei */
struct nod_lista *vardes; /* inlantuirea in ordinea
descrescatoarea a varstei */
} nod;
/* operatiile asupra listei */
nod *cauta(char *);
void introdu(char *, char *, int);
void afis_alf(void);
void afis_des(void);
void afis_loc_munca(char *);
void afis_varsta(int);
void elimin(char *);
void elimin_loc_munca(char *);
Fisierul lista.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "tip.h"
static nod *inc1=NULL, *inc2=NULL, *inc3=NULL ;
/* nodurile listei sunt inlantuite dupa cele trei
criterii de ordonare */
/* cele trei liste sunt indicate de inc1, inc2 si inc3 */
/* inc1 indica lista ordonata in ordine alfabetica */
/* inc2 indica lista ordonata in ordinea crescatoare a varstei */
/* inc3 indica lista ordonata in ordinea descrecatoare a varstei*/
static nod *auxp; /* variabila auxiliara
folosita la eliminarea unui nod */
/*---------------------------------------------------------*/
/* */
/* cauta in lista ordonata alfabetic nodul care are */
/* numele egal cu parametrul n; */
/* returneaza pointerul la nod sau NULL */
/* */
/*---------------------------------------------------------*/
nod *cauta(char *n)
{
nod *l;
for(l=inc1; l!=NULL && strcmp(l->nume, n) < 0; l=l->alf);
/* parcurge lista cautand nodul cu nume egal cu n */
if (l!=NULL && strcmp(l->nume, n)==0)
/* daca nodul a fost gasit */
return l;
return NULL;
} /* cauta */
/*---------------------------------------------------------*/
/* */
/* scot1 elimina din lista ordonata alfabetic nodul */
/* care are numele egal cu parametrul l */
/* */
/*---------------------------------------------------------*/
nod *scot1(nod *p, char *l)
/* p este inceputul listei din care se face eliminarea */
{
nod *l1, *l2;
for(l1=l2=p; l1!=NULL && strcmp(l1->nume, l) < 0;
l2=l1, l1=l1->alf); /* se parcurge lista ordonata alfabetic
cautand nodul cu numele egal cu l */
if (l1!=NULL && strcmp(l1->nume, l) == 0)
/*daca s-a gasit nodul*/
if(l1 == l2 ) /* daca este primul nod in lista */
return p->alf;
else
{
l2->alf=l1->alf;
return p;
}
else /* nodul nu a fost gasit in lista */
{
printf("Eroare: %s nu apare in evidenta\n", l);
return p;
}
} /* scot1 */
/*---------------------------------------------------------*/
/* */
/* scot2 elimina din lista ordonata crescator dupa */
/* varsta, nodul care are numele egal cu parametrul l */
/* */
/*---------------------------------------------------------*/
nod *scot2(nod *p, char *l)
/* p este inceputul listei din care se face eliminarea */
{
nod *l1, *l2;
for (l1=l2=p; l1!=NULL && strcmp(l1->nume, l)!=0;
l2=l1, l1=l1->varcr); /* se parcurge lista ordonata
crescator functie de varsta cautand
nodul cu numele egal cu l */
if (l1!=NULL && strcmp(l1->nume, l)==0)
/* daca s-a gasit nodul */
if(l1 == l2 ) /* daca este primul nod in lista */
return p->varcr;
else
{
l2->varcr=l1->varcr;
return p;
}
else
{
printf("Eroare: %s nu apare in evidenta\n",l);
return p;
}
} /* scot2 */
/*---------------------------------------------------------*/
/* */
/* scot3 elimina din lista ordonata descrescator dupa */
/* varsta nodul care are numele egal cu parametrul l */
/* */
/*---------------------------------------------------------*/
nod *scot3(nod *p, char *l)
/* p este inceputul listei din care se face eliminarea */
{
nod *l1, *l2;
for (l1=l2=p; l1!=NULL && strcmp(l1->nume, l)!=0;
l2=l1, l1=l1->vardes); /* se parcurge lista ordonata
descrescator functie de varsta
cautand nodul cu numele egal cu l*/
if (l1!=NULL && strcmp (l1->nume, l)==0)
/* daca s-a gasit nodul */
{
auxp=l1; /* auxp indica spre nodul care se elimina */
if (l1==l2) /* daca este primul nod in lista */
return p->vardes;
else
{
l2->vardes=l1->vardes;
return p;
}
}
else
{
printf("Eroare: %s nu apare in evidenta\n", l);
return p;
}
} /* scot3 */
/*---------------------------------------------------------*/
/* */
/* intr1 introduce nodul indicat de l in lista */
/* ordonata alfabetic, cu adresa de inceput in p */
/* */
/*---------------------------------------------------------*/
nod *intr1(nod *p, nod *l)
/* p este inceputul listei in care se face introducerea */
/* l este nodul care este inserat */
{
nod *l1, *l2;
for(l1=l2=p; l1!=NULL && strcmp(l1->nume, l->nume)<0;
l2=l1, l1=l1->alf);
l->alf=l1;
if (l1==l2) /* daca nodul este inserat la inceputul listei */
return l;
else
{
l2->alf=l;
return p;
}
} /* intr1 */
/*----------------------------------------------------------*/
/* */
/* intr2 introduce nodul indicat de l in lista ordonata */
/* crescator functie de varsta, cu adresa de inceput in p */
/* */
/*----------------------------------------------------------*/
nod *intr2( nod *p, nod *l)
/* p este inceputul listei in care se face introducerea */
/* l este nodul care este inserat */
{
nod *l1, *l2;
for (l1=l2=p; l1!=NULL && l1->varsta<l->varsta;
l2=l1, l1=l1->varcr);
l->varcr=l1;
if (l1==l2) /* daca nodul este inserat la inceputul listei */
return l;
else
{
l2->varcr=l;
return p;
}
} /* intr2 */
/*---------------------------------------------------------*/
/* */
/* intr3 introduce nodul indicat de l in lista ordonata */
/* descrescator functie de varsta, */
/* cu adresa de inceput in p */
/* */
/*---------------------------------------------------------*/
nod *intr3(nod *p, nod *l)
/* p este inceputul listei in care se face introducerea */
/* l este nodul care este inserat */
{
nod *l1, *l2;
for (l1=l2=p; l1!=NULL && l1->varsta>l->varsta;
l2=l1, l1=l1->vardes);
l->vardes=l1;
if (l1==l2) /* daca nodul este inserat la inceputul listei */
return l;
else
{
l2->vardes=l;
return p;
}
} /* intr3 */
/*---------------------------------------------------------*/
/* */
/* introdu creeaza un nod nou pentru o persoana noua si il */
/* inlantuie in cele trei evidente */
/* */
/*---------------------------------------------------------*/
void introdu(char *n, char *lm, int v)
/* n reprezinta numele persoanei */
/* lm reprezinta locul de munca */
/* v reprezinta varsta */
{
nod *t;
if ((t=cauta(n))!=NULL)
/* daca exista deja o persoana cu numele n */
{
/* actualizeaza locul de munca */
free(t->loc_munca);
if ((t->loc_munca=(char*)malloc(strlen(lm)+1))==NULL)
{
printf("Eroare: memorie insuficienta\n");
exit(1);
}
else
{
strcpy(t->loc_munca, lm); /* noul loc de munca */
t->varsta=v; /* noua varsta */
inc2=scot2(inc2, t->nume);
/* elimina nodul din lista ordonata crescator dupa varsta */
inc2=intr2(inc2, t);
/* introdu nodul in lista ordonata crescator dupa varsta */
inc3=scot3(inc3, t->nume);
/*elimina nodul din lista ordonata descrescator dupa varsta*/
inc3=intr3(inc3, t);
/* introdu nodul in lista ordonata crescator dupa varsta */
}
}
else /* daca nodul nu apare in evidenta */
/* aloca memorie pentru nod */
if ((t=(nod*)malloc(sizeof(nod)))==NULL ||
(t->nume=(char*)malloc(strlen(n)+1))==NULL ||
(t->loc_munca=(char*)malloc(strlen(lm)+1))==NULL)
{
printf("Eroare: memorie insuficienta\n");
exit(1);
}
else
{
/* initializeaza campurile nodului nou */
strcpy(t->nume, n);
strcpy(t->loc_munca, lm);
t->varsta=v;
inc1=intr1(inc1, t); /* nodul este introdus in lista 1 */
inc2=intr2(inc2, t); /* nodul este introdus in lista 2 */
inc3=intr3(inc3, t); /* nodul este introdus in lista 3 */
}
} /* introdu */
/*---------------------------------------------------------*/
/* */
/* parcurge lista ordonata alfabetic si afiseaza evidenta */
/* */
/*---------------------------------------------------------*/
void afis_alf(void)
{
nod *p;
for (p=inc1; p!=NULL ; p=p->alf)
/* parcurge lista ordonata alfabetic */
{
printf("Nume: %s\n", p->nume);
printf("Loc de munca: %s\n", p->loc_munca);
printf("varsta: %d\n\n", p->varsta);
}
} /* afis_alf */
/*---------------------------------------------------------*/
/* */
/* afiseaza evidenta in ordinea descrescatoare a varstei */
/* */
/*---------------------------------------------------------*/
void afis_des(void)
{
nod *p;
for (p=inc3; p!=NULL; p=p->vardes)
/*parcurge lista ordonata descrescator in functie de varsta*/
printf("Nume: %s\n", p->nume);
} /* afis_des */
/*---------------------------------------------------------*/
/* */
/* afiseaza ordonat alfabetic persoanele cu locul */
/* de munca lm */
/* */
/*---------------------------------------------------------*/
void afis_loc_munca(char *lm)
{
nod *l;
for (l=inc1; l!=NULL; l=l->alf)
/* parcurge lista ordonata alfabetic */
if (strcmp(l->loc_munca, lm)==0)
/* daca are locul de munca egal cu lm */
printf(" Nume: %s\n", l->nume);
} /* afis_loc_munca */
/*---------------------------------------------------------*/
/* */
/* afis_varsta parcurge lista ordonata crescator functie */
/* de varsta si afiseaza toate persoanele care au */
/* varsta >= ca si v */
/* */
/*---------------------------------------------------------*/
void afis_varsta(int v)
{
nod *l;
for (l=inc2; l!=NULL; l=l->varcr)
/* se parcurge lista ordonata functie de varsta */
if (l->varsta>=v) /* daca varsta este >= ca si limita v */
printf("Nume: %s\n", l->nume);
} /* afis_varsta */
/*---------------------------------------------------------*/
/* elimin scoate persoana cu numele egal cu s din evidenta */
/* */
/*---------------------------------------------------------*/
void elimin(char *s)
{
if (cauta(s)) /* daca s apare in evidenta */
{
inc1=scot1(inc1, s); /* scoate nodul din lista 1 */
inc2=scot2(inc2, s); /* scoate nodul din lista 2 */
inc3=scot3(inc3, s); /* scoate nodul din lista 3 */
/* elibereaza memoria ocupata de nodul eliminat */
free (auxp->nume);
free (auxp->loc_munca);
free (auxp);
}
else
printf("Persoana %s nu apare in evidenta\n");
} /* elimin */
/*---------------------------------------------------------*/
/* */
/* elimin_loc_munca elimina persoanele avind locul */
/* de munca egal cu s */
/* */
/*---------------------------------------------------------*/
void elimin_loc_munca(char *s)
{
nod *l, *aux;
for (l=inc1; l!=NULL; )
if (strcmp(l->loc_munca, s)==0)
/* s-a gasit o persoana cu locul de munca cautat */
{
aux=l->alf;
elimin(l->nume); /* elimina persoana gasita */
l=aux;
}
else
l=l->alf;
} /* elimin_loc_munca */
Fisierul main.c
#include <stdio.h>
#include <conio.h>
#include "tip.h"
/*---------------------------------------------------------*/
/* */
/* Functia meniu afiseaza meniul programului, citeste */
/* comanda si apeleaza rutina care implementeaza */
/* functionalitatea comenzii respective */
/* */
/*---------------------------------------------------------*/
void meniu(void)
{
char c, s[30], lm[30];
int v;
nod *t;
while (1)
{
clrscr();
printf("a- Introducerea unei persoane noi in evidenta\n");
printf("t- Cautarea unui nume in evidenta\n");
printf("l- Tipareste persoanele cu un anumit loc de munca\n");
printf("p- Afiseaza persoanele de varsta mai mare sau
egala cu o valoare citita\n");
printf("s- Elimina o persoana din evidenta\n");
printf("d- Elimina persoanele cu un anumit loc de munca\n");
printf("n- Afiseaza alfabetic persoanele din evidenta\n");
printf("v- Afiseaza persoanele in ordinea descrescatoare
a varstei\n");
printf("f- Termina programul\n\n\n");
printf(" Introduceti optiunea: ");
c=getchar(); getchar(); /* citeste optiunea */
switch( c )
{
case 'a':
printf("Numele persoanei: "); gets(s); /* citeste numele */
printf(" Locul de munca: "); gets(lm);
/* citeste locul de munca */
printf(" Varsta: "); scanf("%d", &v); getchar();
/* citeste varsta */
introdu(s, lm, v);
/* persoana si datele aferente sunt introduse in evidenta */
break;
case 'v':
afis_des();
/* tipareste evidenta in ordinea descrescatoare a varstei */
break;
case 't':
printf("Numele persoanei: "); gets(s); /* citeste numele */
if ((t=cauta(s))!=NULL) /*daca persoana apare in evidenta*/
{
printf("Nume: %s\n", t->nume);
printf("Loc de munca: %s\n", t->loc_munca);
printf("varsta: %d\n", t->varsta);
}
else
printf("%s nu apare in evidenta\n",s);
break;
case 'l':
printf(" Locul de munca: "); gets(lm); /* citeste numele */
afis_loc_munca(lm);
/* afiseaza persoanele cu locul de munca citit */
break;
case 'p':
printf(" varsta limita: ");
scanf("%d", &v);
/* citeste varsta */
getchar();
afis_varsta(v);
/* afiseaza persoanele cu varsta >= ca limita */
break;
case 's':
printf(" Numele persoanei: "); gets(s); /* citeste numele */
elimin(s); /* elimina persoana cu numele s din evidenta */
break;
case 'd':
printf(" Locul de munca: "); gets(lm); /* citeste numele */
elimin_loc_munca(lm);
/* elimina persoanele cu un anumit loc de munca */
break;
case 'n':
afis_alf();
/* afiseaza evidenta in ordine alfabetica */
break;
case 'f':
return; /* incheie meniu */
}
getchar();
}
} /* meniu */
/*---------------------------------------------------------*/
/* */
/* Functia main apeleaza functia meniu */
/* */
/*---------------------------------------------------------*/
void main()
{
meniu();
} /* main */