Textul programului în limbajul ,,C’’

// Fisierul masina.h

 

#include "stdafx.h"

#include "conio.h"

#include <cstdlib>

#include <string.h>

 

 

typedef struct masina{

       char model[10];

       char producator[10];

       char motor[10];

       char tara[10];

       int an;

       int pret;

       masina *next;

} masina;

 

masina* last(masina *head);

void printMasini(masina *head);

void addToPos(masina *pos, masina *t);

void addMasina(masina **head,masina *t);

masina* createMasina();

masina* cautaModel(masina* head,  char *schedM);

void swap(masina *a,masina *b);

void printMasina(masina *m);

void sortLista(masina *head);

int saveToFile(masina *head,char *fileName);

masina* findPos(masina *head,int n);

int readFromFile(masina **head,char *fileName);

int ask(char* s);

void freeM(masina **head);

void divideList(masina** head, masina **lista1, masina**lista2, int n1);

void concatList(masina **head, masina **lista1, masina **lista2);

void editMasina(masina *head);

masina* delCar(masina* head,  masina *a);

int lengthL(masina*);

 

 

 

// Fisierul masina.cpp

 

#include "stdafx.h"

#include "masina.h"

 

 

masina* last(masina *head){

       masina *c = NULL;

       c = head;

       while(c->next)       {

              c=c->next;

       }

 

       return c;

}

 

void printMasini(masina *head){

       masina *c;

       c = head;

       int i=1;

       printf("#  Producator\tModel\tMotor\tTara\tAnul\tPret\t|->  Next addr.\n");

       while(c)      {

              printf("%i. %s\t\t%s\t%s\t%s\t%i\t%i\t|->  %p\n",i++,c->producator,c->model,c->motor,c->tara,c->an,c->pret,c->next);

              c = c->next;

       }

}

 

void addToPos(masina *pos, masina *t){

       masina *p = NULL;

       p = pos->next;

       pos->next = t;

       t->next = p;

}

 

void addMasina(masina **head,masina *t){

       masina *c = NULL;

       if (*head == NULL) {

              *head = t;

       }

       else {

              c=last(*head); c->next = t;

       }

}

 

masina* createMasina(){

       masina *t;

       t = (masina*) malloc(sizeof(*t));

       if (!t) return NULL;

      

       fflush(stdin);

       printf("Producatorul: ");

       gets(t->producator);

       printf("Modelul: ");

       gets(t->model);

       printf("Motor: ");

       gets(t->motor);

       printf("Tara: ");

       gets(t->tara);

       printf("Anul: ");

       scanf("%d",&t->an);

       printf("Pret: ");

       scanf("%d",&t->pret);

 

 

       t->next = NULL;

 

       return t;

}

 

masina* cautaModel(masina* head,  char *schedM){

       masina *c;

       c = head;

 

       while(c)      {

              if(strcmp(c->model,schedM) == 0) return c;

              c = c->next;

       }

 

       return NULL;

}

 

 

void printMasina(masina *m){

       printf("Producator\tModel\tMotor\tTara\tAnul\tPret\t|->  Next addr.\n");

       printf("%s\t\t%s\t%s\t%s\t%i\t%i\t|->  %p\n",m->producator,m->model,m->motor,m->tara,m->an,m->pret,m->next);

}

 

void sortLista(masina *head){

       masina *c;

 

       c = head;

 

       while(c->next){

              // recursie

              sortLista(c->next);

              if(strcmp(c->producator,c->next->producator) > 0){

                     swap(c,c->next);

              }

              c = c->next;

       }

}

 

 

void swap(masina *a,masina *b){

       masina *na,*nb;

       masina t;

       na = a->next;

       nb = b->next;

       t = *a;

       *a = *b;

       *b = t;

       a->next = na;

       b->next = nb;

}

 

int saveToFile(masina *head,char *fileName){

       masina *c;

       c = head;

 

       FILE *f = fopen(fileName,"w");

       if(!f) return 0;

       while(c){

              fprintf(f,"%s %s %s %s %i %i",c->producator,c->model,c->motor,c->tara,c->an,c->pret);

              c=c->next;

       }

       fclose(f);

       return 1;

 

}

 

 

masina* findPos(masina *head,int n){

       masina *c;

       c = head;

       int i = 0;

       while(c && (i<n) )   {

              c = c->next;

              i++;

       }

 

       return c;

}

 

int readFromFile(masina **head,char *fileName){

       masina *c = NULL;

       FILE *f = fopen(fileName,"r");

       if (!f) return 0;

       do     {

              c = (masina*) malloc(sizeof(masina));

              fscanf(f,"%s %s %s %s %i %i ",c->producator,c->model,c->motor,c->tara,&c->an,&c->pret);

 

              c->next = NULL;

              addMasina(head,c);

       }while(!feof(f));

 

       return 1;

}

 

int ask(char* s){

       char c = ' ';

       printf("%s \n",s);

       c = getch();

       if (c == 'd') return 1;

       return 0;

}

 

void freeM(masina **head){

       masina *c,*p;

       c = *head;

       if(!c) return ;

       while(c->next){

              p = c;

              c = c->next;

              free(p);

       }

       *head = NULL;

}

 

void divideList(masina** head, masina **lista1, masina**lista2, int n1){

       masina *c = NULL;

       c = *head;

      

       masina *var = findPos(*head,n1-1);

      

       (*lista1) = *head;

       *lista2 = var->next;

       var->next = NULL;

 

       *head = NULL;

      

}

 

void concatList(masina **head, masina **lista1, masina **lista2){

       masina *c;

 

       *head = *lista1;

       c = last(*head);

       c->next = *lista2;

 

       *lista1 = NULL;

       *lista2 = NULL;

}

 

void editMasina(masina *head){

       int m = 0;

       printf("Introduceti ID:"); scanf("%i", &m);

       masina* c = findPos(head,m-1);

       if(!c) printf("Element inexistest\n");

 

       if( ask("Doriti sa modificati producatorul? (d/n)") )

              printf("Introduceti producatorul:"),scanf("%s",c->producator);

       if( ask("Doriti sa modificati modelul? (d/n)") )

              printf("Introduceti modelul: "),scanf("%s",c->model);

       if( ask("Doriti sa modificati capacitatea cilindrica? (d/n)") )

              printf("Introduceti cap. cilindrica: "),scanf("%s",c->motor);

       if( ask("Doriti sa modificati tara? (d/n)") )

              printf("Introduceti tara: "),scanf("%s",c->tara);

       if( ask("Doriti sa modificati anul? (d/n)") ){

              printf("Introduceti anul: ");scanf("%i",&c->an);}

       if( ask("Doriti sa modificati pretul? (d/n)") ){

              printf("Introduceti pretul: ");scanf("%i",&c->pret);}

       puts("");

       printMasina(c);

}

 

masina* delCar(masina* head,  masina *a){

       masina *pa;

      

       //a = head;

       if (head == a){

              if (head->next == NULL){

                     free(a);

                     return NULL;

              }

              head = a->next;

              free(a);

       } else {

              pa = head;

              while (pa->next !=a){

                     pa = pa->next;

              }

              pa->next = a->next;

              free(a);

       }

       return head;

 

}

 

int lengthL(masina *head){

       masina *c = NULL;

       int n = 1;

      

       c = head;

       while (c->next){

              n++;

              c = c->next;

       }

       return n;

}

 

 

 

 

// Fisierul main.cpp

 

#include "stdafx.h"

#include "masina.h"

 

 

 

 

void printMenu(){

       puts("   **** MENU ****");

       puts("1. Adaugare masina");

       puts("2 .Afisarea listei cu masini");

       puts("3. Cautare masina");

       puts("4. Interschimbare masini");

       puts("5. Sortare");

       puts("6. Salvare in fisier");

       puts("7. Citire din fisier");

       puts("8. Editarea unui element");

       puts("9. Adaugare la pozitia specificata");

       puts("d. Divizare lista in 2");

       puts("c. Concatenarea listelor");

       puts("e. Stergere element");

       puts("f. Eliberarea memoriei");

       puts("0. Exit");

}

 

int _tmain(int argc, _TCHAR* argv[]){

       masina *head = NULL;

       masina *lista1 = NULL, *lista2 = NULL;

       char filename[10];

       int c=1;

       char menuOption;

       int i;

       while(c){

              printMenu();

              menuOption = getch();

              system("cls");

              switch(menuOption){

                     case '1':{

                                  printf("Adugare masina (la sfirsit)\n");

                                  addMasina(&head,createMasina());

                           }

                           break;

                     case '2':{

                                  if (head) {

                                         printf("Lista masinilor\n");

                                         printMasini(head);

                                  }

                                  else if (lista1 && lista2){

                                         printf("-------------\n");

                                         printf("Lista I:\n");

                                         printMasini(lista1);

                                         printf("-------------\n");

                                         printf("Lista II:\n");

                                         printf("-------------\n");

                                         printMasini(lista2);

                                  }

                                  else

                                         printf("Lista nu a fost creata\n");

                                  }

                           break;

                    

                     case '3':{

                                  printf("Cautare masina\n");

                                  printf("Introduceti model:");

                                  char *p = (char*) malloc(sizeof(*p)*16);

                                  gets(p);

                                  masina *m = cautaModel(head,p);

                                  if(!m) printf("Masina nu a fost gasita");

                                  else printMasina(m);

 

                                  free(p);

                           }

                           break;

                     case '4':{

                                  printf("Interschimbare elemente:\n");

                                  printMasini(head);

                                  int m1,m2;

                                  printf("Introduceti ID1:");scanf("%i",&m1);

                                  printf("Introduceti ID2:");scanf("%i",&m2);

                                  swap(findPos(head,m1-1),findPos(head,m2-1));

                                  printf("Masinile au fost interschimbate cu succes\n");

                                  printMasini(head);

                           }

                           break;

                     case '5':{

                                  sortLista(head);

                                  printf("Lista a fost sortata");

                           }

                           break;

                     case '6':{

                                  printf("Introduceti denumirea fisierului: ");

                                  fflush(stdin);

                                  gets(filename);

                                  if (!saveToFile(head,filename))

                                         printf("A aparut o eroare. Incercati din nou");

                                  else

                                         printf("Fisierul <<%s>> a fost salvat cu succes",filename);                             

                           }

                           break;

                     case '7':{

                                  printf("Introduceti numele fisierului: ");

                                  fflush(stdin);

                                  gets(filename);

                                  if (!readFromFile(&head,filename))

                                         printf("A aparut o eroare. Posibil fisierul nu a fost gasit. Incercati din nou");

                                  else

                                         printf("Fisierul <<%s>> a fost citit cu succes",filename);

                           }

                           break;

                     case '8':{

                                  printf("Selectati masina care doriti sa o editati\n");

                                  printMasini(head);

                                  editMasina(head);

                           }

                           break;

                     case '9':{

                                  printf("Adaugare la pozitie:\n");

                                  printMasini(head);

                                  int pos = 0;

                                  printf("Introduceti pozitia la care doriti sa adaugati: "); scanf("%i",&pos);

                                  printf("Introduceti datele despre masina:\n");

                                  if (pos > lengthL(head)) {

                                         addMasina(&head,createMasina());

                                  }else

                                         addToPos(findPos(head,pos-2),createMasina());

                           }

                           break;

                     case 'd':{

                                  if (!head){

                                         if (lista1 && lista2) printf("!!! Lista a fost divizata anterior");

                                         else printf("!!! Lista nu a fost creata");

                                         break;

                                  }

                                  printf("Divizarea listei in doua:\n");

 

                                  printf("-----------\n");

                                  int id = 0;

                                  printf("Lista initiala:\n");

                                  printMasini(head);

 

                                  printf("Introduceti ID dupa care vrei sa divizati lista:"); scanf("%i",&id);

                                  divideList(&head,&lista1,&lista2,id);

                                  printf("-------------\n");

                                  printf("* Lista I:\n");

                                  printMasini(lista1);

                                  printf("-------------\n");

                                  printf("* Lista II:\n");

                                  printf("-------------\n");

                                  printMasini(lista2);

                           }

                           break;

                     case 'c':{

                                  printf("Concatenare lista:\n");

 

                                  if(!lista1 || !lista2){

                                         printf("!!! Lista trebuie sa fie impartita ca sa poate fi concatenata\n");

                                  }

                                  else{

                                         concatList(&head,&lista1,&lista2);

 

                                         printMasini(head);

                                  }

 

                           }

                           break;

                     case 'f':{

                                  if(!head){

                                         freeM(&lista1);

                                         freeM(&lista2);

                                  }

                                  else{

                                         freeM(&head);

                                  }

                                  printf("Memoria a fost eliberata cu succes");

                           }

                           break;

                     case 'e':{

                                  printMasini(head);

                                  printf("Introduceti model:");

                                  char *p = (char*) malloc(sizeof(*p)*16);

                                  gets(p);

                                  masina *m = cautaModel(head,p);

                                  if(!m) printf("Masina nu a fost gasita");

                                  else{

                                         printMasina(m);

                                         if (ask("Doriti sa stergeti masina? (d/n): ")){

                                                delCar(head,m);

                                                printf("Masina a fost stearsa din lista");

                                         }

                                  }

                           }

                           break;

                     case '0':{

                                  if(!head){

                                         freeM(&lista1);

                                         freeM(&lista2);

                                  }

                                  else{

                                         c = 0;

                                         freeM(&head);

                                  }

                           }

                           break;

              default: printf("Aceasta optiune nu exista"); break;

              }

              getch();

              system("cls");

       }

 

 

       return 0;

}