RAPORT
Lucrarea de laborator nr.9
la disciplina Structuri de date și Algoritmi
A efectuat:
st. gr. AI-191 Tronciu
Alexandru
A verificat:
dr., conf.univ., catedra IA D.Moraru
Chişinău – 2020
Lucrare de laborator 2-3
O listă simplu înlănţuită este o colecţie de noduri aşezate într-o ordine liniară (dar
NU în locaţii succesive din memorie - aşa cum se întâmplă la vectori). Fiecare nod
are cel puţin un pointer către următorul nod, pe care îl vom numi next. Primul nod
se numeşte head,. Lista se numeşte simplu înlănţuită deoarece fiecare nod
memorează un singur pointer către următorul nod. Spre deosebire de vectori, lista
nu are o mărime fixă. Poate fi redimensionată prin adăugarea sau ştergerea
nodurilor. Un nod este ca un obiect (item) care conţine atât informaţia pe care vreţi
s-o stocaţi cât şi legătura către următorul obiect.
Datorită faptului ca elementele listei sunt stocate în diferite părți ale memoriei
calculatorului sunt ușurate anumite operații cu lista, de exemplu inserarea sau
ștergerea unui element al listei nu necesită mișcarea celorlalte elemente pentru a
face loc sau pentru a strînge lista, așa cum se întîmplă la vectori de exemplu.
void add_to_end();
Functia de adaugare a elementelor la sfirsit de lista simplu
inlantuita necirculara.
void delete_id(int id);
Funcita de stergere a unui element din lista simplu inlantuita
necirculara.
void devide(int id,masina** head2);
Functia care devizeaza lista in doua liste,are 2
parametri,primul ste o variabila de tip int care reprezinta
indicile deunde lista v-a fi devizata,ia al doilea este adresa
elementului care urmeaza sa fie capul listei 2*/
void join(masina** head2);
Functia de unire a listei in doua,are ca parametru adresa
elementului care este capul listei 2.
void modif(int id);
Funcita de modificare a unui element din lista simplu inlantuita
necirculara,avind ca parametru o variabila de tip int care este
indicile elementului care urmeaza a fi modificat.
void save(char* s);
Funcitia de salvare a informatiei din lista simplu inlantuita
necirculara in fisier,are ca paramentru adresa la string-ul
introdus de utilizator care reprezinta numele fisierului.
void load(char* s);
Funcitia de incarcare a informatiei din fisier in lista simplu
inltantuita necirculare,are ca paramentru adresa la string-ul
introdus de utilizator care reprezinta numele fisierului.
void freem();
Funcita de eliberearea memoriei,distrugerea listei simplu
inlantuite necirculare.
Fisierul lista.c
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#include "lista.h"
int createList(int n)
{
int i;
aeroport *c,*p;
for(i=0;i<n;i++)
{
c=(aeroport*)malloc(sizeof(aeroport));
if(c == NULL) return 0;
if(i == 0)
{
head=c;
p=c;
}
else
{
p->next=c;
p=c;
}
}
p->next=NULL;
return 1;
}
void readInfo(void)
{
aeroport *c=head;
int i=0;
while(c)
{
printf("\n");
printf("Introdu datele avionului %d\n",i+1);
printf("ID_avionului: ");
scanf("%s",&c->ID_avionului);
printf("Statuslui_avionlui: ");
scanf("%s",&c->Statusul_avionului);
printf("Ora_de_plecare: ");
scanf("%s",&c->Ora_de_plecare);
printf("Ora_de_aterizare: ");
scanf("%s",&c->Ora_de_aterizare);
printf("Pasageri: ");
scanf("%d",&c->Pasageri);
c=c->next;
i++;
}
}
void showInfo(void)
{
aeroport* c;
int i=0;
c=head;
while(c)
{
printf("Numarul avionului inregistrat: %d\n",i+1);
printf("ID_avionului: %s\n",c->ID_avionului);
printf("Statuslul_avionului: %s\n",c->Statusul_avionului);
printf("Ora_de_plecare: %s\n",c->Ora_de_plecare);
printf("Ora_de_aterizare: %s\n",c->Ora_de_aterizare);
printf("Pasageri: %d\n\n",c->Pasageri);
printf("Adresa curenta: %p\n",c);
printf("Adresa elementului urmator: %p\n",c->next);
c=c->next;
i++;
}
}
void showSearch(void)
{
aeroport *c=head;
char s[100];
int i=0,k=0;
puts("Dati denumirea cautata"); scanf("%s",&s);
while(c)
{
if(stricmp(s,c->ID_avionului)==0)
{
printf("Numarul avionului inregistrat: %d\n",i+1);
printf("ID_avionului: %s\n",c->ID_avionului);
printf("Statuslul_avionului: %s\n",c->Statusul_avionului);
printf("Ora_de_plecare: %s\n",c->Ora_de_plecare);
printf("Ora_de_aterizare: %s\n",c->Ora_de_aterizare);
printf("Pasageri: %d\n\n",c->Pasageri);
k++;
}
c=c->next;
i++;
}
if(k==0)
printf("Elementul nu a fost gasit!\n");
}
aeroport* searchInfo(char* s)
{
aeroport* c=head;
int k=0;
while(c)
{
if(stricmp(s,c->ID_avionului)==0 )
{
return c;
k++;
}
c=c->next;
}
if(k==0)
{
printf("Nu exista asa avion!\n");
}
return NULL;
}
void swapInfo(aeroport *a,aeroport *b)
{
aeroport t,*na,*nb;
na=a->next;
nb=b->next;
t=*a;
*a=*b;
*b=t;
a->next=na;
b->next=nb;
}
int lenghtList()
{
aeroport *c=head;
int i=0;
while(c)
{
i++;
c=c->next;
}
return i;
}
aeroport* lastElement(void)
{
aeroport *c;
if(head==NULL){return NULL;}
c=head;
while(c->next)
{
c=c->next; if (c->next==head){break;}
} return c;
}
void sortInfo(void)
{
aeroport *a,*b;
int i,k,l;
l=lenghtList();
for(i=0;i<l-1;i++)
{
a=head;
b=a->next;
for(k=0;k<l-1-i;k++)
{
if(a->Pasageri < b->Pasageri)
{
swapInfo(a,b);
}
a=a->next;
b=b->next;
}
}
}
aeroport* endInfo(void)
{
aeroport* c;
c=head;
while(c->next)
{
c=c->next;
}
return c;
}
void modifyInfo(int id)
{
aeroport* c=head;
int i=0;
while(c)
{
if(i+1 == id)
{
printf("Datele avionului %d pentru modificare:\n",i+1);
printf("ID_avionului: ");
scanf("%s",&c->ID_avionului);
printf("Statusul_avionului: ");
scanf("%s",&c->Statusul_avionului);
printf("Ora_de_plecare: ");
scanf("%s",&c->Ora_de_plecare);
printf("Ora_de_aterizare: ");
scanf("%s",&c->Ora_de_aterizare);
printf("Pasageri: ");
scanf("%d",&c->Pasageri);
}
c=c->next;
i++;
}
}
void add_after_id(int id)
{
aeroport *c=head,*p;
int i=0;
while(c){
if(i == id-1){
p=c;
c=(aeroport*)malloc(sizeof(aeroport));
printf("Introdu datele avionului %d\n",i+2);
printf("ID_avionului: ");
scanf("%s",&c->ID_avionului);
printf("Statusul_avionului: ");
scanf("%s",&c->Statusul_avionului);
printf("Ora_de_plecare: ");
scanf("%s",&c->Ora_de_plecare);
printf("Ora_de_aterizare: ");
scanf("%s",&c->Ora_de_aterizare);
printf("Pasageri: ");
scanf("%d",&c->Pasageri);
c->next=p->next;
p->next=c;
break;
}
i++;
c=c->next;
}
}
void add_before_id(int id)
{
aeroport *c=head,*p;
int i=0;
while(c){
if(i == id-1){
p=c;
c=(aeroport*)malloc(sizeof(aeroport));
printf("Introdu datele avionului %d\n",i-2);
printf("ID_avionului: ");
scanf("%s",&c->ID_avionului);
printf("Statusul_avionului: ");
scanf("%s",&c->Statusul_avionului);
printf("Ora_de_plecare: ");
scanf("%s",&c->Ora_de_plecare);
printf("Ora_de_aterizare: ");
scanf("%s",&c->Ora_de_aterizare);
printf("Pasageri: ");
scanf("%d",&c->Pasageri);
if(p == head){
c->next=head;
head=c;
break;
}
else {
c->next=p;
i=0;
p=head;
while(p){
if(i == id-2){
p->next=c;
}
i++;
p=p->next;
}
break;
}
}
i++;
c=c->next;
}
}
void add_to_end()
{
aeroport *c=head,*p;
while(c){
if(c->next == NULL){
p=c;
c=(aeroport*)malloc(sizeof(aeroport));
printf("Introdu datele avion\n");
printf("ID_avionului: ");
scanf("%s",&c->ID_avionului);
printf("Statusul_avionului: ");
scanf("%s",&c->Statusul_avionului);
printf("Ora_de_plecare: ");
scanf("%s",&c->Ora_de_plecare);
printf("Ora_de_aterizare: ");
scanf("%s",&c->Ora_de_aterizare);
printf("Pasageri: ");
scanf("%d",&c->Pasageri);
p->next=c;
c->next=NULL;
break;
}
c=c->next;
}
}
int prependInfo(void)
{
aeroport *c;
c=(aeroport*)malloc(sizeof(aeroport));
if (c==NULL) { return 0;}
printf("Introdu datele avion\n");
printf("ID_avionului: ");
scanf("%s",&c->ID_avionului);
printf("Statusul_avionului: ");
scanf("%s",&c->Statusul_avionului);
printf("Ora_de_plecare: ");
scanf("%s",&c->Ora_de_plecare);
printf("Ora_de_aterizare: ");
scanf("%s",&c->Ora_de_aterizare);
printf("Pasageri: ");
scanf("%d",&c->Pasageri);
c->next=head;
head=c;
return 1;
}
void freem()
{
aeroport *c=head,*p;
while(c)
{
p=c;
c=c->next;
free(p);
if(c == NULL)
{
break;
}
}
head=NULL;
}
}
void load(char* fname)
{
aeroport* c;
FILE *fp;
fp=fopen(fname,"r");
c=head;
while(c)
{
fscanf(fp,"%s",&c->ID_avionului);
fscanf(fp,"%s",&c->Statusul_avionului);
fscanf(fp,"%s",&c->Ora_de_plecare);
fscanf(fp,"%s",&c->Ora_de_aterizare);
fscanf(fp,"%d",&c->Pasageri);
c=c->next;
}
fclose(fp);
return 1;
}
Fisierul main.cpp
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include "lista.h"
int flag=0;
int main()
{
aeroport *a=NULL;
aeroport *b=NULL;
aeroport*head2=NULL;
char a1[100];
char b1[100];
char savef[100];
char loadf[100];
int n;
int mod;
int id_devide;
int id_before;
int id_after;
int id_delete;
int choice;
printf("\tBun venit la baza de date 'AEROPORT' .\n\t Tastati Enter pentru a continua...\n");
getch();
head=NULL;
while(choice!=19)
{ printf("\nSelectati dintre variantele propuse:\n1.Alocarea memoriei\n2.Introducerea
informatiei\n3.Afisarea informatiei\n4.Cautarea elementului\n5.Modificarea unui element
precizat\n6.Interschimbarea\n7.Sortarea dupa camp a elementelor\n8.Adaugarea unui element la
sfarsitul listei\n9-Adaugarea unui element la inceputul listei\n10-Adaugarea unui element dupa
pozitia indicata a listei\n11-Adaugarea unui element inainte de pozitia indicata a listei\n12-
Stergerea unui element indicat\n13-Divizarea listei in doua liste separate\n14-Unirea a 2 liste
intr-o lista\n15-Determinarea adresei ultimului eliment al listei\n16-Salvarea listei in fisier\n17-
Citirea informatiei din fisier\n18-Eliberarea memoriei alocate\n19-Iesirea din Sistem\n");
printf("\n\tAlegerea dumneavoastra este: ");
scanf("%i",&choice);
switch (choice)
{
case 1 : printf("Dati numarul de elemente care le veti prelucra: ");
scanf("%i",&n); if (createList(n)==1) {flag=1; break;} else{printf("A intervenit o
eroare in alocarea memoriei");}
case 2 : if (head==NULL || flag==0){printf("Memoria nu a fost alocata sau lista nu exista");
printf("\nPress any key to continue...\n"); getch(); break;} readInfo(); printf("\nPress any key to
continue...\n"); getch();break;
case 3 : if (head==NULL|| flag==0){ printf("Nu au fost introduse datele despre vreun
imobil"); getch(); break;} else { showInfo(); printf("\nPress any key to continue...\n"); getch();
break;}
case 4 : if (head==NULL || flag==0){printf("Memoria nu a fost alocata sau lista nu exista");
printf("\nPress any key to continue...\n"); getch(); break;} showSearch(); printf("\nPress any key
to continue...\n"); getch(); break;
case 5 : if (head==NULL || flag==0){printf("Memoria nu a fost alocata sau lista nu exista");
printf("\nPress any key to continue...\n"); getch(); break;} printf("Dati numarul de ordine al
elementului ce doriti sa-l modificati"); scanf("%d",&mod); modifyInfo(mod); printf("\nPress any
key to continue...\n"); getch(); break;
case 6 : if (head==NULL || flag==0){printf("Memoria nu a fost alocata sau lista nu exista");
printf("\nPress any key to continue...\n"); getch(); break;}
printf("Dati numele primului element pentru
interschimbare\n:");
fflush(stdin);
gets(a1);
a=searchInfo(a1);
printf("Dati numele primului element pentru
interschimbare\n>");
fflush(stdin);
gets(b1);
b=searchInfo(b1);
swapInfo(a,b);
getch();
printf("Interschimbarea a avut loc cu succes!\a\n");
break;
Concluzii:
1. Au fost obținute deprinderi de creare a unei baze de date abstractizate utilizînd
lista simplu înlănțuită în limbajul C.
2. Au fost obținute deprinderi de prelucrare a listei simplu înlănțuite, adaugarea
elementelor, stergerea, afisarea, sortarea, cautarea, interschimbarea etc.
3. Au fost obținute deprinderi de salvare a datelor în fișiere și citirea datelor din
ele.
4. Au fost obținute deprinderi de creare a fișierelor antet cu extensia .h, fișierelor
cu funcții cu extensia .c și includerea lor în proiect.
Bibliografie:
1. Conspectul prelegerilor cursului Structuri de date și Algoritmi. Lector dr.,
conf. univ. M. Kulev. Chișinău: UTM, 2014.
2. https://en.wikipedia.org/wiki/Linked_list accesat la 07.03.2015