Matematické Fórum

Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.

Nástěnka
22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.

Nejste přihlášen(a). Přihlásit

#1 28. 02. 2016 00:59

byk7
InQuisitor
Příspěvky: 4713
Reputace:   221 
 

Spojový seznam v C

Zdravím,

mám strukturu spojového seznamu

Code:

#include <stdio.h>
#include <stdlib.h>

/**
 * Struktura Node slouzi pro reprezentaci objektu v oboustranne spojovanem seznamu
 * atribut value reprezentuje ulozenou hodnotu/objekt
 * atribut next je reference na nasledujici prvek v seznamu
 * atribut prev je reference na predchazejici prvek v seznamu
 **/
typedef struct Node {
    int value;
    struct Node* next;
    struct Node* prev;
} Node;

/**
 * Struktura LinkedList reprezentuje spojovany seznam
 * atribut first je ukazatel na prvni prvek seznamu
 * atribut last je ukazatel na posledni prvek seznamu
 **/
typedef struct LinkedList {
    Node *first;
    Node *last;
} LinkedList;

void initList(LinkedList* l) {
    l->first = NULL;
    l->last = NULL;
}

a mám naprogramovat funkci, která do seznamu vloží prvek

Code:

/**
 * Metoda insert() vlozi na konec (za ukazatel last, ktery pak posune)
 * seznamu novy uzel s hodnotou value
 *
 * Vraci ukazatel na uzel v seznamu
 **/
Node *insert(LinkedList *list, int value) {

    Node node;
    node.value = value;
    node.prev = list->last;
    node.next = NULL;

    if (list->last != NULL){
        (list->last)->next = &node;
    }else{
        list->first = &node;
        list->last = &node;
    }

    return &node;
}

podle všeho se zdá, že vkládání do prázdného seznamu je v pořádku,
ale s neprázdným mám problém. Je tam snad logická chyba?

Ještě přidám užité testy ověřující správnost implementace.



Poslední věc, v logu ještě vyskakuje hláška

Code:

C:\...\main.c|51|warning: function returns address of local variable [-Wreturn-local-addr]

je to nějaký zásadnější problém (kompilace a překlad se udělají), popř. jak ho odstranit?

Děkuji.


Příspěvky psané červenou barvou jsou moderátorské, šedá je offtopic.

Offline

  • (téma jako vyřešené označil(a) byk7)

#2 28. 02. 2016 08:36

Jj
Příspěvky: 8769
Škola: VŠB, absolv. r. 1970
Pozice: Důchodce
Reputace:   599 
 

Re: Spojový seznam v C

↑ byk7:

Zdravím.

Já už po létech podrobnou kontrolu nedám, ale řekl bych, že problém (některý z problémů?) zřejmě způsobuje definice Node n; ve funkci (asi se nejedná o 'metodu') Node *insert(LinkedList, int):

Touto definicí se zřídí uzel 'n' v lokální paměti a po ukončení funkce 'insert' je paměť alokovaná pro tuto proměnnou uvolněna (toho se zřejmě týká i uvedené varování překladače).

Paměť pro uzel je třeba dynamicky alokovat na haldě (funkce malloc() ) - zůstane alokována a ukazatel na proměnnou 'n' bude platný do doby uvolnění paměti funkcí free(), resp. do konce chodu programu.


Pokud se tedy nemýlím.

Offline

 

#3 28. 02. 2016 09:55

byk7
InQuisitor
Příspěvky: 4713
Reputace:   221 
 

Re: Spojový seznam v C

↑ Jj:

Není mi jasné, proč musím tu paměť alokovat? Pokud ano, proč prázdný seznam funguje?


Příspěvky psané červenou barvou jsou moderátorské, šedá je offtopic.

Offline

 

#4 28. 02. 2016 10:14

Jj
Příspěvky: 8769
Škola: VŠB, absolv. r. 1970
Pozice: Důchodce
Reputace:   599 
 

Re: Spojový seznam v C

↑ byk7:

Proč alokovat jsem napsal. Proč funguje - paměť je sice uvolněna, ale ukazatel vrácený funkcí insert na ni ukazuje - "nějak" tudíž něco fungovat může, dokud systém paměť něčím nepřepíše.

Řekl bych, že bez alokace paměti na haldě seznam těžko odladíte.


Pokud se tedy nemýlím.

Offline

 

Zápatí

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson