Sunteți pe pagina 1din 28

MINISTERUL EDUCAȚIEI, CULTURII ȘI CERCETĂRII

AL REPUBLICII MOLDOVA
Universitatea Tehnică a Moldovei
Facultatea Calculatoare, Informatică şi Microelectronică

Paduraru Vadim
CR - 192

Raport
pentru lucrarea de laborator Nr.8/9

la cursul de “SDA”
Теmа: Implementarea tipului abstract de date
„Listă unidirecțională” („Listă simplu
înlănțuită”) în limbajul C/ Implementarea
tipului abstract de date „Listă unidirecțională”
(„Listă simplu înlănțuită”) în limbajul C

Verificat:
M. Kulev
Scopul lucrării: Obţinerea deprinderilor practice de
implementare și de utilizare a tipului abstract de date (TAD) “Listă
simplu înlanţuită” în limbajul C cu asigurarea operațiilor de
prelucrare ale listei.

Sarcină: Să se scrie trei fişiere-text în limbajul C


pentru implementarea și utilizarea TAD “Listă simplu
înlanţuită” cu asigurarea operațiilor de prelucrare ale listei:

MAIN:
#include "imobil.h"

void Menu()

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

printf("[1] - Crearea listei in memoria dinamica\n");

printf("[2] - Indroducerea informatiei despre elementele listei de la tatatura\n");

printf("[3] - Afisarea informatiei despre elementele listei la ecran\n");

printf("[4] - Cautarea elementului in lista\n");

printf("[5] - Modificarea campurilor unui element din lista\n");

printf("[6] - Determinarea adresei ultimului element din lista\n");

printf("[7] - Determinarea numarului de elemente\n");

printf("[8] - Interschimbarea a doua elemente indicate in lista\n");

printf("[9] - Sortarea listei\n");


printf("[10] - Adaugarea unui nou element la sfirsitul listei\n");

printf("[11] - Adaugarea unui nou element la inceputul listei\n");

printf("[12] - Inserarea unui element nou dupa elementul indicat al listei\n");

printf("[13] - Inserarea unui element nou inaintea elementul indicat al listei\n");

printf("[14] -Stergerea elementului indicat in lista\n");

printf("[15] - Divizarea listei in doua liste\n");

printf("[16] -Concatenarea a doua liste\n");

printf("[17] -Salvarea informatiei despre elementele listei in fisier\n");

printf("[18] -Citirea informatiei despre elementele listei din fisier\n");

printf("[19] -Eliberarea memoriei\n");

printf("[0] - Iesire din program\n");

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

printf("Optiunea: ");

int main()

char str[50];

int n;

int g;

int k;

int i;

int nr;

int nrn;

char denum[50];

char md[50];

Imobil *ab;
Imobil *search;

Imobil *modify;

Imobil *Last;

Imobil *b;

Imobil *v;

Imobil *m;

Imobil *c;

Imobil *t;

Imobil *z;

Imobil *a;

Imobil *phead2;

Imobil *phead1;

int n1;

char fname[50];

int l,f;

nrn=0;

while (1)

Menu();

scanf("%d", &g);

switch (g)

case 1:

printf("Introduceti cate elemente veti introduce : \n");

scanf("%d", &n);

create(n);

break;

case 2:
readinfo();

break;

case 3:

showinfo();

break;

case 4:

printf("Dati denumirea cautata\n");

scanf("%s", &denum);

search = Search(denum);

if (search == NULL) {

printf("Nu exista asa element\n");

} else {

printf("Numele proprietarului: %s\n", search->proprietar);

printf("Tipul imobilului: %s\n", search->tip);

printf("Adresa imobilului: %s\n", search->adresa);

printf("Suprafata: %d\n", search->suprafata);

printf("Costul: %f\n", search->costul);

break;

case 5:

printf("Introduceti pozitia elementului de modificat:");

scanf("%d",&nr);

c=currentelement(nr);

modifyinfo(c);

break;

case 6:

printf("Dati pozitia elementului cauatat");

scanf("%d",&nr);
Last=currentelement( nr);

if (Last== NULL) {

printf("Nu exista asa element\n");

} else {

printf("adresa: %p\n", Last);

break;

case 7:

printf("Numarul de elemente: %d\n", sizelist());

break;

case 8:

printf("Dati pozitia elementului 1:");

scanf("%d",&nr);

a=currentelement(nr);

printf("Dati pozitia elementului 2:");

scanf("%p",&nr);

b=currentelement(nr);

swap(a,b);

break;

case 9:

sort();

break;

case 10:

printf("Dati numele proprietarului: ");

fflush(stdin);

gets(z->proprietar);
printf("Dati tipul imobilului:");

fflush(stdin);

gets(z->tip);

printf("Dati adresa imobilului:");

fflush(stdin);

gets(z->adresa);

printf("Dati suprafata:");

scanf("%d",&z->suprafata);

printf("Dati costul :");

scanf("%f",&z->costul);

apprend(z);

break;

case 11:

printf("Dati numele proprietarului: ");

fflush(stdin);

gets(z->proprietar);

printf("Dati tipul imobilului:");

fflush(stdin);

gets(z->tip);

printf("Dati adresa:");

fflush(stdin);

gets(z->adresa);

printf("Dati suprafata:");

scanf("%d",&z->suprafata);

printf("Dati costul :");

scanf("%f",&z->costul);
prepend(z);

break;

case 12:

printf("Dati numele proprietarului: ");

fflush(stdin);

gets(z->proprietar);

printf("Dati tipul imobilului:");

fflush(stdin);

gets(z->tip);

printf("Dati adresa imobilului:");

fflush(stdin);

gets(z->adresa);

printf("Dati suprafata:");

scanf("%d",&z->suprafata);

printf("Dati costul:");

scanf("%f",&z->costul);

printf("Dati pozitia elementului:");

scanf("%d",&nr);

b=currentelement(nr);

insertbefore(b,z);

break;

case 13:

printf("Dati numele proprietarului: ");

fflush(stdin);
gets(z->proprietar);

printf("Dati tipul imobilului:");

fflush(stdin);

gets(z->tip);

printf("Dati adresa imobilului:");

fflush(stdin);

gets(z->adresa);

printf("Dati suprafata:");

scanf("%d",&z->suprafata);

printf("Dati costul:");

scanf("%f",&z->costul);

printf("Dati pozitia elementului:");

scanf("%d",&nr);

b=currentelement(nr);

insertafter(b,z);

break;

case 14:

printf("Dati pozitia elementului de sters:");

scanf("%d",&nr);

a=currentelement(nr-1);

deleteElement(a);

break;

case 15:

printf("Dati pozitia pentru dispersare:");

scanf("%d",&n1);
phead1=currentelement(n1);

splitList(n1);

break;

case 16:

printf("Lista unita");

mergeList();

break;

case 17:

printf("Introduceti denumirea fisierului in care veti introduce datele


imobileleor:\n");

scanf("%s", fname);

saveElement(fname);

break;

case 18:

printf("Dati fisieru de unde se vor extrage datele:\n");

scanf("%s", fname);

if (head != NULL)

freememory();

loadElement(&nrn, fname);

break;

case 19:

freememory();

break;
case 0:

printf("Iesire reusita din program");

exit(0);

break;

default:

printf("Nu exista asa optiune!\n");

break;

return (0);

FUNCTION.C
#include "imobil.h"

int create(int n)

Imobil *c,*p;

int i;

for(i=0;i<n;i++)

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

if (i==0)

head=c;
} else {

p->next=c;

p=c;

c->next=NULL;

return 1;

void readinfo(void)

{ Imobil *c;int i;

c=head;

i=0;

puts("Dati informatii despre imobile");

while(c)

{i=i+1;

printf("Imobilul ");

printf("%d\n",i);

printf("Dati numele proprietarului: ");

fflush(stdin);

gets(c->proprietar);

printf("Dati tipul imobilului:");

fflush(stdin);

gets(c->tip);

printf("Dati adresa:");

gets(c->adresa);

printf("Dati suprafata:");

scanf("%d",&c->suprafata);
printf("Dati costul imobilului:");

scanf("%f",&c->costul);

c=c->next;

void showinfo(void)

{Imobil *c;

int i;

c=head;i=0;

puts("Informatii despre imobile:");

while(c)

{printf("%d.numele proprietarului:%s\n tipul imobilului:%s\n adresa imobilului:%s\n


suprafata:%d\n costul:%f\n curent adresa:%p\n next adresa:%p\n",i+1,c->proprietar,c->tip,c-
>adresa,c->suprafata,c->costul,c,c->next);

c=c->next;i++;

if(c==head)

{break;}

}}

void modifyinfo(Imobil *c)

{ char denum[50];

printf("Introduceti denumirea modificata: ");

scanf("%s",denum);

strcpy(c->proprietar,denum);

}
Imobil *Search(char *denum)

{Imobil *c;

c=head;

while(c)

{if (strcmp(c->proprietar,denum)==0)

return c;

c=c->next;

return c;

Imobil *currentelement(int nr)

{Imobil *c;

int i=1;

c=head;

while(c!=NULL && i<nr)

{c=c->next;

i++;

if(i==nr)

{return c;}

else

return NULL;

Imobil *lastelement(void)
{Imobil *c;

c=head;

while(c->next)

{c=c->next;

if(c->next==head)

{break;}

return c;

Imobil *previousElement(Imobil *a)

{Imobil *c;

if(a==NULL||head==NULL)

{return NULL;}

if(a==head)

{return NULL;}

c=head;

while(c->next==a)

{c=c->next;}

return c;

int sizelist(void)

{Imobil *c;

int n;

c=head;n=0;

while(c)

{n++;
c=c->next;

return n;

void swap(Imobil *a, Imobil *b)

{Imobil *na,*nb,t;

na=a->next;

nb=b->next;

t=*a;

*a=*b;

*b=t;

a->next=na;

b->next=nb;

void sort(void)

{Imobil *a,*b;

int n;

int i,k;

Imobil *na,*nb,t;

n=sizelist();

for(i=0;i<n;i++)

{a=head;

b=a->next;

for(k=0;k<n-1-i;k++)

{if (strcmp(a->proprietar, b->proprietar) > 0)

{
na=a->next;

nb=b->next;

t=*a;

*a=*b;

*b=t;

a->next=na;

b->next=nb;

a=a->next;

b=b->next;

void freememory(void)

{ Imobil *p;

head;

while(head)

{p=head->next;

free(head);

head = p;

void deleteElement(Imobil *a)

Imobil *ptr;

if(head==a)

{if(a->next==NULL)

{head=NULL;
free(a);

return;

head=a->next;

free(a);

return;

else {

ptr = previousElement(a);

ptr->next = a->next;

free(a);

return;

void splitList(int n1)

{Imobil *c;

int i=0;

c=head;

for(i=0;i<n1-1;i++)

{c=c->next;}

phead2=c->next;

phead1 = head;

c->next=NULL;

i=1;

printf("prima lista este\r\n");


c = phead1;

while(c!=NULL)

{printf("%d.numele proprietarului:%s\n tipul imobilului:%s\n adresa imobilului:%s\n


suprafata:%d\n costul:%f\n curent adresa:%p\n next adresa:%p\n",i,c->proprietar,c->tip,c-
>adresa,c->suprafata,c->costul,c,c->next);

c=c->next;

i++;}

printf("a 2 lista lista este\r\n");

i = 1;

c = phead2;

while(c!=NULL)

{printf("%d.numele proprietarului:%s\n tipul imobilului:%s\n adresa imobilului:%s\n


suprafata:%d\n costul:%f\n curent adresa:%p\n next adresa:%p\n",i,c->proprietar,c->tip,c-
>adresa,c->suprafata,c->costul,c,c->next);

c=c->next; i++;

void mergeList(void)

Imobil *add;

add = phead1;

while(add->next) {

add = add->next;

add->next = (Imobil*)malloc(sizeof(Imobil));

add->next = phead2;

head = phead1;

add = phead1;
return;

int saveElement(char *fname)

Imobil *c;

FILE *fp;

int i;

c=head;

fp=fopen(fname,"w");

if(fp==NULL)

{return 0;}

fprintf(fp, "%d", sizelist());

while(c)

fprintf(fp,"%s\n %s\n %s\n %d\n costul:%f\n ",c->proprietar,c->tip,c->adresa,c-


>suprafata,c->costul);

c=c->next;}

fclose(fp);

return(1);

void loadElement(int *nrn, char *fname)

FILE *fp;

Imobil *ptr, *p1, *c;

int i;
fp = fopen(fname, "r");

fscanf(fp, "%d", nrn);

printf("nrn = %d", *nrn);

create(*nrn);

i = 0;

ptr = head;

while (i < *nrn)

fscanf(fp, "%s", &ptr->proprietar);

fscanf(fp, "%s", &ptr->tip);

fscanf(fp, "%s", &ptr->adresa);

fscanf(fp, "%d", &ptr->suprafata);

fscanf(fp, "%f", &ptr->costul);

ptr = ptr->next;

i++;

p1->next = NULL;

fclose(fp);

void apprend(Imobil *z)

{Imobil *v;

v=(Imobil*)malloc (sizeof(Imobil));

if(v==NULL)

{return ;}
*v=*z;

v->next=NULL;

if(head==NULL)

head=v;

else{

lastelement()->next=v;

v->next=NULL;}

return ;

void prepend(Imobil *z)

Imobil *s;

s=(Imobil*)malloc(sizeof(Imobil));

if(s==NULL)

{return ;}

*s=*z;

s->next=head;

head=s;

return ;

int insertbefore(Imobil *b,Imobil *z)

{ Imobil *v;

v=(Imobil*)malloc(sizeof(Imobil));

if(v==NULL)

{return 0;
}

*v=*z;

v->next=b->next;

b->next=v;

return 1;

int insertafter(Imobil *b,Imobil *z)

{Imobil *v;

Imobil *a;

v=(Imobil*)malloc(sizeof(Imobil));

if(v==NULL)

{return 0;

*v=*z;

v->next=b;

if(head==b)

head=v;

else

previousElement(a)->next=v;

return 1;

}
IMOBIL.H
#include <stdio.h>

#include <stdlib.h>

#include <string.h>

typedef struct Imobil

char proprietar[50];

char tip[50];

char adresa[50];

int suprafata;

float costul;

struct Imobil *next;

} Imobil;

Imobil *head, *phead1, *phead2;

void Menu();

int create(int n);

void readinfo(void);

void showinfo(void);

void modifyinfo(Imobil *c);

Imobil *Search(char *denum);

Imobil *currentelement(int nr);

Imobil *previousElement(Imobil *a);


Imobil *lastelement(void);

int sizelist(void);

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

void sort(void);

void freememory(void);

void apprend(Imobil *z);

void prepend(Imobil *z);

int insertbefore(Imobil *b,Imobil *z);

int insertafter(Imobil *b,Imobil *z);

void deleteElement(Imobil *a);

void splitList(int n1);

void mergeList(void);

int saveElement(char *fname);

void loadElement(int *nrn, char *fname);

Raspuns:
Concluzie: In aceasta lucrare de laborator am obtinut deprinderile
practice de implementare si de utilizare a tipului abstract de date
(TAD)”Lista simplu inlantuita” in limbajul C cu asigurarea operatiilor de
prelucrare ale liste. Am invatat sa implementam tipul abstract de date
“Lista unidirectionala” (“Lista simplu inlantuita”) in limbajul C.

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