C: Lista - stiva si coada - aplicatii rezolvate


1) Să se scrie un tip structură pentru reprezentarea unei liste înlănţuite, prin intermediul căreia se vor reţine valori textuale pentru afişarea unui mesaj. Lista va conţine 3 elemente (rezolvare...)

2) Să se scrie un tip structură pentru reprezentarea unei liste înlănţuite, prin intermediul căreia se vor reţine valori textuale pentru afişarea unui mesaj. Toata referirea listei sa se faca folosind un singur element (rezolvare...)

3) Se va scrie un program pentru determinarea principalelor operaţii pe o listă înlănţuită (asimetrică) ce conţine numere întregi.
Se vor dezvolta următoarele operaţii: (rezolvare...)
- generarea (initializarea) unei liste
- lungimea (numarul de elemente) dintr-o lista
- adaugarea unui element intr-o lista: prin fata listei, prin spatele listei, dupa un element dat
- modificarea valorii unui anumit element al listei
- stergerea unui element din lista
- stergerea primului element
- stergerea ultimului element
- stergerea unui anumit element
- afisarea listei
- distrugerea (dealocarea) listei.

Rezolvari

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
//scriem o structura pentru reprezentarea unul nod (element) al listei
struct nod_lista{
	char* inf;
	nod_lista* next;
};
//construim un tip propiu pentru reprezentarea unui nod de lista pe baza structurii definite anterior
typedef struct nod_lista nod;
//functia principala in rulare
void main()
{
	nod* a; //primul element al listei
	a=(nod*)malloc(sizeof(nod));
	a->inf="Salut"; //continutul primului element

	nod* b; //al doilea element al listei
	b=(nod*)malloc(sizeof(nod));
	a->next=b; //urmatorul element al primului element
	b->inf="limbajul";
 
	nod* c; //al treilea element al listei
	c=(nod*)malloc(sizeof(nod));
	b->next=c;
	c->inf="C/C++!";
	c->next=NULL; //sau c->next=0;

	while(a) //a!=NULL sau a!=0
	{
		printf("%s ",a->inf);
		a=a->next;
	}
	getch();
}


#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
//scriem o structura pentru reprezentarea unul nod (element) al listei
struct nod_lista{
	char* inf;
	nod_lista* next;
};
//construim un tip propiu pentru reprezentarea unui nod de lista pe baza structurii definite anterior
typedef struct nod_lista nod;
//functia principala in rulare
void main()
{
	nod* a; //primul element al listei
	a=(nod*)malloc(sizeof(nod));
	a->inf="Salut"; //continutul primului element

	a->next=(nod*)malloc(sizeof(nod));
	a->next->inf="limbajul"; //urmatorul element al primului element

	a->next->next=(nod*)malloc(sizeof(nod));
	a->next->next->inf="C/C++!";
	a->next->next->next=NULL;
 
	while(a) //a!=NULL sau a!=0
	{
		printf("%s ",a->inf);
		a=a->next;
	}
	getch();
}


#include<stdio.h>
#include<conio.h>
#include<stdlib.h>

//definirea unui tip structura pentru reprezentarea unui nod al listei
typedef struct nod{
	int val;
	nod *next;
}nod;
 
//initializarea (generarea) unei liste
nod* init(nod *cap);
 
//lungimea - nr. de elemente din lista
int lung(nod *cap);
 
//adaugarea unui element prin fata listei
nod* adFata(nod *cap, int inf);
 
//adaugarea unui element prin spatele listei
nod* adSpate(nod *cap, int inf);
 
//adaugarea unui element pe o anumita pozitie in lista
nod* adInterior(nod *cap,int valpoz, int valnou);
 
//modificarea unei anumite valori din lista (daca valoarea ce se doreste
//a se modifica apare de mai multe ori, se va modifica prima intalnita)
nod* modify(nod *cap, int valvechi, int valnou);
 
//stergerea unui element prin fata listei
nod* stergeFata(nod *cap);
 
//stergerea unui anumit element din lista
nod* stergeVal(nod *cap, int inf);
 
//stergerea unui element prin spatele listei
nod* stergeSpate(nod *cap);
 
//afisarea componentelor listei
void afisList(nod *cap);
 
//distrugerea (dealocarea) listei
void destroy(nod *cap);
 
//initializarea (generarea) unei liste
nod* init(nod *cap)
{
	cap=NULL;
	return cap;
}
 
//lungimea - nr. de elemente din lista
int lung(nod *cap)
{
	nod *aux; //element de parcurgere a listei
	int nr=0;
	aux=cap;
	while(aux!=NULL)
	{
		nr++;
		aux=aux->next;
	}
return nr;
}
 
//adaugarea unui element prin fata listei
nod* adFata(nod *cap, int inf) //inf - o valoare numerica dorita ce va fi introdusa la utilizare
{
	nod *temp; //elementul auxiliar in care se va face initial adaugarea
	temp=(nod*)malloc(sizeof(nod));
temp->val=inf; //se populeaza elementul de valoare in cadrul listei, ramanand a se popula si cel de legatura
 
	//se face testarea daca mai sunt elemente in lista
	if (cap==NULL) //situatia in care lista este vida
	{
		temp->next=NULL;
		cap=temp;
	}
	else //situatia in care mai sunt elemente in lista
	{
		temp->next=cap;
		cap=temp;
	}
	return cap;
}
 
//adaugarea unui element prin spatele listei
nod* adSpate(nod *cap, int inf)
{
	nod *temp, *aux; //aux - folosit pentru parcurgerea pe lista
	temp=(nod*)malloc(sizeof(nod));
	temp->val=inf;
 
	//se face testarea daca mai sunt elemente in lista
	if (cap==NULL) //situatia in care lista este vida
	{
		temp->next=NULL;
		cap=temp;
	}
	else //situatia in care mai sunt elemente in lista
	{
		aux=cap;
		while(aux->next!=NULL)
			aux=aux->next;
		aux->next=temp;
		temp->next=NULL;
	}
return cap;
}
 
//adaugarea unui element pe o animita pozitie in lista
nod* adInterior(nod *cap, int valpoz, int valnou)
{
	nod *temp, *aux;
	temp=(nod*)malloc(sizeof(nod));
	temp->val=valnou;
	if (cap==NULL)
	{
		temp->next=NULL;
		cap=temp;
	}
	else
	{
		aux=cap;
		while((aux->next!=NULL)&&(aux->val!=valpoz))
			aux=aux->next;
		if(aux->val==valpoz)
		{
			temp->next=aux->next;
			aux->next=temp;
		}
 
		else
			printf("\nValoarea %d nu se afla in lista\n", valpoz);
	}
	return cap;
}
 
/*modificarea unei anumite valori din lista (daca valoarea ce se doreste 
a se modifica apare de mai multe ori, se va modifica prima intalnita)*/
nod* modify(nod *cap, int valvechi, int valnou)
{
	nod *aux;
	aux=cap;
	while((aux!=NULL)&&(aux->val!=valvechi))
		aux=aux->next;
	if(aux!=NULL)
		aux->val=valnou;
	return cap;
}
 
//stergerea unui element prin fata listei
nod* stergeFata(nod *cap)
{
	nod *temp;
	if (cap==NULL)
		printf("\nLista este vida\n");
	else
	{
		temp=cap;
		cap=cap->next;
		free(temp);
	}
	return cap;
}
 
//stergerea unui element prin spatele listei
nod* stergeSpate(nod *cap)
{
	nod *temp,*aux;
	if (cap==NULL)
		printf("\nLista este vida\n");
	else
		if (cap->next==NULL)
		{
			free(cap);
		}
		else
		{
			temp=cap;
			aux=temp->next;
			while(aux->next!=NULL)
			{
				aux=aux->next;
				temp=temp->next;
			}
		temp->next=NULL;
		free(aux);
		}
	return cap;
}
 
//stergerea unui anumit element din lista
nod* stergeVal(nod *cap, int inf)
{
	nod *temp, *aux;
	if (cap==NULL)
		printf("\nLista este vida\n");
	else
		if(cap->val==inf)
		{
			temp=cap;
			cap=cap->next;
			free(temp);
		}
		else
			if(cap->next==NULL)
				printf("\nValoarea de sters nu se afla in lista\n");
			else
			{
				temp=cap;
				aux=temp->next;
				while((aux!=NULL)&&(aux->val!=inf))
				{
				aux=aux->next;
					temp=temp->next;
				}
				if(aux!=NULL)
				{
					temp->next=aux->next;
						free(aux);
				}
			}
	return cap;
}
 
//afisarea componentelor din lista
void afisList(nod *cap)
{
	nod *aux;
	aux=cap;
	printf("Elementele listei sunt: ");
	while (aux!=NULL)
	{
		printf("%d ", aux->val);
		aux=aux->next;
	}
}
 
//distrugerea (dealocarea) listei
void destroy(nod *cap)
{
	nod *temp;
	printf("\nSe distruge lista\n");
	while(cap!=NULL)
	{
		temp=cap;
		cap=cap->next;
		free(temp);
	}
}
 
//functia principala in rulare
void main()
{
	nod *cap=NULL;
	int inf,poz;
	cap=init(cap); //initializarea listei
 
//introducerea elementelor in lista
	printf("Introduceti noduri in lista. Terminati cu zero: ");
	scanf("%d",&inf);
	while(inf!=0) //introducerea se va incheia cu elementul "0"
	{
		cap=adSpate(cap,inf); //am ales adaugarea prin spate
		scanf("%d",&inf);
	}
 
	afisList(cap); //afisarea componentelor listei
//adaugare de elemente prin folosirea optiunii de adaugare prin fata
	printf("\nIntroduceti un element pt a-l adauga pe prima pozitie: ");
	scanf("%d",&inf);
	cap=adFata(cap,inf);
	afisList(cap); //afisarea componentelor listei
 
//exemplificarea adaugarii prin interior
	printf("\nIntroduceti valoarea dupa care doriti sa inserati: ");
	scanf("%d",&poz);
	printf("Introduceti un element pt a-l adauga dupa valoarea %d: ",poz);
	scanf("%d",&inf);
	cap=adInterior(cap,poz,inf);
 
	afisList(cap); //afisarea componentelor listei
//exemplificarea optiunii de modificare a unei valori din lista
	printf("\nIntroduceti valoarea pe care doriti sa o modificati: ");
	scanf("%d",&poz);
	printf("Introduceti noua valoare: ");
	scanf("%d",&inf);
	cap=modify(cap,poz,inf);
 
	afisList(cap); //afisarea componentelor listei
//stergerea primului element din lista
	printf("\n\nVom sterge primul element din lista - ");
	cap=stergeFata(cap);
	afisList(cap); //afisarea componentelor listei
 
//stergerea prin spatele listei
	printf("\nVom sterge ultimul element din lista - ");
	cap=stergeSpate(cap);
	afisList(cap);
 
//stergerea unei anumite valori din lista
	printf("\nIntroduceti valoarea pe care doriti sa o stergeti: ");
	scanf("%d",&inf);
	cap=stergeVal(cap,inf);
	afisList(cap);
 
//distrugerea (dealocarea) listei
	printf("\n\nVom distruge lista");
	destroy(cap);
 
	getch();
}
Acest site utilizeaza cookie-uri. Navigand in continuare va exprimati acordul asupra folosirii cookie-urilor.