hmmm...
prva vec : nie je najvhodnejsie pomenovovatat rovnako veci: prvok a PRVOK

(prvok a TPRVOK by bolo podla mna vhodnejsie)
dalsia vec: asi by bolo este vhodne vytvorit strukturu ktora bude reprezentovat cely zoznam

lebo takymto sposobom uz pri dvoch zoznamoch by si sa nemusel vyznat a navyse ked
zaciatok a
koniec sa budu menit vynimocne. a nasledne zapuzdrit pracu s ukazatelmi aby sa ti vtom nemohol niekto hrabat a cele by to nefungovalo a nikto by nevedel preco. vlastne by sa pracovalo len s ukazatelom kurzor.
prototypy takych funkcii:
Kód: Vybrať všetko
void InitList (tList *); // inicializacia
void DisposeList (tList *); // zrusenie zoznamu free zaciatok a koniec
void InsertFirst (tList *, int ); // vklad na zaciatok
void InsertLast(tList *, int ); // vklad na koniec
void First (tList *); // kurzor na zaciatok
void Last (tList *); // kurzor na koniec
int GetFirst (tList *); // hodnota na zaciatku
int GetLast (tList *); // hodnota na konci
void DeleteFirst (tList *); // zrus prvy prvok
void DeleteLast (tList *); // zrus poslednu prvok
void PostDelete (tList *); // zmaz prvok pred aktualnym
void PreDelete (tList *); // zmaz prvok za aktualnym
void PostInsert (tList *, int ); // vloz prvok pred aktualny
void PreInsert (tList *, int ); // vloz prvok za aktualny
int Get (tList *); // hodnota aktualneho
void Actualize (tList *, int); // zmen hodnotu na aktualnom
void Succ (tList *); // kurzor na nasledujuci
void Pred (tList *); // kurzor na predchadzajuci
a ak by si chcel aby to fungovalo tak ako to mas ty tak je potrebne do funkcie
vytvor dat ako parametre funcie adresy ukazatelov na prvky.
vysledny kod by potom vyzeral takto

:
Kód: Vybrať všetko
#include <stdio.h>
#include <stdlib.h>
typedef struct prvok
{ int hodnota;
struct prvok *nasl;
struct prvok *pred;
}TPRVOK;
void vytvor(TPRVOK **zac, TPRVOK **kon, TPRVOK **kurz)
{
*zac=(TPRVOK *)malloc(sizeof(TPRVOK)); //pripravim si miesto na zaciatok
*kon=(TPRVOK *)malloc(sizeof(TPRVOK)); //pripravim si miesto na koniec
(*zac)->nasl=*kon; //nastavim nasledovnika zaciatku na koniec
(*zac)->pred=NULL; //nastavim predchodcu zaciatku na NULL
(*kon)->pred=*zac; //nastavim predchodcu konca na zaciatok
(*kon)->nasl=NULL; //nastavim nasledovnika konca na NULL
(*zac)->hodnota=0; //priradim zaciatku hodnotu 0
(*kon)->hodnota=0; //priradim koncu hodnotu 0
*kurz=*zac; //nastavim nech kurzor ukazuje
//tam kde ukazuje zac
printf("%d%d%d\n",(*zac)->hodnota, (*kon)->hodnota,(*kurz)->hodnota); //vypis tu funguje
//uplne korektne
//teda vypise000
}
int main(int argc, char *argv[])
{
TPRVOK *zaciatok,*koniec,*kurzor; //definovanie ukazovatelov
vytvor(&zaciatok,&koniec,&kurzor); //zavolanie funkcie vytvor
printf("%d ",zaciatok->hodnota);
printf("%d ",koniec->hodnota);
printf("%d",kurzor->hodnota); // PROGRAM uz napadne :)
free(zaciatok);
free(koniec);
return 0;
}
Problem bol v tom ze ty si sice vyhradil miesto v pamati ale do funkcie isli kopie ukazatelov na prvky a tak sa vyhradene miesto priradilo inam ako si chcel. Inak dalo by sa to urobit este aj tak ze vlaste budu
zaciatok a
koniec len TPRVOK a nie ukazatele a zbavil by si sa malloc a free. Kurzor by vsak ako ukazatel ostal, ale asi najrozumnejsie by bolo vytvorit tu strukturu
tList.