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;
}