You are on page 1of 3

/* .

De la tastatura se citesc n cuvinte ; sa se creeze o lista dublu


�nlan?uita, care sa con?ina �n noduri cuvintele distincte oi frecven?a lor de
apari?ie. Lista va fi ordonata
alfabetic. Se vor afioa cuvintele oi frecven?a lor de apari?ie a) �n ordine
alfabetica crescatoare oi b) �n
ordine alfabetica descrescatoare. */

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

typedef struct n
{
char key[20];//cuvantul
int f;//frecventa
struct n *next,*prev;
} nod;

nod *first,*last;

void creat_empty_list()
{
first=NULL;
last=NULL;
}

void add_Node()
{
char cheie[20];
nod *p,*q;
int inserat=0;

printf("\nCuvant: ");
fflush(stdin);
scanf("%s",cheie);

///lista vida
if(!first)//daca lista e vida, acesta e primul nod introdus
{
first=(nod*)malloc(sizeof(nod));
strcpy(first->key,cheie);
first->f=1;
first->next = first->prev = first;
last=first;
}

///lista nevida
else//daca mai exista noduri in lista, cautam cuvantul
{
p=first;
while(p->next!=first) ///!!!!
{
///cuv exista, crestem frecv

if(!strcmp(p->key,cheie))
{
p->f++;
inserat=1;
break;
}

else

///cautam unde sa il introducem


if(strcmp(p->key,cheie)<0) //n-am ajuns inca la pozitia de inserare
{
p=p->next;
}

///am gasit unde inseram


else //am ajuns imediat dupa pozitia de inserare =>inseram
inaintea nodului p //undeva in mijloc
{
q=(nod*)malloc(sizeof(nod));
strcpy(q->key,cheie);
q->f=1;

if(p!=first)
{
p->prev->next = q;
q->prev = p->prev;
p->prev = q;
q->next = p;
}
else
///inserare inaintea primului nod
{
//p==first
p->prev = q;
q->next = p;
q->prev = last;
first = q;
}
inserat=1;
break;
}

}//end while

if(!inserat) //inca nu am inserat cuvantul


{
///adaugare dupa ultimul nod
q=(nod*)malloc(sizeof(nod));
strcpy(q->key,cheie);
q->f=1;

last->next = q;
q->prev = last;
q->next = first;
last = q;
}
}
}

void print_List(int ordine)


{
nod *temp;

printf("\n Afisare\n");
printf(" Cuvant Frecventa \n");

last = first->prev;
first = last->next;
//A-Z
if(ordine==1)
{
temp = first;
while(temp->next!=first)
{
printf("%10s%20d\n",temp->key,temp->f);
temp=temp->next;
}
printf("%10s%20d\n",temp->key,temp->f);
}

else if(ordine==2)
{
//Z-A
temp = last;
while(temp->prev!=last)
{
printf("%10s%20d\n",temp->key,temp->f);
temp=temp->prev;
}
printf("%10s%20d\n",temp->key,temp->f);
}

int main()
{
int i, n, ordine;
creat_empty_list();

printf("Numar de cuvinte: ");


scanf("%d",&n);

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


add_Node();

printf("\nAfisare:\nTasta '1': A-Z\nTasta '2': Z-A\n");


scanf("%d",&ordine);

print_List(ordine);

return 0;
}

You might also like