Download as doc, pdf, or txt
Download as doc, pdf, or txt
You are on page 1of 11

LABORATOR 5

TEMA 1
1. Enunt
Scrieti programul C care permite efectuarea tuturor operatiilor cu lista liniara simplu inlantuita cu
inserare in fata si spate.

2. Analiza problemei
3. Programele sursa
//Operatii (cunoscute pana acum)asupra unei liste liniare
s.i. //cand crearea se face cu inserare in fata si primul nod
este //creat separat
#include
#include
#include
#include
#include

<stdio.h>
<ctype.h>
<conio.h>
<alloc.h>
<string.h>

struct nod
{
int cheie;
char info[10];
struct nod *urm;
};
typedef struct nod Tnod;
typedef Tnod* ref;
ref p,q,r,s;
char op,rasp;
int k;
void ins_p(void)
{
q=malloc(sizeof(Tnod));
printf("Introduceti cheia= ");scanf("%d",&q->cheie);
printf("Introduceti informatia= ");
fflush(stdin);scanf("%s",q->info);
q->urm=NULL;
p=q;
}/*ins_p*/
void ins_cf(void)
{
s=malloc(sizeof(Tnod));
printf("Introduceti cheia= ");scanf("%d",&s->cheie);
printf("Introduceti informatia= ");
1

fflush(stdin);scanf("%s",s->info);
s->urm=p;
p=s;
}/*ins_cf*/
void listare(void)
{
if(p==NULL)
printf("Lista vida!\n");
else
{
printf("Elementele listei sunt:\n");
r=p;
while (r!=NULL)
{
printf("cheia=%d info=%s\n",r->cheie,r->info);
r=r->urm;
}/*while*/
}
}/*listare*/
void ins_d(void)
{
s=malloc(sizeof(Tnod));
printf("Introduceti cheia= ");scanf("%d",&s->cheie);
printf("Introduceti informatia= ");
fflush(stdin);scanf("%s",s->info);
s->urm=r->urm;
r->urm=s;
if (s->urm==NULL)
q=s;
}/*ins_d*/
void ins_i(void)
{
s=malloc(sizeof(Tnod));
*s=*r;
r->urm=s;
printf("Introduceti cheia=");scanf("%d",&r->cheie);
printf("Introduceti informatia=");
fflush(stdin);scanf("%s",r->info);
if (s->urm==NULL)
q=s;
}/*ins_i*/
void cautare(int k)
{
int b=0;
r=p;
while ((b==0)&&(r!=NULL))
if (r->cheie==k)
b=1;
2

else r=r->urm;
}/*cautare*/
void adaugare_i(void)
{
ins_cf();
}/*adaugare_i*/
void sterge_d(void)
{
if(r->urm==NULL)
printf("Nu se poate suprima!! 'r' este ultimul NOD !! ");
else
{
s=r->urm;
r->urm=s->urm;
free(s);
}
} /* Sterge_D */
void sterge_n(void)
{
if(r->urm==NULL)
if(r==prim)
{
prim=NULL;
free(prim);
}
else
{
s=prim;
while(s->urm!=r)
s=s->urm;
s->urm=NULL;
free(s);
}
else
{
s=r->urm;
*r=*s;
free(s);
}
} /* Sterge_N */
void creare(void)
{
char c;
printf("Introduceti primul nod : \n");
ins_p();
listare();
printf("Mai introduceti alte noduri (D/N)?: ");
fflush(stdin);scanf("%c",&c);c=toupper(c);
3

while (c=='D')
{
ins_cf();
listare();
printf("Mai introduceti alte noduri (D/N)?: ");
fflush(stdin);scanf("%c",&c);c=toupper(c);
}/*while*/
}/*creare*/
void main(void)
{
p=NULL;
do
{
clrscr();
printf("Op. asupra l.l.s.i. cu inserare fata\n\n");
printf("C - Creare\n");
printf("L - Listare\n");
printf("A - Adaugare inaintea listei\n");
printf("I - Inserare dupa un nod dat\n");
printf("B - Inserare inaintea unui nod dat\n");
printf("F - Cautare\n");
printf("D - Stergerea unui NOD dupa un NOD dat. \n" );
printf("N - Stergerea unui NOD dat. \n");
printf("E - Terminare\n\n");
printf("Introdu optiunea:");
fflush(stdin);scanf("%c",&op);
op=toupper(op);
switch (op)
{
case 'C': if (p!=NULL)
{
printf("\nLista exista! Doriti sa );
printf("creati lista noua?(d\n)");
fflush(stdin);scanf("%c",&rasp);
rasp=toupper(rasp);
if (rasp!='D')
break;
}
creare();
break;
case 'L': break;
case 'A': adaugare_i();
break;
case 'I': if (p!=NULL)
{
printf("Dati cheia nod. dupa care ");
printf("inseram:\n");
scanf("%d",&k);
cautare(k);
if (r!=NULL)
ins_d();
else
4

printf("Nodul cu cheia %d nu ");


printf("exista in lista!\n",k);
};
break;
case 'B': if (p!=NULL)
{
printf("Dati cheia nod. in fata ");
printf("caruia inseram:\n");
scanf("%d",&k);
cautare(k);
if (r!=NULL)
ins_i();
else
printf("Nodul cu cheia %d nu ");
printf("exista in lista!\n",k);
};
break;
case 'F': if (p!=NULL)
{
printf("Dati cheia nod. Cautat : \n");
scanf("%d",&k);
cautare(k);
if (r!=NULL)
printf("Nodul cu cheia %d are ");
printf("informatia %s \n",r->cheie,
r->info);
else
printf("Nodul cu cheia %d nu ");
printf("exista in lista!\n",k);
};
break;
case 'D' : if(prim==NULL)
printf("ERROR. Lista este vida !!! ");
else
{
printf("Dati cheia NOD-ului ");
printf("dupa care stergeti");
scanf("%d", &k);
cautare();
sterge_d();
}
break;
case 'N' : if(prim==NULL)
printf("ERROR. Lista este vida !!! ");
else
{
printf("Dati cheia NOD-ului ");
printf("pe care inserati : ");
scanf("%d", &k);
cautare();
sterge_n();
5

}
break;
case 'E': break;
default: printf("Optiunea aleasa este gresita!\n");
}/*switch*/
listare();
printf("Tastati enter!\n");
getch();
}while (op!='E');
}/*main*/

//Operatii (cunoscute pana acum)asupra unei liste liniare


s.i. //cand crearea se face cu inserare in spate si primul nod
este //creat separat
#include
#include
#include
#include
#include

<stdio.h>
<ctype.h>
<conio.h>
<alloc.h>
<string.h>

struct nod
{
int cheie;
char info[10];
struct nod *urm;
};
typedef struct nod Tnod;
typedef Tnod* ref;
ref p,q,r,s;
char op,rasp;
int k;
void ins_p(void)
{
q=malloc(sizeof(Tnod));
printf("Introduceti cheia= ");scanf("%d",&q->cheie);
printf("Introduceti informatia= ");
fflush(stdin);scanf("%s",q->info);
q->urm=NULL;
p=q;
}/*ins_p*/
void ins_cs(void)
{
r=malloc(sizeof(Tnod));
printf("Introduceti cheia= ");scanf("%d",&r->cheie);
printf("Introduceti informatia= ");
fflush(stdin);scanf("%s",r->info);
6

r->urm=NULL;
q=r;
}/*ins_cs*/
void listare(void)
{
if(p==NULL)
printf("Lista vida!\n");
else
{
printf("Elementele listei sunt:\n");
r=p;
while (r!=NULL)
{
printf("cheia=%d info=%s\n",r->cheie,r->info);
r=r->urm;
}/*while*/
}
}/*listare*/
void ins_d(void)
{
s=malloc(sizeof(Tnod));
printf("Introduceti cheia= ");scanf("%d",&s->cheie);
printf("Introduceti informatia= ");
fflush(stdin);scanf("%s",s->info);
s->urm=r->urm;
r->urm=s;
if (s->urm==NULL)
q=s;
}/*ins_d*/
void ins_i(void)
{
s=malloc(sizeof(Tnod));
*s=*r;
r->urm=s;
printf("Introduceti cheia=");scanf("%d",&r->cheie);
printf("Introduceti informatia=");
fflush(stdin);scanf("%s",r->info);
if (s->urm==NULL)
q=s;
}/*ins_i*/
void cautare(int k)
{
int b=0;
r=p;
while ((b==0)&&(r!=NULL))
if (r->cheie==k)
b=1;
else r=r->urm;
7

}/*cautare*/
void adaugare_i(void)
{
ins_cs();
}/*adaugare_i*/
void sterge_d(void)
{
if(r->urm==NULL)
printf("Nu se poate suprima!! 'r' este ultimul NOD !! ");
else
{
s=r->urm;
r->urm=s->urm;
free(s);
}
} /* Sterge_D */
void sterge_n(void)
{
if(r->urm==NULL)
if(r==prim)
{
prim=NULL;
free(prim);
}
else
{
s=prim;
while(s->urm!=r)
s=s->urm;
s->urm=NULL;
free(s);
}
else
{
s=r->urm;
*r=*s;
free(s);
}
} /* Sterge_N */
void creare(void)
{
char c;
printf("Introduceti primul nod : \n");
ins_p();
listare();
printf("Mai introduceti alte noduri (D/N)?: ");
fflush(stdin);scanf("%c",&c);c=toupper(c);
while (c=='D')
8

ins_cs();
listare();
printf("Mai introduceti alte noduri (D/N)?: ");
fflush(stdin);scanf("%c",&c);c=toupper(c);
}/*while*/
}/*creare*/
void main(void)
{
p=NULL;
do
{
clrscr();
printf("Op. asupra l.l.s.i. cu inserare fata\n\n");
printf("C - Creare\n");
printf("L - Listare\n");
printf("A - Adaugare inaintea listei\n");
printf("I - Inserare dupa un nod dat\n");
printf("B - Inserare inaintea unui nod dat\n");
printf("F - Cautare\n");
printf("D - Stergerea unui NOD dupa un NOD dat. \n" );
printf(" N - Stergerea unui NOD dat. \n");
printf("E - Terminare\n\n");
printf("Introdu optiunea:");
fflush(stdin);scanf("%c",&op);
op=toupper(op);
switch (op)
{
case 'C': if (p!=NULL)
{
printf("\nLista exista! Doriti sa );
printf("creati lista noua?(d\n)");
fflush(stdin);scanf("%c",&rasp);
rasp=toupper(rasp);
if (rasp!='D')
break;
}
creare();
break;
case 'L': break;
case 'A': adaugare_i();
break;
case 'I': if (p!=NULL)
{
printf("Dati cheia nod. dupa care ");
printf("inseram:\n");
scanf("%d",&k);
cautare(k);
if (r!=NULL)
ins_d();
else
9

printf("Nodul cu cheia %d nu ");


printf("exista in lista!\n",k);
};
break;
case 'B': if (p!=NULL)
{
printf("Dati cheia nod. in fata ");
printf("caruia inseram:\n");
scanf("%d",&k);
cautare(k);
if (r!=NULL)
ins_i();
else
printf("Nodul cu cheia %d nu ");
printf("exista in lista!\n",k);
};
break;
case 'F': if (p!=NULL)
{
printf("Dati cheia nod. Cautat : \n");
scanf("%d",&k);
cautare(k);
if (r!=NULL)
printf("Nodul cu cheia %d are ");
printf("informatia %s \n",r->cheie,
r->info);
else
printf("Nodul cu cheia %d nu ");
printf("exista in lista!\n",k);
};
break;
case 'D' : if(prim==NULL)
printf("ERROR. Lista este vida !!! ");
else
{
printf("Dati cheia NOD-ului ");
printf("dupa care stergeti : ");
scanf("%d", &k);
cautare();
sterge_d();
}
break;
case 'N' : if(prim==NULL)
printf("ERROR. Lista este vida !!! ");
else
{
printf("Dati cheia NOD-ului ");
printf("pe care inserati : ");
scanf("%d", &k);
cautare();
sterge_n();
10

}
break;
case 'E': break;
default: printf("Optiunea aleasa este gresita!\n");
}/*switch*/
listare();
printf("Tastati enter!\n");
getch();
}while (op!='E');
}/*main*/
4. Observaii:
n ceea ce privete crearea unei liste liniare simplu nlnuite trebuie tiut faptul c
structura trebuie iniializat nainte de a se efectua orice operaii asupra
ei.Iniializarea listei se poate face creend primul nod al listei.

11

You might also like