Sunteți pe pagina 1din 2

/* listcirc.

c - programul construieste o lista circulara de caractere,


pe care apoi o tipareste, si in care se cauta un anumit caracter */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
struct st_litera
{
char
car;
struct st_litera * pred, *urm;
};
int ncl=0;
/* numar de caractere afisate pe linie */
void atasare(struct st_litera *pl){
char c;
struct st_litera *vr;
while ((c=getchar()) != EOF)
if (c!='\n')
{vr=(struct st_litera *) malloc(sizeof(struct st_litera));
if (vr == NULL)
{ /* daca pointerul returnat de functia malloc() este
NULL */
printf("Memorie plina !!!!!!\n");
/* se tipareste un
mesaj de eroare */
break;
/* si se termina executia ciclului de citire
caractere */
}
vr->car=c;
if(pl->pred==pl)
/* lista vida? */
{vr->pred=vr->urm=pl;
pl->urm=pl->pred=vr;
}
else
{vr->urm=pl;
vr->pred=pl->pred;
pl->pred->urm=vr;
pl->pred=vr;
}
}
}
void afis_list_circ (struct st_litera *plc){
struct st_litera *p;
p=plc->urm;
while (p != plc)
{printf("%c -> ", p->car);
p=p->urm;
ncl++;
if (ncl%10==0) /* s-au afisat 10 caractere pe linie ? */
printf("\n");
}
if (plc->urm!=plc)
printf("%c (primul).\n", plc->urm->car);/* tiparire primul caracter sau
NULL daca lista este vida */
else
printf("NULL");
}
int numar_aparitii_car (struct st_litera *start, char *pcar)
{
int
numar = 0;

struct st_litera *curent;


/* pointerul cu care se parcurge lista */
*pcar=start->car;
/* se transmite prin adresa primita, caracterul
cautat */
curent=start->urm;
while (curent != start) /* cat timp referinta la urmatorul din lista */
{
/* nu a ajuns la santinela/ start */
if (start->car == curent->car) /* se numara daca este caracterul */
numar++;
curent=curent->urm;
}
return (numar);
}
int main()
{
struct st_litera *primul;
char ch;
primul->urm=primul->pred=primul; /* lista vida */
printf("\nProgramul construieste si afiseaza o lista circulara de char.\n");
printf("Introduceti caractere (CTRL-Z, Enter-pentru sfarsit):\n");
atasare(primul);
printf("\nLista circulara construita este:\n");
afis_list_circ(primul);
printf("Caracterul de cautat in lista: ");
ch=getch();
primul->car=ch; /* se pune caracterul de cautat in santinela/ start */
printf("\nCaracterul \'%c\' este in lista de %d ori\n",ch, numar_aparitii_car(pr
imul, &ch));
}