Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

vezane liste - kratko

[es] :: C/C++ programiranje :: C/C++ za početnike :: vezane liste - kratko

[ Pregleda: 2105 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

dontoo

Član broj: 249815
Poruke: 40
*.adsl.net.t-com.hr.



+1 Profil

icon vezane liste - kratko21.03.2010. u 17:45 - pre 171 meseci
Da sad ne zamaram sa cijelim kodom, evo u čemu je problem. U knjizi C Primer plus autor pravi vezanu listu koja ruši program kod čišćenja memorije. Inače list iz knige radi ( napravi se uredno ).

Primjer iz knjige:
Code:

current = head;

while (current != NULL)

{

    free(current);                    //Autor prvo uništi objekt...

    current = current->next;     //Pa taj uništeni objekt pridružuje pointer varijabli current ( tu program puca )

}


Moj prepravak:
Code:
    current = head;
    while (current != NULL)
    {
        head = current->next;                //spreman pokazivač na sljedeći član u varijabu head
        free(current);                           //uništavam objekt
        current = head;                        //sad imam što pridružiti varijabli current koju ću uništiti u sljedećem krugu
    }
    printf("Bye!\n");


Samo me zanima jeli ovo ok što sam napravio da nebi naučio krivo?
 
Odgovor na temu

dontoo

Član broj: 249815
Poruke: 40
*.adsl.net.t-com.hr.



+1 Profil

icon Re: vezane liste - kratko21.03.2010. u 17:55 - pre 171 meseci
Downloadao sam source code knjige i u njemu ista greška. Pa dali ti ljudi kompajiraju svoje programe, ili im njihov kompjler ne prijavi grešku?
Code:
/* films2.c -- using a linked list of structures */
#include <stdio.h>
#include <stdlib.h>      /* has the malloc prototype      */
#include <string.h>      /* has the strcpy prototype      */
#define TSIZE    45      /* size of array to hold title   */

struct film {
    char title[TSIZE];
    int rating;
    struct film * next;  /* points to next struct in list */
};

int main(void)
{
    struct film * head = NULL;
    struct film * prev, * current;
    char input[TSIZE];

/* Gather  and store information          */
    puts("Enter first movie title:");
    while (gets(input) != NULL && input[0] != '\0')
    {
        current = (struct film *) malloc(sizeof(struct film));
        if (head == NULL)       /* first structure       */
            head = current;
        else                    /* subsequent structures */
            prev->next = current;
        current->next = NULL;
        strcpy(current->title, input);
        puts("Enter your rating <0-10>:");
        scanf("%d", &current->rating);
        while(getchar() != '\n')
            continue;
        puts("Enter next movie title (empty line to stop):");
        prev = current;
    }

/* Show list of movies                    */
    if (head == NULL)
        printf("No data entered. ");
    else
        printf ("Here is the movie list:\n");
    current = head;
    while (current != NULL)
    {
        printf("Movie: %s  Rating: %d\n", 
               current->title, current->rating);
        current = current->next;
    }

/* Program done, so free allocated memory */
    current = head;
    while (current != NULL)
    {
        free(current);
        current = current->next;
    }
    printf("Bye!\n");

    return 0;
}
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4902
212.200.65.*

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: vezane liste - kratko21.03.2010. u 18:17 - pre 171 meseci
Nisi jedini koji je to primetio:

Da ne prepricavam, evo detalja:
http://bytes.com/topic/c/answe...665-freeing-simple-linked-list
 
Odgovor na temu

dontoo

Član broj: 249815
Poruke: 40
*.adsl.net.t-com.hr.



+1 Profil

icon Re: vezane liste - kratko21.03.2010. u 20:18 - pre 171 meseci
Samo da još nešto pitam. Trebam li deklarirati još jednu temp pointer varijablu ili mogu koristit head kao temp varijablu?
Code:

    current = head;
    struct film * temp;
    while (current != NULL)
    {
        temp = current->next;
        free(current);
        current = temp;
    }

Ovaj kod ne deklarira novu varijablu već korist head za temp varijablu:
Code:
    current = head;
    while (current != NULL)
    {
        head = current->next;
        free(current);
        current = head;
    }

Što me brine? Ja mislim (tako mi se čini logično) da u drugom primjeru mogu koristiti head kao temp jer:
current = head; //current pokazuje na memorijsku lokaciju na koju pokazuje head
head = current->next; // head pokazuje na novu memorijsku lokaciju, ali current i dalje pokazuje na lokaciju na koju je prije pokazivo head
//To me brine, dali mjenjanjem lokacije na koju pokazuje head i current nekako pokazuje na tu lokaciju ( zbog current = head )?
free( current );
current = head; //current pokazuje na novu lokaciju heada
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: vezane liste - kratko21.03.2010. u 20:31 - pre 171 meseci
Recikliranjem promenljivih činiš sebi medveđu uslugu. Ne dobijaš apsolutno ništa, a gubiš na razumljivosti koda. Kad god pišeš kod prve stvari na umu moraju da ti budu funkcionalnost, elegancija i čitljivost koda, mogućnost lake reorganizacije, pa tek onda vremenska i prostorna optimizacija. Gledaj na to ovako: ako recikliraš promenljivu uštedeo si 4 bajta sad, ali onaj ko bude gledao kod potrošiće 4 minuta više da shvati šta se tu dešava. Ti sam odluči šta je tu vrednije.
 
Odgovor na temu

[es] :: C/C++ programiranje :: C/C++ za početnike :: vezane liste - kratko

[ Pregleda: 2105 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.