Search
 
 
  Engleski
 
 
 
Open in this window (click to change)
Forum@DeGiorgi: Početna
Forum za podršku nastavi na PMF-MO
Login Registracija FAQ Smajlići Članstvo Pretražnik Forum@DeGiorgi: Početna

Prakticno pitanje
WWW:

Moja sarma
 
Započnite novu temu   Odgovorite na temu   printer-friendly view    Forum@DeGiorgi: Početna -> Kolegiji 2. godine -> Računarski praktikum 1
Prethodna tema :: Sljedeća tema  
Autor/ica Poruka
Gost






PostPostano: 22:25 pon, 17. 5. 2004    Naslov: Prakticno pitanje Citirajte i odgovorite

Ima dva pitanja na koja nisam nasao odgovor u predavnjima:
1) Sto je to dvostruko vezana lista i koja je razlika izmedu nje i jednostruko vezane liste. Moze i koji primjer koda, jer bas to ne kuzim.
2) Kako napisati program koji generira niz slucajnih brojeva. Molio bi isto primjer koda
Hvala
Ima dva pitanja na koja nisam nasao odgovor u predavnjima:
1) Sto je to dvostruko vezana lista i koja je razlika izmedu nje i jednostruko vezane liste. Moze i koji primjer koda, jer bas to ne kuzim.
2) Kako napisati program koji generira niz slucajnih brojeva. Molio bi isto primjer koda
Hvala


[Vrh]
vsego
Site Admin
Site Admin


Pridružen/a: 06. 10. 2002. (22:07:09)
Postovi: (355F)16
Spol: zombi
Sarma = la pohva - posuda
854 = 1068 - 214
Lokacija: /sbin/init

PostPostano: 22:37 pon, 17. 5. 2004    Naslov: Re: Prakticno pitanje Citirajte i odgovorite

Malo mi se ne da pisati kod; ima dosta, a mislim da je bitnije shvatiti ideje. 8)

[quote="Anonymous"]1) Sto je to dvostruko vezana lista i koja je razlika izmedu nje i jednostruko vezane liste. Moze i koji primjer koda, jer bas to ne kuzim.[/quote]

Jednostruko vezana lista: imas structove, svaki pamti "korisne podatke" i adresu iduceg u nizu. :)

Dvostruko vezana lista: imas structove, svaki pamti "korisne podatke" i adrese i prethodnog i iduceg u nizu. 8)

Razlika je to sto trivijalno "trcis" po listi u oba smjera. :D Dakle, da bi kod jednostruko vezane liste "skocio" s nekog elementa na njegovog prethodnika, morao si trcati po cijeloj listi. Ovdje samo kazes nesto kao:
p = p->prethodni; 8)
Dakle, isto kako bi "skocio" na iduceg (u kojojgod listi). 8)

Mana je to da moras paziti na dvije "strelice" kad radis nesto s elementima, tj. moras paziti da za svaki element p (osim rubnih) vrijedi:
p == p->slijedeci->prethodni i
p == p->prethodni->slijedeci

Zasto ne za rubne? Zato jer je kod prvog elementa p->prethodni == NULL, a kod zadnjeg je p->slijedeci == NULL, pa nema smisla gledati obje jednakosti (samo jednu). :)

Kod bi bio isti kao za jednostruko vezanu listu, samo dodas jos taj jedan pointer. 8)

[quote="Anonymous"]2) Kako napisati program koji generira niz slucajnih brojeva. Molio bi isto primjer koda[/quote]

To smo radili na C-u prije par tjedana. Pogledaj [url=http://web.math.hr/nastava/c/vjezbe/vjezbe05/32__selection_sort.c]ovdje[/url]. 8)

Ako si mislio na listu, onda kreiras isto kao kad ucitavas brojeve, samo ne ucitavas element (scanf("%d", &x);[i][/i]) nego kazes:
x = rand() % nesto + nesto_drugo (vidi prilozeni link). :)

:wave:
Malo mi se ne da pisati kod; ima dosta, a mislim da je bitnije shvatiti ideje. Cool

Anonymous (napisa):
1) Sto je to dvostruko vezana lista i koja je razlika izmedu nje i jednostruko vezane liste. Moze i koji primjer koda, jer bas to ne kuzim.


Jednostruko vezana lista: imas structove, svaki pamti "korisne podatke" i adresu iduceg u nizu. Smile

Dvostruko vezana lista: imas structove, svaki pamti "korisne podatke" i adrese i prethodnog i iduceg u nizu. Cool

Razlika je to sto trivijalno "trcis" po listi u oba smjera. Very Happy Dakle, da bi kod jednostruko vezane liste "skocio" s nekog elementa na njegovog prethodnika, morao si trcati po cijeloj listi. Ovdje samo kazes nesto kao:
p = p→prethodni; Cool
Dakle, isto kako bi "skocio" na iduceg (u kojojgod listi). Cool

Mana je to da moras paziti na dvije "strelice" kad radis nesto s elementima, tj. moras paziti da za svaki element p (osim rubnih) vrijedi:
p == p→slijedeci→prethodni i
p == p→prethodni→slijedeci

Zasto ne za rubne? Zato jer je kod prvog elementa p→prethodni == NULL, a kod zadnjeg je p→slijedeci == NULL, pa nema smisla gledati obje jednakosti (samo jednu). Smile

Kod bi bio isti kao za jednostruko vezanu listu, samo dodas jos taj jedan pointer. Cool

Anonymous (napisa):
2) Kako napisati program koji generira niz slucajnih brojeva. Molio bi isto primjer koda


To smo radili na C-u prije par tjedana. Pogledaj ovdje. Cool

Ako si mislio na listu, onda kreiras isto kao kad ucitavas brojeve, samo ne ucitavas element (scanf("%d", &x);) nego kazes:
x = rand() % nesto + nesto_drugo (vidi prilozeni link). Smile

Wave



_________________
U pravilu ignoriram pitanja u krivim topicima i kodove koji nisu u [code]...[/code] blokovima.
Takodjer, OBJASNITE sto vas muci! "Sto mi je krivo?", bez opisa u cemu je problem, rijetko ce zadobiti moju paznju.
Drzim prodike
[Vrh]
Korisnički profil Pošaljite privatnu poruku
Boris Davidovič
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 08. 01. 2004. (23:05:18)
Postovi: (3C)16
Sarma = la pohva - posuda
= 0 - 0

PostPostano: 15:04 uto, 18. 5. 2004    Naslov: Citirajte i odgovorite

Ovo je dosta davno pisano, pa nisam siguran u točnost, uglavnom :

[code:1]
//dvostruka vezana lista, pri cemu je head dummy node
#include <stdio.h>
#include <stdlib.h>

typedef struct _node
{
int nr;
_node *next,*prev;
}node;

node *brisi(node *head, node **tail,int el)//brise el iz liste
{
node *tmp,*osl;

tmp=head;

while (tmp->next!=NULL && tmp->next->nr!=el)
tmp=tmp->next;//dosli smo na element prije onog koji izbacujemo

osl=tmp->next;

if (osl==NULL) return head;//element nije u listi

if (osl==*tail)//izbacujemo zadnji element
{
tmp->next=NULL;
*tail=tmp;
}
else //ne izbacujemo zadnji
{
tmp->next=osl->next;
osl->next->prev=tmp;
}

free(osl);

return head;

}

void ispis_ld(node *head,node *tail)
{
node *tmp;

//ispis s lijeva na desno
tmp=head->next;

while (tmp!=tail)
{
tmp=tmp->next;
printf("%d -> ",tmp->nr);
}

printf("\n");
}

void ispis_dl(node *head,node *tail)
{
node *tmp;

//ispis s desna na lijevo
tmp=tail;

while (tmp->prev!=head)
{
printf("%d -> ",tmp->nr);
tmp=tmp->prev;
}

printf("\n");
}

void free_mem(node *head,node *tail)
{
node *tmp;
//free mem :
while (tail!=head)
{
tmp=tail;
tail=tail->prev;
free(tmp);
}

free(head);
}

int main(void)
{
node *head,*tail,*tmp;
int i;
int a[]={1,2,3,4,5,6,7};

head=(node *)malloc(sizeof(node));//sam head je dummy
tail=(node *)malloc(sizeof(node));
head->next=tail;
tail->prev=head;
tail->next=NULL;

for (i=0;i<7;i++)//umeci na kraj
{
tmp=(node *)malloc(sizeof(node));
tmp->nr=a[i];
tmp->next=NULL;
tmp->prev=tail;
tail->next=tmp;
tail=tmp;
}

ispis_ld(head,tail);
ispis_dl(head,tail);//<==>ispis_ld(tail,head)

head=brisi(head,&tail,7);

ispis_ld(head,tail);

free_mem(head,tail);

getchar();

return 0;
}
[/code:1]
Ovo je dosta davno pisano, pa nisam siguran u točnost, uglavnom :

Kod:

//dvostruka vezana lista, pri cemu je head dummy node
#include <stdio.h>
#include <stdlib.h>

typedef struct _node
{
     int nr;
     _node *next,*prev;
}node;

node *brisi(node *head, node **tail,int el)//brise el iz liste
{
     node *tmp,*osl;

     tmp=head;

     while (tmp->next!=NULL && tmp->next->nr!=el)
          tmp=tmp->next;//dosli smo na element prije onog koji izbacujemo

     osl=tmp->next;

     if (osl==NULL) return head;//element nije u listi

     if (osl==*tail)//izbacujemo zadnji element
          {
          tmp->next=NULL;
          *tail=tmp;
          }
     else //ne izbacujemo zadnji
          {
          tmp->next=osl->next;
          osl->next->prev=tmp;
          }

     free(osl);

     return head;

}

void ispis_ld(node *head,node *tail)
{
     node *tmp;

 //ispis s lijeva na desno
     tmp=head->next;

     while (tmp!=tail)
          {
          tmp=tmp->next;
          printf("%d -> ",tmp->nr);
          }

     printf("\n");
}

void ispis_dl(node *head,node *tail)
{
     node *tmp;

     //ispis s desna na lijevo
     tmp=tail;

     while (tmp->prev!=head)
          {
          printf("%d -> ",tmp->nr);
          tmp=tmp->prev;
          }

     printf("\n");
}

void free_mem(node *head,node *tail)
{
     node *tmp;
     //free mem :
     while (tail!=head)
          {
          tmp=tail;
          tail=tail->prev;
          free(tmp);
          }

     free(head);
}

int main(void)
{
     node *head,*tail,*tmp;
     int i;
     int a[]={1,2,3,4,5,6,7};

     head=(node *)malloc(sizeof(node));//sam head je dummy
     tail=(node *)malloc(sizeof(node));
     head->next=tail;
     tail->prev=head;
     tail->next=NULL;

     for (i=0;i<7;i++)//umeci na kraj
          {
          tmp=(node *)malloc(sizeof(node));
          tmp->nr=a[i];
          tmp->next=NULL;
          tmp->prev=tail;
          tail->next=tmp;
          tail=tmp;
          }

     ispis_ld(head,tail);
     ispis_dl(head,tail);//<==>ispis_ld(tail,head)

     head=brisi(head,&tail,7);

     ispis_ld(head,tail);

     free_mem(head,tail);

     getchar();

     return 0;
}


[Vrh]
Korisnički profil Pošaljite privatnu poruku
Crni
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 15. 12. 2003. (01:20:43)
Postovi: (23C)16
Spol: muško
Sarma = la pohva - posuda
= 29 - 25
Lokacija: Zagreb

PostPostano: 17:54 sri, 19. 5. 2004    Naslov: Citirajte i odgovorite

Evo i od mene kod (brijem da je moj jasniji 8) ):

[code:1]#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef struct node
{
int b;
struct node *nx;
struct node *pr;
} node;

node* novi (void)
{
node *p;
int t;
p=(node *) malloc (sizeof(node));
printf("Unesite broj: ");
scanf("%d",&t);
p->b=t;
return p;
}

node* kraj (node *g)
{
node *p,*k;
for (p=g; p!=NULL; p=p->nx)
k=p;
return k;
}

node* unos (node *g)
{
node *p,*k;
p=novi();
if (g==NULL)
{
p->nx=NULL;
p->pr=NULL;
return p;
}
else
{
k=kraj(g);
k->nx=p;
p->nx=NULL;
p->pr=k;
return g;
}
}

void ispis1 (node *g)
{
node *p;
if (g==NULL)
printf("\nLista je prazna.\n");
else
{
printf("\n");
for (p=g; p!=NULL; p=p->nx)
printf("%d ",p->b);
printf("\n");
}
}

void ispis2 (node *g)
{
node *p;
if (g==NULL)
printf("\nLista je prazna.\n");
else
{
printf("\n");
for (p=kraj(g); p!=NULL; p=p->pr)
printf("%d ",p->b);
printf("\n");
}
}

main()
{
node *g=NULL;
int i;
for (i=0; i<10; i++)
g=unos(g);
ispis1(g);
ispis2(g);
scanf("\n");
}[/code:1]

Dvostruka v-lista je pogodna za q-sort.
Evo i od mene kod (brijem da je moj jasniji Cool ):

Kod:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef struct node
{
 int b;
 struct node *nx;
 struct node *pr;
} node;

node* novi (void)
{
 node *p;
 int t;
 p=(node *) malloc (sizeof(node));
 printf("Unesite broj: ");
 scanf("%d",&t);
 p->b=t;
 return p;
}

node* kraj (node *g)
{
 node *p,*k;
 for (p=g; p!=NULL; p=p->nx)
  k=p;
 return k;
}

node* unos (node *g)
{
 node *p,*k;
 p=novi();
 if (g==NULL)
 {
  p->nx=NULL;
  p->pr=NULL;
  return p;
 }
 else
 {
  k=kraj(g);
  k->nx=p;
  p->nx=NULL;
  p->pr=k;
  return g;
 }
}

void ispis1 (node *g)
{
 node *p;
 if (g==NULL)
  printf("\nLista je prazna.\n");
 else
 {
  printf("\n");
  for (p=g; p!=NULL; p=p->nx)
   printf("%d ",p->b);
  printf("\n");
 }
}

void ispis2 (node *g)
{
 node *p;
 if (g==NULL)
  printf("\nLista je prazna.\n");
 else
 {
  printf("\n");
  for (p=kraj(g); p!=NULL; p=p->pr)
   printf("%d ",p->b);
  printf("\n");
 }
}

main()
{
 node *g=NULL;
 int i;
 for (i=0; i<10; i++)
  g=unos(g);
 ispis1(g);
 ispis2(g);
 scanf("\n");
}


Dvostruka v-lista je pogodna za q-sort.


[Vrh]
Korisnički profil Pošaljite privatnu poruku
Prethodni postovi:   
Započnite novu temu   Odgovorite na temu   printer-friendly view    Forum@DeGiorgi: Početna -> Kolegiji 2. godine -> Računarski praktikum 1 Vremenska zona: GMT + 01:00.
Stranica 1 / 1.

 
Forum(o)Bir:  
Možete otvarati nove teme.
Možete odgovarati na postove.
Ne možete uređivati Vaše postove.
Ne možete izbrisati Vaše postove.
Ne možete glasovati u anketama.
You can attach files in this forum
You can download files in this forum


Powered by phpBB © 2001, 2002 phpBB Group
Theme created by Vjacheslav Trushkin
HR (Cro) by Ančica Sečan