Z Ćwiczenia 26.04.2008, Programowanie


Dzis wykonamy tak jak poprzednio kilka operacji na listach. I pierwsze zadanie., Załóżmy, że mamy listę kilkuelementową posortowaną. Należy napisać taką strukturę, która doda jakiś element do tej listy bez straty uporzadkowania. Jak coś takiego zrobić. Oto pseudokod:

#include <stdio.h>

struct node * AddSort(struct node *lista, int x){

struct node * pop,*nast,*e;

pop=lista;

nast=lista->next;

while (nast->val <x){

pop=pop->next;

nast=nast->next;

}

e=(struct node) malloc(sizeof(struct));

if (e!=NULL){

pop->next=e;

e->next=nast;

}

return lista;

}

I zobaczmy jeszcze, jak można rozwiązać ten problem z użyciem atrapy:

#include <stdio.h>

struct node * AddSort(struct node *lista, int x){

struct node * pop,*nast,*e, *a

struct node atrapa;

a=&atrapa;

a->next=lista;

pop=a;

nast=a->next;

while (nast!=NULL && nast->val<x){

pop=pop->next;

nast=nast->next;

}

e=(struct node) malloc(sizeof(struct));

if (e!=NULL){

pop->next=e;

e->next=nast;

}

return a->next;

}

A teraz załóżmy, że mamy dane jakieś dwie listy uporządkowane. Kolejne zadanie polegać będzie na napisaniu takiej struktury, która połączy te dwie listy i stworzy jedną listę uoprządkowaną (połączy elementy list i uporządkuje je w jednej). Oto kod:

#include <stdio.h>

struct node * merge(struct node *l1, struct node *l2){

struct node *wynik=NULL,*konw;

if (l1==NULL) return l2;

else if (l2==NULL) return l1;

else { //l1 i l2 nie są NULL

if (l1->val<l2->val){

wynik = l1;

l1=l1 -> next;

konw=wynik;

}

else

{

wynik = l2;

l2=l2->next;

konw=wynik;

}

while (l1!=NULL && l2!=NULL)

{

if(l1->val<l2->val)

{

konw->next=l1;

konw=l1;

l1=l1->next;

}

else {

konw ->next=l2;

konw=l2;

l2=l2->next;

}

}

if(l1=NULL) konw->next=l2;

else konw->next=l1;

return wynik;

}

}

I jeszcze zobaczmy, jak by to mogło wyglądać z użyciem atrapy:

#include <stdio.h>

struct node * merge(struct node *l1, struct node *l2){

struct node *wynik=NULL,*konw,*a;

struct node atrapa;

a=&atrapa;

if (l1==NULL) return l2;

else if (l2==NULL) return l1;

else { //l1 i l2 nie są NULL

konw=a;

}

while (l1!=NULL && l2!=NULL)

{

if(l1->val<l2->val)

{

konw->next=l1;

konw=l1;

l1=l1->next;

}

else {

konw ->next=l2;

konw=l2;

l2=l2->next;

}

}

if(l1=NULL) konw->next=l2;

else konw->next=l1;

return a->next;

}

}



Wyszukiwarka

Podobne podstrony:
Z Ćwiczenia 26.04.2008, Zajęcia, II semestr 2008, Analiza matematyczna
Z Wykład 26.04.2008, Programowanie
cwiczenia 7 25.04.2008, Prawoznawstwo, Materialy e-learning, mgr M. Zalewska
cwiczenia 15 1.04.2008, cwiczenia - dr skladowski
KINEZYTERAPIA ĆWICZENIA 23.04.2008- CHÓD O KULACH I PNF(1), FIZJOTERAPIA, kinezyterapia
KINEZYTERAPIA ĆWICZENIA 23.04.2008- CHÓD O KULACH(1), Kineza
Z Ćwiczenia 20.04.2008, Zajęcia, II semestr 2008, Teoria informacji i kodowania
cwiczenia 16 4.04.2008, cwiczenia - dr skladowski
Z Ćwiczenia 19.04.2008, Zajęcia, II semestr 2008, Algorytmy i struktury danych
ćwiczenia rachunek prawdopodobieństwa i statystyka, Z Ćwiczenia 06.04.2008
Z Wykład 06.04.2008, Programowanie
Z Ćwiczenia 05.04.2008, Zajęcia, II semestr 2008, Analiza matematyczna
Z Ćwiczenia 06.04.2008, Zajęcia, II semestr 2008, Matematyka dyskretna i logika
cwiczenia 6 11.04.2008, Prawoznawstwo, Materialy e-learning, mgr M. Zalewska
cwiczenia 2 6 do 7 04 2008
Z Ćwiczenia 27.04.2008, Zajęcia, II semestr 2008, Matematyka dyskretna i logika
Z Wykład 26.04.2008, Zajęcia, II semestr 2008, Rachunek prawdopodobieństwa

więcej podobnych podstron