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
Zdravím,
mám strukturu spojového seznamu
#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
/**
* 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.
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.
Offline
↑ 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.
Offline
↑ 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.
Offline