Forum » Programiranje » C strukture, kazalci naloga pomoc
C strukture, kazalci naloga pomoc
fingaz ::
Kitajec Huag Hi Cau, ki se uči slovenščino, ima največ težav z branjem od leve proti desni (navajen je namreč brati od desne proti levi). Pomagaj Huangu in napiši računalniški program, ki vsebino datoteke, katere ime je podano v prvem argumentu ob klicu programa, izpiše na zaslon tako, da vsako vrstico te datoteke piše v obratnem vrstnem redu. Pri tem upoštevaj, da so vrstice lahko poljubno dolge!
Primer: če datoteka vsebuje besedilo
Slovenija je lepa dežela.
Najpogostejše moško ime je Janez.
Slovenci so prijazni ljudje.
naj vaš program izpiše
.aležed apel ej ajinevolS
.zenaJ ej emi okšom ešjetsogopjaN
.ejdujl inzajirp os icnevolS.
Natančnejše navodilo: ker je vrstica lahko poljubne dolžine, je ne moremo brati v tabelo ampak moramo uporabiti kazalčni seznam elementov. Predlagam, da seznam implementirate kot sklad: dodajajte na začetek in brišite z začetka - s tem boste dosegli željen učinek (izpis v obratnem vrstnem redu). Pri brisanju bodite pozorni na pravilno sproščanje
pomnilnika (free).
Stvar se mi pomoje zatakne ko bi rad linearni seznam izpisal.Mislim da je problem nov->naslednji=zacetek, ker naslednji nikakor ne dobi vrednost NULL in potem se neskonco vrti v 2 zanki. Fantje prosim za pomoc, ker mi ni nic vec jasno (probavam like 3h..)
Hvala!
Primer: če datoteka vsebuje besedilo
Slovenija je lepa dežela.
Najpogostejše moško ime je Janez.
Slovenci so prijazni ljudje.
naj vaš program izpiše
.aležed apel ej ajinevolS
.zenaJ ej emi okšom ešjetsogopjaN
.ejdujl inzajirp os icnevolS.
Natančnejše navodilo: ker je vrstica lahko poljubne dolžine, je ne moremo brati v tabelo ampak moramo uporabiti kazalčni seznam elementov. Predlagam, da seznam implementirate kot sklad: dodajajte na začetek in brišite z začetka - s tem boste dosegli željen učinek (izpis v obratnem vrstnem redu). Pri brisanju bodite pozorni na pravilno sproščanje
pomnilnika (free).
#include <stdio.h> #include <stdlib.h> typedef struct el{ char *tabela; struct el *naslednji; }element; element *zacetek; int main(int argc,char*argv[]) { zacetek=NULL; FILE*datoteka=fopen(argv[1],"r"); if(datoteka==NULL) { printf("Odpiranje datoteke ni uspelo \n"); } else { element *nov; element *tmp; nov=malloc(sizeof(element)); nov->tabela=malloc(100 * sizeof(char)); while(!feof(datoteka)) { fgets(nov->tabela,100,datoteka); printf("%s",nov->tabela); nov->naslednji=zacetek; zacetek=nov; // zacetek->naslednji=NULL; /*if(nov->naslednji==NULL) printf("naslednji kaze na null");*/ } tmp=zacetek; while(tmp!=NULL) { printf("%s",tmp->tabela); tmp=tmp->naslednji; } } return 0; }
Stvar se mi pomoje zatakne ko bi rad linearni seznam izpisal.Mislim da je problem nov->naslednji=zacetek, ker naslednji nikakor ne dobi vrednost NULL in potem se neskonco vrti v 2 zanki. Fantje prosim za pomoc, ker mi ni nic vec jasno (probavam like 3h..)
Hvala!
joze67 ::
Trije namigi.
(1) Če delaš takole in je tabela znotraj elementa vedno dolžine 100 (je, ker jo vedno - oziroma tistih enkrat - tako mallocas), je enostavneje, če v element kar definiras char tabela[100]. Ni pa to bistveno
(2) Prebrati in izpisati moraš posamezno vrstico, ne cele datoteke. Znotraj while ti manjka še eden, ki bi preverjal dolžino prebranega niza oziroma čakal na trailing \0.
(3) Najpomembneje, delo s seznami je popolnoma mimo. s stavkoma nov->naslednji=zacetek;zacetek=nov; si ustvaril element, ki veselo kaže sam nase. Ne moreš mu zameriti, če je pripravljen v zanki pri izpisu ostati ... poljubno časa.
Kar ti potrebuješ, je torej še ena zanka za branje vrstice; na začetku inicializiraš seznam (narediš en element, da imaš kam brati); dokler ne prebereš celotne vrstice, dodaš nov element na konec (in vanj prebereš). Ko pa enkrat prebereš vso vrstico, greš nazaj in hkrati obračaš posamezne koščke.
(1) Če delaš takole in je tabela znotraj elementa vedno dolžine 100 (je, ker jo vedno - oziroma tistih enkrat - tako mallocas), je enostavneje, če v element kar definiras char tabela[100]. Ni pa to bistveno
(2) Prebrati in izpisati moraš posamezno vrstico, ne cele datoteke. Znotraj while ti manjka še eden, ki bi preverjal dolžino prebranega niza oziroma čakal na trailing \0.
(3) Najpomembneje, delo s seznami je popolnoma mimo. s stavkoma nov->naslednji=zacetek;zacetek=nov; si ustvaril element, ki veselo kaže sam nase. Ne moreš mu zameriti, če je pripravljen v zanki pri izpisu ostati ... poljubno časa.
Kar ti potrebuješ, je torej še ena zanka za branje vrstice; na začetku inicializiraš seznam (narediš en element, da imaš kam brati); dokler ne prebereš celotne vrstice, dodaš nov element na konec (in vanj prebereš). Ko pa enkrat prebereš vso vrstico, greš nazaj in hkrati obračaš posamezne koščke.
blay ::
Hej.
Enostavna resitev (cisto ok, ce ne bos operiral nad kaksnimi glamozno velikimi podatki):
Ti tole resi prolem ali moras obvezno brat v linked list?
In ja, koda ni ravno najlepsa, ampak ce se izkaze za ok resitev bos ze predelal.
Lp, Blay.
Enostavna resitev (cisto ok, ce ne bos operiral nad kaksnimi glamozno velikimi podatki):
#include<stdio.h> #include<stdlib.h> int main(int argc, char **argv) { int fsize; int i; char *buf; if(argc != 2) return -1; FILE *f = fopen(argv[1], "r"); if(!f) return -1; fseek(f, 0L, SEEK_END); // dobimo file size; lahko uporabis tudi druge funkcije, npr. stat() fsize = ftell(f); fseek(f, 0L, SEEK_SET); buf = (char *)malloc(fsize * sizeof(char)); if(buf == NULL) return -1; if(fread(buf,1,fsize,f) != fsize) return -1; for(i = fsize; i >= 0; ) putchar(buf[--i]); putchar('\n'); fclose(f); return 0; }
Ti tole resi prolem ali moras obvezno brat v linked list?
In ja, koda ni ravno najlepsa, ampak ce se izkaze za ok resitev bos ze predelal.
Lp, Blay.
Zgodovina sprememb…
- spremenil: blay ()
fingaz ::
Treba je uporabit linearni seznam, ce ga ne bi bilo treba bi bilo vrjetno ze narejeno xD . Vseen hvala za pomoc..
Zdele grem naprej delat pa vas obvestim :)
LP
Zdele grem naprej delat pa vas obvestim :)
LP
blay ::
Mogoce kaj takega? (Na hitro spacano :-)
#include<stdio.h> #include<stdlib.h> #define BSIZE 10 typedef struct _list_t list_t; struct _list_t { list_t *prev; char str[BSIZE]; }; void print(list_t *); int main(int argc, char **argv) { int i; char buf[BSIZE]; if(argc != 2) return -1; list_t *t = NULL, *tmp; FILE *f = fopen(argv[1], "r"); if(!f) return -1; do { if(!t) { t = (list_t *)malloc(sizeof(list_t)); t->prev = NULL; } else { tmp = (list_t *)malloc(sizeof(list_t)); tmp->prev = t; t = tmp; } } while(fread(t->str, sizeof(char), BSIZE, f) == BSIZE); print(t); fclose(f); return 0; } void print(list_t *t) { list_t *tmp; while(t) { char *i; for(i = t->str + BSIZE - 1; i >= t->str; i--) putchar(*i); tmp = t; t = t->prev; free(tmp); } putchar('\n'); }
DavidJ ::
Kako naredimo v programskem jeziku C, Alenka Kavčič
Čudovitih 100 strani uvoda v C s primeri (tudi linearni seznam).
Čudovitih 100 strani uvoda v C s primeri (tudi linearni seznam).
"Do, or do not. There is no 'try'. "
- Yoda ('The Empire Strikes Back')
- Yoda ('The Empire Strikes Back')
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | [c] Enaki datotekiOddelek: Programiranje | 1026 (886) | Spura |
» | [C] Povezani seznami in kazalciOddelek: Programiranje | 2556 (2123) | Good Guy |
» | [c++] prenos po referenciOddelek: Programiranje | 2501 (2436) | atasmrk |
» | [C] Narascajoce sortiranje linearnega seznamaOddelek: Programiranje | 1849 (1738) | Jebiveter |
» | Pointer-ji v C-juOddelek: Programiranje | 1771 (1469) | rokpok |