Volanie funkcii s pointermi -linear. zoznam -C

Programovacie jazyky, rady, poradňa...
milanbb55
Novice
Novice
Príspevky: 6
Registrovaný: 09 nov 2005, 7:45

Volanie funkcii s pointermi -linear. zoznam -C

Príspevok od používateľa milanbb55 »

Zdravim, mam taký problém, pokúšam sa vytvoriť obojsmerný spajaný zoznam s nárazníkmi s troma ukazovateľmi na začiatok, koniec a pohyblivým kurzorom. Lenže hned som zastal pri počiatočnej funkcii inicialiazacia ktorá ma za úlohu vytvoriť narazniky: začiatok a koniec a priradiť kurzor priradiť na začiatok. Teda že nasledovník začiatočníka ukazuje na koniec a predchodca začiatku je NULL a zas predchodca konca ukazuje na začiatok a nasledovník konca je NULL. Lenže v pascale to viem urobiť ale v céčku asi robím niečo zle tu je kod aj s popisom chyby

Kód: Vybrať všetko

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

typedef struct prvok
{ int hodnota;
  struct prvok *nasl;
  struct prvok *pred;      
        }PRVOK;
        
     
   void vytvor(PRVOK *zac, PRVOK *kon, PRVOK *kurz) 
{
     zac=(PRVOK *)malloc(sizeof(PRVOK)); //pripravim si miesto na zaciatok
     kon=(PRVOK *)malloc(sizeof(PRVOK)); //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[])
{
    PRVOK *zaciatok,*koniec,*kurzor; //definovanie ukazovatelov
    vytvor(zaciatok,koniec,kurzor); //zavolanie funkcie vytvor
    printf("%d",kurzor->hodnota);  //CHYBA program padne, ale
                                    //prikaz: printf("%d",kurzor->hodnota); funguje 
    
    system("PAUSE");
  	
  return 0;
}

Za každú pomoc veľmi ďakujem :)
tuti
Light Professional
Light Professional
Používateľov profilový obrázok
Príspevky: 740
Registrovaný: 01 okt 2006, 19:23
Bydlisko: Prievidza

Príspevok od používateľa tuti »

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 :wink: 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.
Napísať odpoveď