Orar semigroup #2

Orar semigroup #2

Laborator 3 - Liste circulare simplu inlantuite (11 martie)

De la tastatură se citeşte numărul n şi numele a n copii. Să se simuleze următorul joc: cei n copii stau într-un cerc. Începând cu un anumit copil, se numără copiii în sensul acelor de ceasornic. Fiecare al n-lea copil iese din cerc. Câştigă ultimul copil rămas în joc.

#include <stdio.h>
#include <stdlib.h>
typedef struct n
{
    char nume[20];
    struct n *urm;
} nod;
void adaugare(nod **prim, nod **ultim, char nume[])
{
    nod*p;
    p=(nod*)malloc(sizeof(nod));
    strcpy(p->nume,nume);
    if((*prim)==NULL)
    {
        *prim=p;
        *ultim=p;
        (*prim)->urm=p;
        (*ultim)->urm=p;
    }
    else
    {
        p->urm=(*ultim)->urm;
        (*ultim)->urm=p;
        *ultim=p;
    }
}
void afisare(nod *prim, nod *ultim)
{
    nod *p;
    p=prim;
    do
    {
         printf("%s | ",p->nume);
         p=p->urm;
    }
    while(p!=prim);
    printf("\n\n");
}
void joc(nod **prim, nod **ultim, int n)
{
    int i=1;
    nod *q=*prim,*p;
    while(*prim!=*ultim)
        {
            for(i=1;i<=n-1;i++)
            {
                q=q->urm;
            }
            p=q->urm;
         //   if(p!=*prim && p!=*ultim)
                q->urm=p->urm;
            if(p==*prim)
            {
              //  (*ultim)->urm=p->urm;
                *prim=p->urm;
            }
            if(p==*ultim)
            {
                *ultim=q;
               // (*ultim)->urm=prim;
            }
        afisare(*prim,*ultim);
        }
}
int main()
{
    nod *prim=NULL, *ultim=NULL, *p;
    int i,n;
    printf("n=");
    scanf("%d",&n);
    char nume[20];
    printf("Cititi cele %d nume\n",n);
    for(i=1;i<=n;i++)
    {
        printf("%d. ",i);
        scanf("%s",nume);
        adaugare(&prim,&ultim,nume);
    }
    afisare(prim,ultim);
    joc(&prim,&ultim,n);
    printf("\nTastati o tasta pentru terminare");
    getch();
    return 0;
}
Varianta 2
typedef struct n
{
    char nume[20];
    struct n *urm;
} nod;
typedef struct
{nod *prim;
nod *ultim;
int lungime;
}lista;
void adaugare(lista *l);
void afisare(lista *l);
void joc(lista *l, int n);
----------------------------------
#include <stdio.h>
#include <stdlib.h>
typedef struct n
{
    char nume[20];
    struct n *urm;
} nod;

typedef struct l
{
    nod *prim;
    nod *ultim;
    int lungime;
} lista;

void adaugare(lista *l,char nume[])
{
    nod*p;
    p=(nod*)malloc(sizeof(nod));
    strcpy(p->nume,nume);
    if((*prim)==NULL)
    {
        *prim=p;
        *ultim=p;
        (*prim)->urm=p;
        (*ultim)->urm=p;
    }
    else
    {
        p->urm=(*ultim)->urm;
        (*ultim)->urm=p;
        *ultim=p;
    }
}

void afisare(lista *l)
{
    nod *p;
    p=prim;
    do
    {
        printf("%s | ",p->nume);
        p=p->urm;
    }
    while(p!=prim);
    printf("\n\n");
}

void joc(lista *l, int n)
{
    int i=1;
    nod *q=*prim,*p;
    while(*prim!=*ultim)
    {
        for(i=1; i<=n-1; i++)
        {
            q=q->urm;
        }
        p=q->urm;
        //   if(p!=*prim && p!=*ultim)
        q->urm=p->urm;
        if(p==*prim)
        {
            //  (*ultim)->urm=p->urm;
            *prim=p->urm;
        }
        if(p==*ultim)
        {
            *ultim=q;
            // (*ultim)->urm=prim;
        }
        afisare(*prim,*ultim);
    }
}

int main()
{
    nod *prim=NULL, *ultim=NULL, *p;
    int i,n;
    lista *l;
    printf("n=");
    scanf("%d",&n);
    char nume[20];
    printf("Cititi cele %d nume\n",n);
    for(i=1; i<=n; i++)
    {
        printf("%d. ",i);
        scanf("%s",nume);
        adaugare(&l,nume);
    }
    afisare(l);
    joc(&l,n);
    printf("\nTastati o tasta pentru terminare");
    getch();
    return 0;
}
TEMA
Să se conceapă o stuctură dinamică eficientă pentru reprezentarea matricelor rare. Să se scrie operaţii de calcul a sumei a două matrice rare. Afisarea se va face in forma naturală.
#include <stdio.h>
#include <stdlib.h>
typedef struct nod
{
    int i,j,val;
    struct nod *urm;
}nod;

typedef struct
{
    int nrl;
    int nrc;
    nod *prim;
    nod *ultim;
    int nrelem;
}matrice;

void citire(nod **p)
{
    (*p)=NULL;
    nod *x;
    int i,n;
    int linie,coloana,valoare;
    printf("Nr. de valori diferite de 0: ");
    scanf("%d",&n);
    printf("Cititi linie, coloana, valoare:\n");
    for(i=1;i<=n;i++)
    {
        scanf("%d",&linie);
        scanf("%d",&coloana);
        scanf("%d",&valoare);
        x=(nod*)malloc(sizeof(nod));
        x->i=linie;;
        x->j=coloana;
        x->val=valoare;
        x->urm=(*p);
        (*p)=x;
    }
}

void maxim(nod *a, nod *b, int *imax, int *jmax)
{
    *imax=*jmax=0;
    int i;
    while(a)
    {
        if(a->i > *imax)
            *imax=a->i;
        if(a->j > *jmax)
            *jmax=a->j;
        a=a->urm;
    }
    while(b)
    {
        if(b->i > *imax)
            *imax=b->i;
        if(b->j > *jmax)
            *jmax=b->j;
        b=b->urm;
    }
}

void afisare(nod*p)
{
    printf("\n");
    if(p==NULL)
    {
        printf("Lista goala");
        exit(1);
    }

    while(p!=0)
    {
        printf("%d ",p->i);
        printf("%d ",p->j);
        printf("%d\n",p->val);
        p=p->urm;
    }
    printf("\n");
}

nod* cautare(nod *s,int i,int j)
{
    while(s)
    {
        if(s->i==i && s->j==j)
            return s;
        else s=s->urm;
    }
    return 0;
}

void suma(nod *a, nod *b, nod **s)
{
    nod *x;
    *s=NULL;
    while(a)
    {
        if(cautare(b,a->i,a->j))
        {   x=(nod*)malloc(sizeof(nod));
            x->i=a->i;
            x->j=a->i;
            x->val=a->val+b->val;
            x->urm=(*s);
            (*s)=x;
        }
        else
        {
            x=(nod*)malloc(sizeof(nod));
            x->i=a->i;
            x->j=a->i;
            x->val=a->val;
            x->urm=(*s);
            (*s)=x;
        }
    a=a->urm;
    }

    while(b)
    {
        if(cautare(a,b->i,b->j)==0 && cautare(*s,b->i,b->j)==0)
        {
            x=(nod*)malloc(sizeof(nod));
            x->i=b->i;
            x->j=b->i;
            x->val=b->val;
            x->urm=(*s);
            (*s)=x;
        }
        b=b->urm;
    }

}

void afisare_matrice(nod *s,int imax, int jmax)
{
    int i,j;
    nod *p;
    for(i=1;i<=imax;i++)
    {
        for(j=1;j<=jmax;j++)
    {
        p=cautare(s,i,j);
        if(p)
            printf("%d ",p->val);
        else printf("%d ",0);
    }
    printf("\n");
    }
}

int main()
{
    int n;
    int imax,jmax;
    int i,j;
    nod *a,*b,*s,*p;
    printf("Prima matrice\n");
    citire(&a);
    printf("A doua matrice\n");
    citire(&b);
    suma(a,b,&s);
    printf("Lista a\n");
    afisare(a);
    printf("Lista b\n");
    afisare(b);
    printf("Lista suma\n");
    afisare(s);
    maxim(a,b,&imax,&jmax);
    printf("Nr de linii: %d\nNr de coloane: %d\n\n",imax,jmax);
    afisare_matrice(s,imax,jmax);

    printf("\n\nTastati o tasta pentru terminarea programului");
    getch();
    return 0;
}
Varianta 2 (cam nefunctional)

#include <stdio.h>
#include <stdlib.h>
typedef struct nod
{
    int i,j,val;
    struct nod *urm;
}nod;

typedef struct
{
    int nrl;
    int nrc;
    nod *prim;
    nod *ultim;
    int nrelem;
}matrice;

void adaug(matrice *m,int l,int c,int v)
{
    nod *p;
    p=(nod *)malloc(sizeof(nod));
    p->i=l;
    p->j=c;
    p->val=v;
    if(m->prim==0)
    {
        m->prim=m->ultim=p;
    }
    else
    {
        m->ultim->urm=p;
        m->ultim=p;
    }
    p->urm=0;
}

int val(matrice *m,int i, int j)
{
    while(m->prim)
    {
        if(m->prim->i==i && m->prim->j==j)
            return m->prim->val;
        else m->prim=m->prim->urm;
    }
    return 0;
}

void adun(matrice *d,matrice *m1, matrice *m2)
{
    int i,j,suma;
    for(i=1;i<=m1->nrl;i++)
    {
        for(j=1;j<=m1->nrc;j++)
        {
            suma=val(m1,i,j)+val(m2,i,j);
            if(suma!=0)
                adaug(d,i,j,suma);
        }
            //printf("\n");
    }
}

void afisare_matrice(matrice *d)
{
    int i,j,suma;
    for(i=1;i<=d->nrl;i++)
    {
        for(j=1;j<=d->nrc;j++)
            printf(" %d",val(d,i,j));
        printf("\n");
    }
}

int main()
{
    matrice m1,m2,m3;
    int n,i,v,l,c;
    m1.prim=m1.ultim=m2.prim=m2.ultim=NULL;
    printf("Matricea 1\nNr. linii:");
    scanf("%d",&m1.nrl);
    printf("Nr. coloane: ");
    scanf("%d",&m1.nrc);
    printf("Nr. de elemente diferite de 0: ");
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    {
        printf("Linia: ");
        scanf("%d",&l);
        printf("Coloana: ");
        scanf("%d",&c);
        printf("Valoare: ");
        scanf("%d",&v);
        adaug(&m1,l,c,v);
    }
    printf("\nMatricea 2\nNr. linii:");
    scanf("%d",&m2.nrl);
    printf("Nr. coloane: ");
    scanf("%d",&m2.nrc);
    printf("Nr. de elemente diferite de 0: ");
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    {
        printf("Linia: ");
        scanf("%d",&l);
        printf("Coloana: ");
        scanf("%d",&c);
        printf("Valoare: ");
        scanf("%d",&v);
        adaug(&m2,l,c,v);
    }
    printf("DDDDDD");
    adun(&m3,&m2,&m1);
    printf("DDDDDD");
    printf("%d %d\n",m3->nrl,m3->nrc);
    getch();
    afisare_matrice(&m3);

    printf("\n\nTastati o tasta pentru terminarea programului");
    getch();
    return 0;
}

marți, 11 martie 2014 by DlMuresan
Categories: , , | Leave a comment

Leave a Reply