Řeším takovou věc. Mám udělaný lineární spojový seznam v C. Funguje to všechno perfektně. Problém ale nastal když jsem chtěl udělat druhej seznam. Např. Mám seznamA kde jsou prvky alfa, beta, gama potom chci mít seznamB kde budou prvky uno, duo, tre..
Otázka zní jak modifikovat tuto funkci aby fungovala že při předáním parametru seznamA uložila prvek do seznamuA a při parametru seznamB uložila do seznamuB
Tak jsem při googlu našel tento způsob, kterej je dle mého nejblíže řešení ale nefunguje jak má.. Vypis je Nazdar a NULL namísto očekáváného NazdarAhoj
obdivuju ten kousek kodu ... vypada skoro jako ze dava smysl ale kdyz se nad tim clovek zamysli tak je to ukazkovy priklad jak se to nema delat
void add(char *wordToAdd, struct list *temp) {
// nasledujici dva radky prepisi slovo ktere uz tam bylo, zaroven se elegantne zbavi pointeru na pamet kde je ulozene - memory leak
temp->word = malloc(sizeof(wordToAdd));
strcpy(temp->word, wordToAdd);
// tady se dejme tomu vytvori dalsi prvek - no jo ale co kdyz uz dalsi prvek existuje? opet se zbavime pointeru na nej a data v klidu odpocivaji v pameti
temp->next = malloc(sizeof(struct list));
// toto uz by mohlo i teoreticky davat minimalni smysl:
temp = temp->next;
temp->next = NULL;
}
takze pokud chces delat zasobnik (coz predpokladam podle tveho ocekavaneho zapisu)
tak to bude chit predat list ** pocatek; vytvorit si list temp jako lokalni promennou...
a temp->next dat *pocatek ... a pak na zaver prepsat *pocatek = temp;
EDIT: a jeste jedna docela fatalni chyba: sizeof(wordToAdd) vraci na 32b systemu 4!!!!! tj. nejen memory leak ale jeste k tomu buffer overflow pokud bude slovo delsi jak 3 znaky + 1 ukoncujici -> delka retezce se da zjistit napriklad pomoci strlen
Nahlásit jako SPAM
IP: 94.112.32.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Super, díky, vypadá to že to takto funguje až na jednu maličkost. Neukladá to na první prvek seznamu, což musím ještě pořešit. Můj kod vypadá nyní takto:
#5KIIV
Super funguje to. Problemek byl ve volání funkce. Prostě ty ukazatle mi dávají zabrat..:-( Taky díky za tip na sizeof. Ted pro změnu řeším odebrání prvku které opět nefunguje. Udělal jsem to stylem dle tebe, ale funguje mi odebrání jen prvního prvku. Bude asi problem s tim prev ale nějak na to nemohu přijít...
mel bys znat prev jen proto, abys mohl "preklenout" ten mazanej prvek... potrebujes najit prvek, ktery chces smazat, musis znat jeho predchudce a nasledovnika mas v ->next ... takze zkopirujes si prvek do treba "toFree", prepises ->next predchudce pomoci ->next mazaneho prvku, a pak uz ten prvek muzes pomoci toFree uvolnit
(nejlepsi je si to asi nakreslit na papire ... pekny sipky jako "pointery" a tak... pak je lip videt co mas delat)
Nahlásit jako SPAM
IP: 94.112.32.–
Program vždy dělá to co naprogramujete, ne to co chcete...
#7KIIV
Upps, školácká chyba. Nastavoval jsem si ukazatele na prev a pak jsem na prev uvolnil pamět :-( Mnohokráte děkuji za pomoc.. Již to běhá dle mých představ...