#include #include #include #include #include //definirea clasei persoana class persoana { public: char nume[20],locatie[20]; int telefon; persoana(char num[20]="necunoscut", char loc[20]="necunoscuta", int tel=0) { strcpy(nume,num); strcpy(locatie,loc); telefon=tel; }; friend ostream& operator<<(ostream &iesire, persoana &p) { iesire<>(istream &intrare, persoana &p) { cout<<"Introduceti informatiile "<<"\n"; cout<<"Nume: "; intrare>>p.nume; cout<<"Locatie: "; intrare>>p.locatie; cout<<"Nr telefon: "; intrare>>p.telefon; return intrare; } int operator ==(persoana a) { return strcmp(a.nume,nume)==0?1:0; } }; //definirea clasei nod template class nod { public: tip info; nod *next; }; //definirea clasei lista template class lista { friend class agenda; public: nod *cap; lista() { cap=NULL; } lista(const lista &l) { nod *p,*aux; if (l.cap) { cap= new nod; cap->info=l.cap->info; cap->next=NULL; aux=l.cap->next; while (aux) { p=new nod; p->info=aux->info; p->next=cap; cap=p; aux=aux->next; } } else cap=NULL; } ~lista() { while(cap) { nod *temp=cap; cap=temp->next; delete(temp); } }; void inserare(tip inf); void stergere(tip inf); friend ostream& operator <<(ostream& ies, lista l) { nod *aux; aux=l.cap; while(aux) { ies<info.nume<<" "<info.locatie<<" "<info.telefon<next; } return ies; } nod* operator[](tip inf); }; //se incheie definirea template void lista::inserare(tip inf) { nod *nou; nou = new nod; nou->info=inf; nou->next=cap; cap=nou; } template void lista::stergere(tip inf) { nod *temp, *aux; if(cap) { temp = cap; if(cap->info==inf) { cap=temp->next; delete(temp); } else { while(temp->next) { aux=temp->next; if (aux->info==inf) { temp->next=aux->next; delete(aux); } else temp=temp->next; } } } }; template nod* lista::operator[](tip inf) { nod *temp=cap; while(temp) { if(inf==temp->info) return temp; temp=temp->next; } return NULL; }; //definirea clasei agenda class agenda { public: friend class lista; lista lprim,lsortn,lsortl,lsortt; bool altalista(lista *caps,nod *aux); void sortnume(); void sortlocatie(); void sorttelefon(); nod* operator<<(int tel); nod* operator>>(int tel); friend ostream& operator<<(ostream &ies,agenda a) { nod *aux; aux=a.lsortn.cap; while(aux) { ies<info.nume<<" "<info.locatie<<" "<info.telefon<next; } return ies; }; nod * search(char abv[20]) { nod *p; for(p=lsortn.cap; p && !strstr(p->info.nume,abv); p=p->next); return p; } }; nod* agenda::operator <<(int tel) { if(tel==lsortt.cap->info.telefon)return NULL; else { nod *temp=lsortt.cap->next; if(tel==temp->info.telefon) return lsortt.cap; else { nod *aux=temp; temp=temp->next; while(!temp) if(tel==temp->info.telefon) return aux; else { aux=temp; temp=temp->next; } } } } nod* agenda::operator >>(int tel) { if (lsortt.cap) { if(tel==lsortt.cap->info.telefon) return lsortt.cap->next; else {nod *temp=lsortt.cap->next; while(temp) if(tel==temp->info.telefon) return temp->next; else temp=temp->next; } } } void agenda::sortnume() { nod *p; if(lprim.cap) { //Daca mai avem inainte o lista, o stergem if (lsortn.cap) while (lsortn.cap) { p=lsortn.cap; lsortn.cap=lsortn.cap->next; delete p; } else //o facem { nod *aux; for(p=lprim.cap; p; p=p->next) { aux=new nod;//aux este nodul pe care-l copii din lprim in lsortn strcpy(aux->info.nume, p->info.nume); strcpy(aux->info.locatie, p->info.locatie); aux->info.telefon=p->info.telefon; nod *temp, *trace; //asta daca e primul nod if (!lsortn.cap) { lsortn.cap=aux; aux->next=NULL; } else { temp=lsortn.cap; trace=NULL; while (temp && (strcmp(aux->info.nume,temp->info.nume)<0)) { trace=temp; temp=temp->next; } if (!temp) //adaug la sfarsit { aux->next=NULL; trace->next=aux; } else //adaug in interior if (trace) { aux->next=trace->next; trace->next=aux; } else //daca e la inceput { aux->next=lsortn.cap; lsortn.cap=aux; } } } } } else lsortn.cap=NULL; } void agenda::sortlocatie() { nod *p; if(lprim.cap) { //Daca mai avem inainte o lista, o stergem if (lsortl.cap) while (lsortl.cap) { p=lsortl.cap; lsortl.cap=lsortl.cap->next; delete p; } else //o facem { nod *aux; for(p=lprim.cap; p; p=p->next) { aux=new nod;//aux este nodul pe care-l copiez din lprim in lsortl strcpy(aux->info.nume, p->info.nume); strcpy(aux->info.locatie, p->info.locatie); aux->info.telefon=p->info.telefon; nod *temp, *trace; //asta daca e primul nod if (!lsortl.cap) { lsortl.cap=aux; aux->next=NULL; } else { temp=lsortl.cap; trace=NULL; while (temp && (strcmp(aux->info.locatie,temp->info.locatie)<0)) { trace=temp; temp=temp->next; } if (!temp) //adaug la sfarsit { aux->next=NULL; trace->next=aux; } else //adaug in interior if (trace) { aux->next=trace->next; trace->next=aux; } else //daca e la inceput { aux->next=lsortl.cap; lsortl.cap=aux; } } } } } else lsortl.cap=NULL; } void agenda::sorttelefon() { nod *p; if(lprim.cap) { //Daca mai avem inainte o lista, o stergem if (lsortt.cap) while (lsortt.cap) { p=lsortt.cap; lsortt.cap=lsortt.cap->next; delete p; } else //o facem { nod *aux; for(p=lprim.cap; p; p=p->next) { aux=new nod;//aux este nodul pe care-l copii din lprim in lsortt strcpy(aux->info.nume, p->info.nume); strcpy(aux->info.locatie, p->info.locatie); aux->info.telefon=p->info.telefon; nod *temp, *trace; //asta daca e primul nod if (!lsortt.cap) { lsortt.cap=aux; aux->next=NULL; } else { temp=lsortt.cap; trace=NULL; while (temp && (aux->info.telefoninfo.telefon)) { trace=temp; temp=temp->next; } if (!temp) //adaug la sfarsit { aux->next=NULL; trace->next=aux; } else //adaug in interior if (trace) { aux->next=trace->next; trace->next=aux; } else //daca e la inceput { aux->next=lsortt.cap; lsortt.cap=aux; } } } } } else lsortt.cap=NULL; } void main() { persoana p1,p2("diana","constanta",643321),p3("anca","bucuresti",3215464),p4("ionut","targoviste",344988); lista list; agenda a; cin >>p1; cout<<"\n\nPersoanele introduse :"< *p; p=a.lprim[p1]; if(p) { cout<<"\n\nPersoana cautata a fost gasita: "<info.nume<info.nume<