Orar semigroup #2

Orar semigroup #2

Laborator 4 - Liste circulare dublu inlantuite (18 martie)

Din fisier se citesc, caracter cu caracter, n caractere; să se creeze o listă dublu înlănţuită, care să conţină în noduri caracterele distincte şi frecvenţa lor de apariţie. Lista va fi ordonată alfabetic. Se vor afişa caracterele şi frecvenţa lor de apariţie a) în ordine alfabetică crescătoare şi b) în ordine alfabetică descrescătoare.

#include <stdio.h>
#include <stdlib.h>
typedef struct nodtype
{
    char s[20];
    int a;
    struct nodtype *urm;
    struct nodtype *prec;
} nod;

void adaug(nod **prim,nod **ultim,char s[])
{
    nod *p;
    p=(nod *)malloc(sizeof(nod));
    strcpy(p->s,s);
    p->urm=NULL;
    p->prec=NULL;
    p->a=1;

    if (!(*prim))
    {
        (*prim)=p;
        (*ultim)=p;
        return 0;
    }
    else
    {
        if (!(*prim)->urm)
        {
            if (strcmp(p->s,(*prim)->s)<0)
            {
                p->urm=(*prim);
                (*ultim)=(*prim);
                (*prim)=p;
                (*ultim)->prec=p;
                return 0;
            }
            else
            {
                if (strcmp(p->s,(*prim)->s)>0)
                {
                    p->prec=(*prim);
                    (*prim)->urm=p;
                    (*ultim)=p;
                    return 0;
                }
                else
                {
                    (*prim)->a=(*prim)->a+1;
                    return 0;
                }
            }
        }
    }

    nod *q;
    q=(nod *)malloc(sizeof(nod));
    q=(*prim);

    if (strcmp(p->s,q->s)<0)
    {
        p->urm=(*prim);
        (*prim)->prec=p;
        (*prim)=p;
        return 0;
    }

    while (strcmp(p->s,(q->urm)->s)>0)
    {
        q=q->urm;
        if (!q->urm)
            break;
    }
    if (!q)
    {
        p->prec=(*ultim);
        (*ultim)->urm=p;
        (*ultim)=p;
        return 0;
    }
    if (q->urm && strcmp(p->s,(q->urm)->s)==0)
    {
        (q->urm)->a=(q->urm)->a+1;
        return 0;
    }

    if (strcmp(p->s,q->s)==0)
        q->a=q->a+1;
    else
    {
        if (q!=(*ultim))
        {
            p->urm=q->urm;
            p->prec=q;
            (q->urm)->prec=p;
            q->urm=p;
        }
        else
        {
            p->prec=(*ultim);
            (*ultim)->urm=p;
            (*ultim)=p;
        }
    }
}

void afisare(nod *prim)
{
    while (prim)
    {
        printf("%s - %d\n",prim->s,prim->a);
        prim=prim->urm;
    }
    printf("\n");
}

int main()
{
    char s[20];
    FILE *f;
    nod *prim,*ultim;
    prim=(nod *)malloc(sizeof(nod));
    ultim=(nod *)malloc(sizeof(nod));
    prim=NULL;
    ultim=NULL;

    f=fopen("in.txt","r");

    while (!feof(f))
    {
        fscanf(f,"%s",s);
        adaug(&prim,&ultim,s);
    }
    afisare(prim);
    printf("\nTastati o tasta pentru terminare");
    getch();
    return 0;
}
Fisier in.txt
sepcile
rosii
u
u
haide
haide
u
u
sepcile
u
u
u
rosii
stadion
noi
universitatea

marți, 18 martie 2014 by DlMuresan
Categories: , , , | 6 comments

Comments (6)

  1. 3.4. Folosind o listă circulară dublu înlănţuită să se simuleze următorul joc: n copii, ale căror nume se citesc de la tastatură, stau în cerc. Începând cu un anumit copil (numele său se citeşte), se numără copiii în sensul acelor de ceasornic. Fiecare al m-lea copil (m se citeşte) iese din joc. Numărătoarea continuă începând cu următorul copil din cerc. Câştigă jocul ultimul copil rămas în cerc.

    3.5. Aceeaşi problemă ca la 3.4., dar numărătoarea se face în sens contrar cu cel al acelor de ceasornic.

  2. Dupa fiecare eliminare, sensul de numarare se schimba.

  3. d->nrl=m1->nrl;
    d->nrc=m1->nrc;

    in functia adun

  4. Nu ai rezolvarea la problema scrisa cu albastru?

  5. Nu inca.

Leave a Reply