Struktura v C

Programovacie jazyky, rady, poradňa...
miki11
Light Expert
Light Expert
Príspevky: 74
Registrovaný: 09 feb 2008, 13:59

Struktura v C

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

cawte kamosi potrebujem radu.
mam nejaky subor pokus.txt
mam strukturu

typedef struct zoznam {
int vek;
char meno[10];
struct zoznam *dalsi;
} ZOZNAM;

potrebujem funkcie na zapis udajov do suboru a na zobrazenie(teda aj nacitanie) udajov zo suboru.
Myslim ze je to nieco ako zretazeny zoznam.
Mozno tam treba aj ukazovatele
zoznam *p_akt, *p_prv, *p_prech;
mozete niekto hodit kod resp. inak pomoct dik.
Keby dakto chcel moze aj mazanie resp pridavanie. DIK
neutronmind
Expert
Expert
Príspevky: 189
Registrovaný: 05 aug 2008, 14:17

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

Mohol by si to riesit napr. takto

Kód: Vybrať všetko

while (p_akt->dalsi!=NULL) {
scanf("%d %s", &p_akt->vek, p_akt->meno);
p_akt=p_akt->dalsi;
}
Pointer p_prv by si nastav na uplne prvu strukturu zoznamu, takym sposobom to potom budes aj vypisovat. :)
miki11
Light Expert
Light Expert
Príspevky: 74
Registrovaný: 09 feb 2008, 13:59

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

neutronmind napísal:Mohol by si to riesit napr. takto

Kód: Vybrať všetko

while (p_akt->dalsi!=NULL) {
scanf("%d %s", &p_akt->vek, p_akt->meno);
p_akt=p_akt->dalsi;
}
Pointer p_prv by si nastav na uplne prvu strukturu zoznamu, takym sposobom to potom budes aj vypisovat. :)
dik,
ako nastavim na uplne prvu strukturu.
neutronmind
Expert
Expert
Príspevky: 189
Registrovaný: 05 aug 2008, 14:17

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

Tu mas vzorovy program, ako na to. :)

Kód: Vybrať všetko

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

typedef struct zoznam { 
        int vek; 
        char meno[10]; 
        struct zoznam *dalsi; 
} ZOZNAM;

int main(void)
{
    ZOZNAM *p_zac, *p_akt;
    
    p_zac=(ZOZNAM *)malloc(sizeof(ZOZNAM));
    p_zac->vek=0;
    p_akt=p_zac;
    
    printf("Zadaj vek a meno: ");
    scanf("%d %s", &p_akt->vek, p_akt->meno);
    
    while (p_akt->vek!=0) {
          p_akt->dalsi=(ZOZNAM *)malloc(sizeof(ZOZNAM));
          p_akt=p_akt->dalsi;   
          printf("Zadaj vek a meno: ");
          scanf("%d %s", &p_akt->vek, p_akt->meno);
    }
    
    p_akt->dalsi=NULL;
    
    p_akt=p_zac;
    
    while (p_akt!=NULL) { 
          printf("Zadal si vek a meno: ");
          printf("%d %s\n", p_akt->vek, p_akt->meno); 
          p_akt=p_akt->dalsi; 
    }
    
    return 0;
}
//na ukoncenie vstupu zadaj 0 ako vek
miki11
Light Expert
Light Expert
Príspevky: 74
Registrovaný: 09 feb 2008, 13:59

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

neutronmind napísal:Tu mas vzorovy program, ako na to. :)

Kód: Vybrať všetko

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

typedef struct zoznam { 
        int vek; 
        char meno[10]; 
        struct zoznam *dalsi; 
} ZOZNAM;

int main(void)
{
    ZOZNAM *p_zac, *p_akt;
    
    p_zac=(ZOZNAM *)malloc(sizeof(ZOZNAM));
    p_zac->vek=0;
    p_akt=p_zac;
    
    printf("Zadaj vek a meno: ");
    scanf("%d %s", &p_akt->vek, p_akt->meno);
    
    while (p_akt->vek!=0) {
          p_akt->dalsi=(ZOZNAM *)malloc(sizeof(ZOZNAM));
          p_akt=p_akt->dalsi;   
          printf("Zadaj vek a meno: ");
          scanf("%d %s", &p_akt->vek, p_akt->meno);
    }
    
    p_akt->dalsi=NULL;
    
    p_akt=p_zac;
    
    while (p_akt!=NULL) { 
          printf("Zadal si vek a meno: ");
          printf("%d %s\n", p_akt->vek, p_akt->meno); 
          p_akt=p_akt->dalsi; 
    }
    
    return 0;
}
//na ukoncenie vstupu zadaj 0 ako vek
Dakujem si borec,,,,toto ale pracuje len s pamatou pocitaca, upravil som to na zapis do suboru,,len to akosi neviem nacitat z toho suboru naspat. :cry:
njoko
Light Expert
Light Expert
Príspevky: 50
Registrovaný: 09 okt 2008, 13:32

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

tak isto ako nacitavas zo vstupu, akurat ja by som to robil tak ze si najprv zistim pocet prvkov v subore a potom pre tento pocet po jednom nacitavam do zoznamu., napr :

Kód: Vybrať všetko

void nacitaj(zoznam *prva,FILE *fa,int z)
{    
     int i;
     zoznam *akt;   
      for(i=1; i<=z; i++) 
   {             
                (akt->dalsia=(zoznam *)malloc(sizeof(zoznam))); 
                akt=akt->dalsia;                                
               fscanf(fa,"%d %s", &akt->vek, akt->meno);//len som si nie isty ci za tym %s ma byt aj \n, sak skus
               
   }            
   akt->dalsia=NULL;
  
}
kde prva je prazdny zoznam do ktoreho nacitavas a z je pocet prvkom zoznamu v subore, to hadam zvladnes :)
a mazanie no....tam ide o to ze prechadzas zoznam, kym nenajdes prvok ktory hladas, potom spravit tah ze :

Kód: Vybrať všetko

pred->dalsia=aktualne->dalsia;		//preskoci prvok a zmaze ho 
             free((void *)aktualne);
             aktualne=pred;
edit : nj zabudol som to fscanf
neutronmind
Expert
Expert
Príspevky: 189
Registrovaný: 05 aug 2008, 14:17

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

njoko: znak '\n' tam nemusi byt, znamena to len odriadkovanie. Inak parametrom funkcie fscanf je aj pointer na strukturu FILE, napr.

Kód: Vybrať všetko

fscanf(stdin, "%d", &cislo);
A ako by si chcel zistit pocet prvkov v subore? Podla mna by bolo dost neefektivne ho prechadzat len na to, aby si to zistil, staci ti, ze funkcia fscanf vracia pocet uspesne nacitanych parametrov, takze ja by som to riesil nasledovnym sposobom:

Kód: Vybrať všetko

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

#define MENO_SUBORU "subor.txt"

typedef struct zoznam { 
        int vek; 
        char meno[10]; 
        struct zoznam *dalsi; 
} ZOZNAM; 

int main(void) 
{ 
    ZOZNAM *p_zac, *p_akt; 
    FILE *fr;
    
    if ((fr=fopen(MENO_SUBORU, "r"))==NULL) {
       printf("Subor sa nepodarilo otvorit.\n");
       return 1;
    }
    
    p_zac=(ZOZNAM *)malloc(sizeof(ZOZNAM)); 
    p_akt=p_zac; 
        
    while (fscanf(fr, "%d %s", &p_akt->vek, p_akt->meno)==2) { 
          p_akt->dalsi=(ZOZNAM *)malloc(sizeof(ZOZNAM)); 
          p_akt=p_akt->dalsi;    
    }
    
    p_akt->dalsi=NULL; 
    
    p_akt=p_zac; 
    
    while (p_akt->dalsi!=NULL) { 
          printf("Bolo nacitane vek a meno: "); 
          printf("%d %s\n", p_akt->vek, p_akt->meno); 
          p_akt=p_akt->dalsi; 
    } 
    
    p_akt=p_zac; 
    
    while (p_akt!=NULL) { 
          free((void *)p_akt);
          p_akt=p_akt->dalsi; 
    } 
    
    p_zac=NULL;
    
    fclose(fr);
    
    return 0; 
}
 
miki11
Light Expert
Light Expert
Príspevky: 74
Registrovaný: 09 feb 2008, 13:59

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

p_akt=p_zac;

while (p_akt!=NULL) {
free((void *)p_akt);
p_akt=p_akt->dalsi;
}

p_zac=NULL;


toto co znamena
njoko
Light Expert
Light Expert
Príspevky: 50
Registrovaný: 09 okt 2008, 13:32

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

tym vyprazdnis zoznam
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

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

miki11 napísal: p_akt=p_zac;

while (p_akt!=NULL) {
free((void *)p_akt);
p_akt=p_akt->dalsi;
}

p_zac=NULL;


toto co znamena
zmaže všetky prvky. Nastaví sa na prvý, postupne nimi prechádza kým nejaké sú a uvolňuje ich z pamäte.
miki11
Light Expert
Light Expert
Príspevky: 74
Registrovaný: 09 feb 2008, 13:59

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

normalne nad vami jasam :) ide o to ze ucitel si svoju robotu odflakol, resp preskocil zretazeny zoznam co ja pokladam za dolezite a teraz mam v tom deficit, som rad, ze aspon tu su ludia ochotny pomoct, resp vysvetlit. To uvolnenie asi myslite z pamate pocitaca,nie z dokumentu(ako na dokument?)... Chlapy naozaj mi moc pomahate.
njoko
Light Expert
Light Expert
Príspevky: 50
Registrovaný: 09 okt 2008, 13:32

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

ano z pamate pocitaca .....nerozumiem pojmu dokument, asi myslis z txt...ak ano tak ty nemazes priamo z neho, ty si ten dokument nacitas do zoznamu, tam pomazes co ti treba a potom zoznam ulozis upraveny do dokumentu
neutronmind
Expert
Expert
Príspevky: 189
Registrovaný: 05 aug 2008, 14:17

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

Tak tak, ak by si chcel aj (z nejakeho dovodu) vymazat ten textovy subor, mozes pouzit funkciu remove().
miki11
Light Expert
Light Expert
Príspevky: 74
Registrovaný: 09 feb 2008, 13:59

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

oki tak uz mam poriesene nejake veci,,,uz len potrebujem pridavanie na koniec,,,,ako by som to mal spravit? :cry:
neutronmind
Expert
Expert
Príspevky: 189
Registrovaný: 05 aug 2008, 14:17

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

Co chces priadavat na koniec, a kde? Skus trochu obozrejmit. :wink:
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

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

neutronmind napísal:...
Novú štruktúru chce dať na koniec toho zoznamu. :)
neutronmind
Expert
Expert
Príspevky: 189
Registrovaný: 05 aug 2008, 14:17

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

Tak potom trebars

Kód: Vybrať všetko

p_akt->dalsi=(ZOZNAM *)malloc(sizeof(ZOZNAM));
p_akt=p_akt->dalsi;
:)
miki11
Light Expert
Light Expert
Príspevky: 74
Registrovaný: 09 feb 2008, 13:59

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

no napriklad mam uz toto
1 jana
2 fero
5 lukas

a chcem pridat 4 dana , aby to vyzeralo
1 jana
2 fero
5 lukas
4 dana
neutronmind
Expert
Expert
Príspevky: 189
Registrovaný: 05 aug 2008, 14:17

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

Mohol by si to napr. takto (do toho zdrojaku to potom pridaj medzi p_akt=p_zac; a while (p_akt!=NULL) )

Kód: Vybrať všetko

p_akt->dalsi=(ZOZNAM *)malloc(sizeof(ZOZNAM)); 
p_akt=p_akt->dalsi;
p_akt->vek=4;
strcpy(p_akt->meno, "dana");
p_akt->dalsi=NULL;
Ak by si to chcel nacitat z klavesnice, tak si tam len pridas fscanf()... Takto si to myslel? :)
miki11
Light Expert
Light Expert
Príspevky: 74
Registrovaný: 09 feb 2008, 13:59

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

jj dik

//autoeditácia príspevku ( 09 Jan 2009, 17:19 )
njoko napísal:ano z pamate pocitaca .....nerozumiem pojmu dokument, asi myslis z txt...ak ano tak ty nemazes priamo z neho, ty si ten dokument nacitas do zoznamu, tam pomazes co ti treba a potom zoznam ulozis upraveny do dokumentu
To si myslel ze vymazem povodny TXT, znova ho vytvorim a nahram to tam znova len akurat bez tej osoby co som chcel vymazat?
teda znova nacitam vsetky struktury
-> vymazem TXT
-> vytvorim ho spat za pomoci fopen("nieco.txt", "w")
-> a dam fprintf(fw,"%d %s
",p_akt->vek, p_akt->meno);

lebo ked som na zaciatku dal iba fopen("nieco.txt", "r+") , tak mi na koniec suboru znova zapisalo cely zoznam len bez tej osoby co som chcel vymazat.
Takze som tam mal povodny zoznam a ten novy :wink:
Napísať odpoveď