vineri, 14 septembrie 2018

Alocare dinamica - interclasare liste

# include <stdio.h>;
# include <alloc.h>;
# include <conio.h>;
# include <values.h>;
# include <math.h>;

struct nod{int util; struct nod * next;};
typedef struct nod NOD;
typedef NOD * NOD_PTR;

int n,m,i,val;
NOD_PTR first1,first2,first3,p,q,r,s,aux;

NOD * sl_ins(int n)
{
NOD * first;
//Creare primul nod
i=1;
printf("a[%d]=",i);
 scanf("%d",&val);

first=NULL;
first=(NOD_PTR)malloc(sizeof(NOD));
first->util=val;
first->next=NULL;

//Inserarea celorlalte numere

for(i=2;i<=n;i++)
{
 //Citire valoare
 printf("a[%d]=",i);
  scanf("%d",&val);

 //Determinare pozitie si legarea in lista
 p=first;
 while((p->next!=NULL)&&(p->next->util<val))
  {
   p=p->next;
  }
 //Cream un nou nod(var dinamica), dupa ce i-am determinat pozitia (p->next)
 q=(NOD_PTR) malloc(sizeof(NOD));
  q->util=val;
  q->next=NULL;
  if(val<p->util)
   {
    q->next=p;
    first=q;
   }
  else
   {
    q->next=p->next;
    p->next=q;
   }
}

//Creare santinele

r=NULL;
r=(NOD *)malloc(sizeof(NOD));
r->next=NULL;
r->util= - MAXINT;

//Legare la primul nod
r->next=first;
first=r;

r=NULL;
r=(NOD *)malloc(sizeof(NOD));
r->next=NULL;
r->util= + MAXINT;

//Legare dupa ultimul nod
// (**)

// !!! Parcurg lista (q nu e ultimul daca s-a inserat primul si p=?)
p=first;
while(p->next!=NULL)
{
p=p->next;
}
//Acum p==ultimul nod

// (**)
p->next=r;

return first;
}

void afis(NOD * first)
{
//Afisam lista sortata prin inserare
printf("\nAfisam lista:\n");
p=first;
while(p!=NULL)
{
 if(abs(p->util)!=MAXINT)
   printf("%d ",p->util);
 p=p->next;
}

}

void main(void)
{
clrscr();

printf("Intr nr de elemente din prima lista: ");
 scanf("%d",&n);
printf("Intr nr de elemente din a doua lista: ");
 scanf("%d",&m);


first1=sl_ins(n);
first2=sl_ins(m);

afis(first1);
 printf("\n");
afis(first2);

//Interclasare
p=first1;
q=first2;

first3=NULL;
first3=(NOD *)malloc(sizeof(NOD));
first3->next=NULL;


if(p->util<q->util)
 {
  first3->util=p->util;
  p=p->next;
 }
else
{
 first3->util=q->util;
  q=q->next;
}
aux=first3;

while((p!=NULL)&&(q!=NULL))
{

r=NULL;
r=(NOD *)malloc(sizeof(NOD));
r->next=NULL;

if(p->util<q->util)
 {
  r->util=p->util;
  p=p->next;
 }
else
{
 r->util=q->util;
  q=q->next;
}
aux->next=r;
aux=r;
}

//Copiere
if(p==NULL)
 aux=q;
else aux=p;

s=r;

r=NULL;
r=(NOD *)malloc(sizeof(NOD));
r->next=NULL;
r->util=aux->util;

aux=aux->next;
s->next=r;
s=r;

while(aux!=NULL)
{
r=NULL;
r=(NOD *)malloc(sizeof(NOD));
r->next=NULL;

r->util=aux->util;
aux=aux->next;

s->next=r;
s=r;

}

//Afisare sir interclasat
printf("\nAfisez sirl interclasat:\n");
afis(first3);

getche();
}

# include <stdio.h>;
# include <alloc.h>;
# include <conio.h>;

struct nod{int util; struct nod * next;};
typedef struct nod NOD;
typedef NOD * NOD_PTR;

int n,m,i,val;
NOD_PTR first1,first2,first3,p,q,r,s,aux;

NOD * sl_ins(int n)
{
NOD * first;
//Creare primul nod
i=1;
printf("a[%d]=",i);
 scanf("%d",&val);

first=NULL;
first=(NOD_PTR)malloc(sizeof(NOD));
first->util=val;
first->next=NULL;

//Inserarea celorlalte numere

for(i=2;i<=n;i++)
{
 //Citire valoare
 printf("a[%d]=",i);
  scanf("%d",&val);

 //Determinare pozitie si legarea in lista
 p=first;
 while((p->next!=NULL)&&(p->next->util<val))
  {
   p=p->next;
  }
 //Cream un nou nod(var dinamica), dupa ce i-am determinat pozitia (p->next)
 q=(NOD_PTR) malloc(sizeof(NOD));
  q->util=val;
  q->next=NULL;
  if(val<p->util)
   {
    q->next=p;
    first=q;
   }
  else
   {
    q->next=p->next;
    p->next=q;
   }
}
return first;
}

void afis(NOD * first)
{
//Afisam lista sortata prin inserare
printf("\nAfisam lista:\n");
p=first;
while(p!=NULL)
{
 printf("%d ",p->util);
 p=p->next;
}

}

void main(void)
{
clrscr();

printf("Intr nr de elemente din prima lista: ");
 scanf("%d",&n);
printf("Intr nr de elemente din a doua lista: ");
 scanf("%d",&m);


first1=sl_ins(n);
first2=sl_ins(m);

afis(first1);
 printf("\n");
afis(first2);

//Interclasare
p=first1;
q=first2;

first3=NULL;
first3=(NOD *)malloc(sizeof(NOD));
first3->next=NULL;


if(p->util<q->util)
 {
  first3->util=p->util;
  p=p->next;
 }
else
{
 first3->util=q->util;
  q=q->next;
}
aux=first3;

while((p!=NULL)&&(q!=NULL))
{

r=NULL;
r=(NOD *)malloc(sizeof(NOD));
r->next=NULL;

if(p->util<q->util)
 {
  r->util=p->util;
  p=p->next;
 }
else
{
 r->util=q->util;
  q=q->next;
}
aux->next=r;
aux=r;
}

//Copiere
if(p==NULL)
 aux=q;
else aux=p;

s=r;

r=NULL;
r=(NOD *)malloc(sizeof(NOD));
r->next=NULL;
r->util=aux->util;

aux=aux->next;
s->next=r;
s=r;

while(aux!=NULL)
{
r=NULL;
r=(NOD *)malloc(sizeof(NOD));
r->next=NULL;

r->util=aux->util;
aux=aux->next;

s->next=r;
s=r;

}

//Afisare sir interclasat
printf("\nAfisez sirl interclasat:\n");
afis(first3);

getche();
}

Niciun comentariu:

Trimiteți un comentariu