» »

Program v C-ju->seznami->HELP!

Program v C-ju->seznami->HELP!

_B1k3_ ::

NAVODILO:
V programskem jeziku C napišite program, ki prebere datoteko in poišče
ter izpiše 10 najbolj pogosto uporabljenih besed. Besede so lahko
poljubno dolge, ločilo med besedami pa so beli presledki
(presledek, tabulator, znak za novo vrstico). Program naj datoteko,
katere ime je podano kot argument ukazne vrstice, prebere samo enkrat (
zaporedno branje). Za shranjevanje podatkov o prebranih besedah uporabite
linearni kazalčni seznam.

Koda:


struct element//spremenljivke tipa element
{
int stevec; //stevec besed
struct element *naslednji; //kazalec na naslednji element
char *beseda;
};



void dodaj(struct element **p, char *bes) {
struct element *q, *r, *pp;
int zapomni=0;
char *besTemp;




q = (struct element*) malloc(sizeof(struct element)); // rezerviramo prostor za nov element

q->beseda = bes; // vpisemo vrednost novega elementa
q->stevec = 1;
q->naslednji = NULL; // kazalec na naslednji element je pri novem elementu prazen (NULL)
if (*p == NULL){ // seznam, v katerega dodajamo, je prazen, zato dodaj na zacetek
*p = q;
}
else {
r = *p;

//v naslednji zanki preverjamo, ali se nasa beseda ze nahaja v seznami

while(r->naslednji!=NULL)//pogledamo vsak element seznama
{
if(strcmp(r->beseda,bes)==0)//primerjamo vsako besedo s trenutno besedo
{
r->stevec=r->stevec+1;
zapomni=1;//pomeni, da smo v seznamu nasli besedo, ki je enaka besedi ki jo dodajamo
} //in jo zato ni potrebno se enkrat dodati v seznam
r = r->naslednji;
}

if(zapomni==0)//ce je zapomni false, pomeni, da nismo nasli enake besede v seznamu
{
r->naslednji=q;//priklopimo nov element na zadnji element v seznamu
}

}
}

void izpisi(struct element **p) {
struct element *r;

r = *p; // pomozni kazalec r postavimo na zacetek seznama
printf("Izpis seznama:\n%s : %i\n",r->beseda,r->stevec);
while (r->naslednji != NULL){ // s pomoznim kazalcem r se sprehodimo do zadnjega elementa seznama
r = r->naslednji;
printf("%s : %i\n",r->beseda,r->stevec);
}

}

main(int argc, char *argv[])
{
FILE *f1;
f1=fopen(argv[1],"r");
struct element *zacetek;
zacetek=NULL;
int i;
char c;
char bes[100];//to je beseda, ki jo sestavljamo ko jo beremo iz fajla
bes[0]='\0';
while((c=getc(f1))!=EOF)
{
if ((c==' ')||(c=='\n')||(c=='\t')) //preverjamo, ali smo prisli do presledka
{
dodaj(&zacetek,bes);
//ko pridemo do konca besede, klicemo metodo, kjer dodamo novo besedo v seznam
bes[0]='\0';
}
else{
sprintf(bes,"%s%c",bes,c);
/*
besede si znak za znakom shranjujemo v spremenljivko bes,
dokler ne pridemo do znaka za konec besede
*/
}
}
}


V glavnem, zadeva ne dela, ker vse besede v prejšnjih elementih zamenja z besedo, ki jo trenutno dodajamo.....mislm, da so krivi pointerji.....


Please, če kdo obvlada pa se mu da mal pogledat....bi bla zlo vesela.....ker jest se že cel dan je*** s tem...

LP

Quikee ::

Seveda ce v strukturo shranis char* torej le kazalec do besede oz. v tem primeru do char bes[100]; v glavnem programu. Ko shranis besedo v strukturo (v funkciji za dodajanje) moras vsebino kamor kaze kazalec "bes" skopirat na novo lokacijo in shranit kazalec, do te lokacije. Ali pa v strukturo shranjujes fiksno polje znakov in vsebino kopiras v to polje.

Recimo namesto:

struct element//spremenljivke tipa element
{
int stevec; //stevec besed
struct element *naslednji; //kazalec na naslednji element
char *beseda;
};

naredis:

struct element//spremenljivke tipa element
{
int stevec; //stevec besed
struct element *naslednji; //kazalec na naslednji element
char beseda[100];
};

Pri dodajanju pa namesto:

q = (struct element*) malloc(sizeof(struct element)); // rezerviramo prostor za nov element

q->beseda = bes; // vpisemo vrednost novega elementa
q->stevec = 1;
q->naslednji = NULL; // kazalec na naslednji element je pri novem elementu prazen (NULL)

naredis recimo:

q = (struct element*) malloc(sizeof(struct element)); // rezerviramo prostor za nov element

strcpy(&q->beseda, bes); /* ali pa memcpy(&q->beseda, bes,100); */
q->stevec = 1;
q->naslednji = NULL; // kazalec na naslednji element je pri novem elementu prazen (NULL)



v glavnem.. nekaj v tem smislu.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[C] Obrni sklad

Oddelek: Programiranje
101172 (818) Invictus
»

[C++] Linker error

Oddelek: Programiranje
51296 (1296) Quikee
»

[C] Povezani seznami in kazalci

Oddelek: Programiranje
242575 (2142) Good Guy
»

[C] Narascajoce sortiranje linearnega seznama

Oddelek: Programiranje
71873 (1762) Jebiveter
»

[NALOGA][C] fri-vsp - strukture (struct)

Oddelek: Programiranje
101565 (1406) Vesoljc

Več podobnih tem