lista circulara

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 p lina !!!!!!\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;

Upload: lucian-ionut

Post on 06-Oct-2015

214 views

Category:

Documents


0 download

DESCRIPTION

Lista

TRANSCRIPT

/* listcirc.c - programul construieste o lista circulara de caractere, pe care apoi o tipareste, si in care se cauta un anumit caracter */#include #include #include #include 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() esteNULL */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 sauNULL daca lista este vida */elseprintf("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(primul, &ch));}