//Inversare lista construita prin insertie
//
//V. Rosca - Culegere de probleme de programare, prb. 7.1 == [2], pag. 127
//+ [2], pag. 126, prb. 1
//
# 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,i,val;
NOD_PTR first,p,q,r;
void main(void)
{
clrscr();
printf("Intr nr de elemente: ");
scanf("%d",&n);
//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;
}
}
//Afisam lista sortata prin inserare
printf("\nAfisam lista sortata:\n");
p=first;
while(p!=NULL)
{
printf("%d ",p->util);
p=p->next;
}
//Inversam lista
p=first;
//Lucrez cu perechi de pointeri si le interschimb legaturile
q=p->next;
p->next=NULL;
while(q)
{
r=q->next;
q->next=p;
p=q;
q=r; //q==NULL la ultima bucla
}
first=p;
//Afisam lista inversata
printf("\nAfisam lista inversata:\n");
p=first;
while(p!=NULL)
{
printf("%d ",p->util);
p=p->next;
}
getche();
}
Niciun comentariu:
Trimiteți un comentariu