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
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ă.
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>TEMA
#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;
}
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>Varianta 2 (cam nefunctional)
#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;
}
#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;
}