ATP List issues
Select messages from
# through # FAQ
[/[Print]\]

Forum@DeGiorgi -> Strukture podataka i algoritmi

#1: ATP List issues Autor/ica: krilo PostPostano: 18:07 sub, 11. 11. 2017
    —
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.)

#2:  Autor/ica: vsegoLokacija: /sbin/init PostPostano: 18:59 ned, 12. 11. 2017
    —
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?

#3:  Autor/ica: krilo PostPostano: 17:21 pon, 13. 11. 2017
    —
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!)

#4:  Autor/ica: vsegoLokacija: /sbin/init PostPostano: 23:27 čet, 16. 11. 2017
    —
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.



Forum@DeGiorgi -> Strukture podataka i algoritmi


output generated using printer-friendly topic mod. Vremenska zona: GMT + 01:00.

Stranica 1 / 1.

Powered by phpBB © 2001,2002 phpBB Group
Theme created by Vjacheslav Trushkin