Prethodna tema :: Sljedeća tema |
Autor/ica |
Poruka |
krilo Forumaš(ica)
Pridružen/a: 01. 11. 2016. (14:45:48) Postovi: (4E)16
Spol:
|
Postano: 18:07 sub, 11. 11. 2017 Naslov: ATP List issues |
|
|
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
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] |
|
vsego Site Admin
Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3560)16
Spol:
Lokacija: /sbin/init
|
Postano: 18:59 ned, 12. 11. 2017 Naslov: |
|
|
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. 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.
|
|
[Vrh] |
|
krilo Forumaš(ica)
Pridružen/a: 01. 11. 2016. (14:45:48) Postovi: (4E)16
Spol:
|
|
[Vrh] |
|
vsego Site Admin
Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3560)16
Spol:
Lokacija: /sbin/init
|
Postano: 23:27 čet, 16. 11. 2017 Naslov: |
|
|
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! 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.
|
|
[Vrh] |
|
|