Sunteți pe pagina 1din 18

Universitatea Tehnic a Moldovei

FCIM

Lucrarea de laborator 2 si 3
la Structuri de date si algoritmi

A efectuat

Pripa Marcu TI-133

A verificat

conf. univ. dr. Luchianov Ludmila

Chiinu 2014

Lucrare de laborator Nr.2 i 3


Tema: Prelucrarea listei simplu inlnuite. Implementarea tipului abstract de date.
Scopul lucrrii: De a implementa tipul abstract de date lista simplu nlnuit i de a elabora
programul care creaza, afiseaza, sorteaza, modific, divizeaza, concateneaza,
salveaz i o deschide in/din fiier o list simplu nluit.
Formularea problemei: De elaborat un program care implementeaz, creaz i modific lista
simplu nluit Abonati

Listingul programei:
Funcs.h
#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable:4996)
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<windows.h>
typedef struct abonat
{
char nume[16];
char prenume[16];
unsigned long long int numar;
unsigned int datoria;
struct abonat *next;
}abonat;
void go (int x,int y);
void chenar(int r,int l);
void afisare(abonat * c,int i);
abonat * createc(int n);
void citirec(abonat *c);
void inputc(abonat* head);
void outputc(abonat* head);
abonat * searchel(abonat * head, char nume[]);
abonat * searchnum(abonat *head, int m);
void interschimbare(abonat * a, abonat *b);
void sortare(abonat *head, int n);
void modificare(abonat *m);
abonat * freec(abonat * head);
abonat * tail (abonat *head);
int appendc(abonat *head, abonat a,int *n);
int sizec(abonat *head);
abonat* add_custom(abonat * head, abonat *a, abonat b,int *n);
abonat *deletec(abonat *head, abonat* a,int *n);
abonat * splitc(abonat * head1, int k);
int concatenare(abonat * head1, abonat ** head2);
int writec(abonat * head, char * fname,int n);
abonat * readc (char* fname, int *n);

funcs.c
#include"funcs.h"
COORD coord = {0,0};
void go (int x,int y)
{
coord.X=x;
coord.Y=y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord);
}
void chenar(int r,int l) //FUNCTIA DE AFISARE A CHENARULUI
{
//unde r - inaltimea si l - latimea
int i,j;
printf("\n %c",201);
for(i=0;i<l;i++)
printf("%c",205);
printf("%c\n",187);
for(j=0;j<r;j++)
{
printf(" %c",186);
go(l+3,j+2);
printf("%c\n",186);
}
printf(" %c",200);
for(i=0;i<l;i++)
printf("%c",205);
printf("%c\n",188);
}
//functia antet
void antet(void)
{
puts("Nr.|Numele
|Prenumele
|Numarul
|Datoria|");
}
//functia afisare
void afisare(abonat * c,int i)
{
printf("%-3d%-17s%-17s%-15I64d%-7d\n",i,c->nume,c->prenume,c->numar,c->datoria);
}
//functia createc
abonat * createc(int n)
{
int i;
abonat *head;
abonat *c,*p;
p=(abonat *) malloc (sizeof(abonat));
for (i=0; i<n;i++)
{
c=(abonat *) malloc (sizeof(abonat));
if (!c) return c;
if (i==0) {head=c;}
else {p->next=c;}
c->next=NULL;
p=c;
}
return head;
}
//-----------//functia citire
void citirec(abonat *c)
{
printf("\nDati numele:\n");
fflush(stdin);
gets(c->nume);
printf("\nDati prenumele:\n");

fflush(stdin);
gets(c->prenume);
printf("\nDati numarul:\n");
fflush(stdin);
scanf("%I64d", &c->numar);
fflush(stdin);
printf("\nDati datoria:\n");
scanf("%d",&c->datoria);
}
//functia inputc
void inputc(abonat* head)
{
int i=0;
abonat *c;
c=head;
while(c)
{
system("cls");
printf("Dati informatiile despre abonatul %d\n",i+1);
citirec(c);
i=i+1;
c=c->next;
}
}
//----------------//functia outputc
void outputc(abonat* head)
{
int i=0;
abonat *c;
c=head;
antet();
while(c)
{
afisare(c,i+1);
i=i+1;
c=c->next;
}
}
//------------//functia searchel
abonat * searchel(abonat * head, char snume[])
{
abonat *c;
c=head;
while (c)
{
if (strcmp(c->nume, snume)==0||strcmp(c->prenume,snume)==0) return c;
c=c->next;
}
return NULL;
}
//============================
abonat * searchnum(abonat *head,int m)
{
abonat *c;
int i=0;
c=head;
while(c)
{
if(++i==m) return(c);
else c=c->next;
}
return NULL;
}
//---------------void interschimbare(abonat * a, abonat *b)
{
abonat *pa, *pb, t;
pa=a->next;
pb=b->next;

t=*a;
*a=*b;
*b=t;
a->next=pa;
b->next=pb;

}
//----------------------//functia sortare
void sortare(abonat*head, int n)
{
int i,k;
abonat *a,*b;
a=(abonat*)malloc(sizeof(abonat));
b=(abonat*) malloc (sizeof(abonat));
for (i=0; i<n-1;i++)
{
a=head;
b=a->next;
for (k=0;k<n-i-1;k++)
{
if ((a->datoria)>(b->datoria))
{
interschimbare (a,b);
}
a=a->next;
b=b->next;
}
}
}
//---------------------//functia modificare
void modificare(abonat *m)
{
char f;
printf("\nVreti sa modificati numele? (y/n)");
fflush(stdin);
scanf("%c",&f);
if (f=='y')
{
puts("Dati numele");
fflush(stdin);
gets(m->nume);
}
printf("\nVreti sa modificati prenumele? (y/n)");
fflush(stdin);
scanf("%c",&f);
if (f=='y')
{
puts("Dati prenumele");
fflush(stdin);
gets(m->prenume);
}
printf("\nVreti sa modificati numarul? (y/n)");
fflush(stdin);
scanf("%c",&f);
if(f=='y')
{
puts("Introduceti numarul:");
fflush(stdin);
scanf("%I64d",&m->numar);
}
printf("\nVreti sa modificati valoarea datoriei? (y/n)");
fflush(stdin);
scanf("%c",&f);
if(f=='y')
{
puts("Introduceti valoarea datoriei:");
fflush(stdin);
scanf("%d",&m->datoria);
}
}

//-------------//functia freec
abonat * freec(abonat* head)
{
abonat *c, *p;
if (head==NULL) return NULL;
c=head;
while(c)
{
p=c;
c=c->next;
free(p);
}
head=NULL;
return NULL;
}
//----------------------------//functia tail
abonat * tail (abonat *head)
{
abonat * c;
c=head;
while (c->next) {c=c->next;}
return c;
}
//---------------------//functia appendc
int appendc(abonat *head, abonat a,int *n)
{
abonat *c, *p;
if (head==NULL) return 0;
p=tail(head);
c=(abonat *)malloc (sizeof(abonat));
if (c==NULL) return -1;
*c=a;
p->next=c;
c->next=NULL;
*n=*n+1;
return 1;
}
//----------------------//functia sizec
int sizec(abonat *head)
{
int n=0;
abonat *c;
c=head;
while (c)
{
n++;
if (c->next==head) break;
c=c->next;
}
return n;
}
//-------------------//functia add_custom
abonat * add_custom(abonat * head, abonat *a, abonat b,int *n)
{
abonat *c, *p;
c=(abonat*) malloc (sizeof (abonat));
if (c==NULL) return c;
if (a==head)
{
*c=b;
c->next=a;
head=c;
return head;
}
p=head;
while (p->next!=a)

p=p->next;
}
*c=b;
p->next=c;
c->next=a;
*n=*n+1;
return head;
}
//----------------------------------//functia stergere
abonat *deletec(abonat *head, abonat* a,int *n)
{
abonat *c;
c=head;
if (c->next==NULL)
{
head=NULL;
free(c);
return head;
}
if(c==a)
{
head=c->next;
free(c);
}
else
{
while(c->next!=a) {c=c->next;}
c->next=a->next;
free(a);
}
*n=*n-1;
return head;
}
//----------------------------------//functia splitc
abonat * splitc(abonat * head1, int k)
{
abonat * head2, *c;
int i;
if(!head1) return NULL;
c=head1;
i=0;
while ((i+1)!=k)
{
c=c->next;
i++;
}
head2=c->next;
c->next=NULL;
return head2;
}
//---------------//functia concatenare
int concatenare(abonat * head1, abonat** head2)
{
abonat *c;
if(!head1||!*head2) return 0;
if(!head1) return 0;
c=head1;
c=tail(head1);
c->next=*head2;
*head2=NULL;
return 1;
}
//----------------------//functia writec
int writec(abonat * head, char * fname,int n)
{
abonat * c;

FILE *fp;
fp=fopen(fname,"w");
if (!fp) return 0;
c=head;
fprintf(fp,"%d\n",n);
while(c)
{
fprintf(fp,"%-17s%-17s%-15I64d%-7d\n",c->nume,c->prenume,c->numar,c->datoria);
c=c->next;
}
fclose(fp);
return 1;
}
//-----------------------------//functia readc
abonat * readc (char* fname, int *n)
{
abonat *c,*p;
FILE *fp;
int i, num;
fp=fopen(fname, "rt");
if (!fp) return NULL;
fscanf(fp,"%d\n",&num);
c=createc(num);
p=c;
if (!c) return NULL;
for (i=0;i<num;i++)
{
fscanf(fp,"%s %s %I64d %d\n",c->nume,c->prenume,&c->numar,&c->datoria);
c=c->next;
}
*n=num;
return p;
}

main.c
#include"funcs.h"
int main()
{
abonat a,*head=NULL, *head2=NULL,*cautat;
char nume[15];
int nm,nm1,n,rez,m;
while (1)
{
system("cls");
printf("\n\n\n");
puts("
Meniu:");
puts(" 1. Crearea listei");
puts(" 2. Afisarea informatiei");
puts(" 3. Cautarea unui element");
puts(" 4. Sortarea listei");
puts(" 5. Modificarea unui element");
puts(" 6. Eliberarea memoriei");
puts(" 7. Adaugarea unui element la urma");
puts(" 8. Adaugarea unui element la pozitia dorita");
puts(" 9. Stergerea unui element");
puts(" 10.Divizarea listei");
puts(" 11.Concatenarea a 2 liste");
puts(" 12.Salvarea listei in fisier");
puts(" 13.Deschiderea listei din fisier");
puts(" 0 .Exit");
go(0,0);
chenar(20,70);
scanf("%d",&nm);
switch(nm)
{
case 1:system("cls");
puts("Dati numarul de elemente:");
scanf("%d", &n);

case 2:

case 3:

head=createc(n);
if (head==NULL) {puts("Lista nu a fost creata");}
else{puts("lista a fost creata cu succes"); }
getch();
system("cls");
inputc(head);
puts("Lista a fost completata cu succes");
getch();
break;
system("cls");
puts(" Lista de structuri");
outputc(head);
getch();
break;
system("cls");
puts("Dati numele sau prenumele abonatului cautat");
fflush(stdin);
gets(nume);
cautat =NULL;
cautat=searchel(head, nume);
system("cls");
puts(" Abonatul cautat:");
antet();
if (cautat)
afisare(cautat,1);getch();
break;

case 4:

case 5:

case 6:

case 7:

sortare(head, n);
puts("Lista a fost sortata cu succes");
getch();
break;
system("cls");
puts("Dati numarul abonatului care doriti sa-l modificati:");
outputc(head);
fflush(stdin); scanf("%d",&m);
cautat=searchnum(head,m);
if (cautat){
modificare(cautat);
puts("Datele despre abonat au fost modificate");}
else puts("Asa abonat nu exista");
getch();
break;
head=freec(head);
if (head) {puts("Lista nu a fost eliberata"); }
if(!head) {puts("Lista a fost eliberata cu succes");}
getch();
break;
{

case 8:

puts("Introduceti datele despre elementul care doriti sa-l adaugati");


citirec(&a);
rez=appendc(head,a,&n);
if (rez==0) {puts("Lista este vida");}
if (rez==-1) {puts("Elementul nu a fost adaugat");}
if (rez==1) {puts("Elementul a fost adaugat cu succes");}
getch(); break;

}
outputc(head);
puts("Dati numarul pozitiei unde doriti sa inserati");
fflush(stdin); scanf("%d",&m);
cautat=searchnum(head,m);
if (cautat==NULL)
{puts("Acest element nu exista");
getch();break;
}
puts("Introduceti datele despre elementul care doriti sa-l adaugati");

citirec(&a);
head=add_custom(head,cautat, a,&n);
puts("Elementul a fost adaugat cu succes");
getch(); break;
case 9:

case

case

case

case

case
}
}

system("cls");
puts("Dati numarul elementului care doriti sa-l stergeti");
outputc(head);
fflush(stdin); scanf("%d",&m);
cautat=searchnum(head,m);
if (cautat==NULL) {puts("Acest element nu exista"); getch();break;}
head=deletec(head,cautat,&n);
puts("Stergerea a fost facuta cu succes"); getch(); break;
10:
system("cls");puts("Dati numarul de elemente pastrate in prima lista");
scanf("%d",&nm1);
while (nm1>=n)
{printf("Dati un numar mai mic decit %d",n);
scanf("%d",&nm1);
}
head2=splitc(head,nm1);
n=n-nm1;
if (head2==NULL) {puts("Divizarea nu a fost facuta");}
else
{
puts(" Lista a fost divizata in:");
puts(" lista 1");
outputc(head);
puts(" lista 2");
outputc(head2);
}
getch();
break;
11:
system("cls");
if(!head2)
n=sizec(head);
if (rez==0)
{puts("Listele nu au fost concatenate");}
if(rez==1) {puts("Listele au fost concatenate cu succes");}
puts("Doriti sa afiseze lista obtinuta? (1-da,0-nu)");
scanf("%d",&nm1);
if(nm1==1) outputc(head);
getch(); break;
12:
puts("Dati numele fisierului in care doriti sa salvati lista");
fflush(stdin); gets(nume);
rez=writec(head, nume,n);
if(rez==0) {puts("Salvarea nu a avut loc");}
if(rez==1) {puts("Salvarea s-a efectuat cu succes");}
getch(); break;
13:
puts("Dati numele fisierului din care doriti sa incarcati lista");
fflush(stdin); gets(nume);
head=readc(nume,&n);
if(!head) {puts("Deschiderea nu s-a efectuat");getch(); break;}
if(head) {puts("Deschiderea s-a efectuat cu succes");}
getch(); break;
0:head=freec(head);
return(0);

Executia programei

La selectarea primului punct apare

La selectarea punctuilui 2 apare:

La selectarea punctului 3 apare:

La alegerea punctului 4 apare mesajul ca datele au fost sortate

Si daca afisam iarasi informatia atunci ne arata lista sortata :

La selectarea punctului 5 ne apare :

Daca iarasi afisam lista ne apare informatia modificata :

La selectarea punctului 7 ne apare :

La reafisarea informatiei avem informatia noua :

La selectarea ulterior a punctului 8 din meniu apare astfel de fereastra :

La reafisare avem datele noi

La selectarea punctului 9 ne apare fereastra:

La reafisare ne convingem ca elementul a fost sters :

La selectarea punctului 10(divizarea listei) :

Reafisarea :

La selectarea punctului 11(concatenarea) :

La selectarea punctului 12(salvarea in fisier) :

Putem curata memoria accesand punctul 6 :

Ne convingem ca datele au fost sterse incercand sa afisam datele:

Acum putem deschide fisierul txt ca sa vrificam daca datele au fost salvate :

In progarm accesand punctul 13 din meniu putem deschide si citi datele din fisier pentru a
opera cu datele :

Putem afisa informatia ca sa verificam daca datele au fost citite in memoria calculatorului :

S-ar putea să vă placă și