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

ATP List issues (zadatak)
WWW:

Moja sarma
 
Započnite novu temu   Odgovorite na temu   printer-friendly view    Forum@DeGiorgi: Početna -> Kolegiji 2. godine -> Strukture podataka i algoritmi
Prethodna tema :: Sljedeća tema  
Autor/ica Poruka
krilo
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 01. 11. 2016. (14:45:48)
Postovi: (4E)16
Spol: žensko
Sarma = la pohva - posuda
= 5 - 0

PostPostano: 18:07 sub, 11. 11. 2017    Naslov: ATP List issues Citirajte i odgovorite

Pozdrav :)
Pokušavam napisati osnovni program koji bi upisao par brojeva u listu (pointer implementacija), ali mi nešto ne štima. [tt]main[/tt] izvrti for petlju, ali negdje zapne na kraju, a ne vidim grešku u funkciji ispisa elemenata liste. Funkcije [tt]LiMakeNull[/tt], [tt]LiEnd[/tt] i [tt]LiInsert[/tt] su doslovce prepisane iz udžbenika, ali ih svejedno prilažem u kodu:
[code:1]#include "ATP List.c"
#include <stdio.h>
#include <stdlib.h>

/* Test za ATP List */

void ispis(List L)
{
if(L->next==NULL) {printf("Lista prazna."); return 0;}
position q=L;
while(q!=LiEnd(L)) {printf("%d, ", LiRetrieve(q)); q=q->next;}
return;
}

int main(void)
{
List L; position p;
LiMakeNull(&L); p=L;
int i;
for(i=0; i<5; i++)
{
LiInsert(i, p);
}
ispis(L);
return 0;
}
[/code:1]
Pojedinosti iz ATP-a:
[code:1]typedef celltype* List;
typedef celltype* position;

position LiMakeNull(List *L)
{
(*L)=(celltype*) malloc(sizeof(celltype));
(*L)->next=NULL; return *L;
}

position LiEnd(List L)
{
position q;
q=L;
while (q->next!=NULL) q=q->next;
return q;
}

void LiInsert(elementtype y, position p)
{
position temp; temp=p->next;
p->next=(celltype*)malloc(sizeof(celltype));
p->next->x=y;
p->next->next=temp; free(temp);
return;
}[/code:1]
(Neka admin ukloni što smatra neprimjerenim kodom.)
Pozdrav Smile
Pokušavam napisati osnovni program koji bi upisao par brojeva u listu (pointer implementacija), ali mi nešto ne štima. main izvrti for petlju, ali negdje zapne na kraju, a ne vidim grešku u funkciji ispisa elemenata liste. Funkcije LiMakeNull, LiEnd i LiInsert su doslovce prepisane iz udžbenika, ali ih svejedno prilažem u kodu:
Kod:
#include "ATP List.c"
#include <stdio.h>
#include <stdlib.h>

/* Test za ATP List */

void ispis(List L)
{
    if(L->next==NULL) {printf("Lista prazna."); return 0;}
    position q=L;
    while(q!=LiEnd(L)) {printf("%d, ", LiRetrieve(q)); q=q->next;}
    return;
}

int main(void)
{
    List L; position p;
    LiMakeNull(&L); p=L;
    int i;
    for(i=0; i<5; i++)
        {
            LiInsert(i, p);
        }
    ispis(L);
    return 0;
}

Pojedinosti iz ATP-a:
Kod:
typedef celltype* List;
typedef celltype* position;

position LiMakeNull(List *L)
{
    (*L)=(celltype*) malloc(sizeof(celltype));
    (*L)->next=NULL; return *L;
}

position LiEnd(List L)
{
    position q;
    q=L;
    while (q->next!=NULL) q=q->next;
    return q;
}

void LiInsert(elementtype y, position p)       
{
    position temp; temp=p->next;
    p->next=(celltype*)malloc(sizeof(celltype));
    p->next->x=y;
    p->next->next=temp; free(temp);
    return;
}

(Neka admin ukloni što smatra neprimjerenim kodom.)


[Vrh]
Korisnički profil Pošaljite privatnu poruku
vsego
Site Admin
Site Admin


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

PostPostano: 18:59 ned, 12. 11. 2017    Naslov: Citirajte i odgovorite

U [tt]LiInsert[/tt] imas [tt]temp[/tt] koji cuva adresu starog sljedbenika i na kraju tu varijablu koristis da tog starog sljedbenika "zakacis" iza novog, a zatim... s [tt]free(temp);[/tt] ubijes memoriju na koju [tt]temp[/tt] pokazuje, i.e., umlatis ubogog starog sljedbenika od [tt]p[/tt]. :wow: Meni se to cini malo nelogicno.

Jesi li siguran da je to doslovce prepisano iz udzbenika?
U LiInsert imas temp koji cuva adresu starog sljedbenika i na kraju tu varijablu koristis da tog starog sljedbenika "zakacis" iza novog, a zatim... s free(temp); ubijes memoriju na koju temp pokazuje, i.e., umlatis ubogog starog sljedbenika od p. Ne vjerujem!!! Meni se to cini malo nelogicno.

Jesi li siguran da je to doslovce prepisano iz udzbenika?



_________________
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
krilo
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 01. 11. 2016. (14:45:48)
Postovi: (4E)16
Spol: žensko
Sarma = la pohva - posuda
= 5 - 0

PostPostano: 17:21 pon, 13. 11. 2017    Naslov: Citirajte i odgovorite

A tako dakle... da, to nije tako u skripti. Moja greška. Može li se ikako taj temp osloboditi, ili bolje rečeno, trebam li ga uopće oslobađati? :/

(Hvala vsego!)
A tako dakle... da, to nije tako u skripti. Moja greška. Može li se ikako taj temp osloboditi, ili bolje rečeno, trebam li ga uopće oslobađati? Ehm?

(Hvala vsego!)


[Vrh]
Korisnički profil Pošaljite privatnu poruku
vsego
Site Admin
Site Admin


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

PostPostano: 23:27 čet, 16. 11. 2017    Naslov: Citirajte i odgovorite

Naravno da ne treba (tj. ne smijes). Varijabla [tt]temp[/tt] pokazuje na adresu elementa u listi, a nju zelis zadrzati dok ne treba obrisati cijelu listu (ili barem dio koji sadrzi taj element). Sama varijabla ce nestati kad izadjes iz funkcije, ali memorija na koju ona pokazuje ce ostati. Na tu memoriju pokazuje i [tt]next[/tt] iz novog elementa, tako da ona nece biti "izgubljena".

Podsjecam: treba razlikovati varijablu [tt]temp[/tt] i bezimeni komad memorije na koji ona pokazuje! :prodike: U stvarnom svijetu, kuvertu smijes spaliti, ali ne i kucu cija adresa je na kuverti, zar ne? Ovo je zapravo isto.

Predlazem da ponovis pointere i liste iz Prog 2. Mislim da je u slideovima s predavanja prof. Singera to detaljno raspisano.
Naravno da ne treba (tj. ne smijes). Varijabla temp pokazuje na adresu elementa u listi, a nju zelis zadrzati dok ne treba obrisati cijelu listu (ili barem dio koji sadrzi taj element). Sama varijabla ce nestati kad izadjes iz funkcije, ali memorija na koju ona pokazuje ce ostati. Na tu memoriju pokazuje i next iz novog elementa, tako da ona nece biti "izgubljena".

Podsjecam: treba razlikovati varijablu temp i bezimeni komad memorije na koji ona pokazuje! Drzim prodike U stvarnom svijetu, kuvertu smijes spaliti, ali ne i kucu cija adresa je na kuverti, zar ne? Ovo je zapravo isto.

Predlazem da ponovis pointere i liste iz Prog 2. Mislim da je u slideovima s predavanja prof. Singera to detaljno raspisano.



_________________
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
Prethodni postovi:   
Započnite novu temu   Odgovorite na temu   printer-friendly view    Forum@DeGiorgi: Početna -> Kolegiji 2. godine -> Strukture podataka i algoritmi Vremenska zona: GMT + 01:00.
Stranica 1 / 1.

 
Forum(o)Bir:  
Ne možete otvarati nove teme.
Ne 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 cannot 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