Obsah fóra
PravidláRegistrovaťPrihlásenie




Odpovedať na tému [ Príspevkov: 8 ] 
AutorSpráva
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 22.10.12
Prihlásený: 21.10.15
Príspevky: 18
Témy: 5
Príspevok NapísalOffline : 06.12.2013 11:12

Dobrý deň, pracujem na jednom projekte a mám za úlohu v spájanom zozname nájsť zhodný retazec a vymazať celú štruktúru v ktorej sa nachádza ten retazec.

Kód:
typedef struct tovar {
char str1
char str2
char str3
int cislo
int cislo
char str4
struct tovar *dalsi;
}TOVAR;

TOVAR *zmaz(TOVAR *zoznam)  //funkcia na zmazanie poloziek podla zadanej znacky
{
    char str[51];
    int i=0,j=0,zhoda = 0,dlzka;
    char pom[51];
    int pocet_zaznamov=0;
    TOVAR *tmp,*next;
    tmp=zoznam;
    scanf("%s",str);
    dlzka = strlen(str);
   
    next = tmp;
    while(tmp != NULL)
    {
        while (tmp->str2[i] != '\0')   //prerobenie na male písmená
        {
            pom[i] = tolower(tmp->str2[i]);
            str[i] = tolower(str[i]);
            i++;
        }
        pom[i] = '\0';
        i=0;
        while (pom[i] != '\0')   //hľadanie zhody pretože zadaný retazec moze byt aj mensi ako definovany
        {
            if (str[j] == pom[i])
            {
                zhoda++;
                j++;
            }
            else if (str[j-1] == pom[i])
            {
            }
            else if (zhoda == dlzka)   //vycistenie (nefunguje)
            {
                next = tmp->dalsi;
                free(tmp);
                tmp = next;
                zhoda = 0;
                pocet_zaznamov++;
            }
            else
            {
                zhoda = 0;
                j=0;
            }
            i++;
        }
        tmp=tmp->dalsi;
        i=0;
    }
   
    printf("Zmazalo sa %d zaznamov \n",pocet_zaznamov);
   
    return zoznam;
}

Takto mi to vymaze iba zaciatok ale ak chcem vyprazdnit vsetky veci tak mi napise ze nemoze ju vyprazdnit ked nebola alokovana
Ak by sa niekomu chcelo a poradil mi ako to mám správne prerobiť aby mi to vymazalo iba tú štruktúru ktorú potrebujem bol by som veľmi vdačný.
Vopred ďakujem


Offline

Skúsený užívateľ
Skúsený užívateľ
Obrázok užívateľa

Registrovaný: 17.07.11
Prihlásený: 29.12.20
Príspevky: 1516
Témy: 3
Príspevok NapísalOffline : 06.12.2013 11:23

1. Prečo v poslednom else nuluješ zhodu aj j a v mazaní nuluješ len zhodu?
2. Prečo tam máš všade else if? Trafíš sa vôbec niekedy do toho mazania (zhoda==dlzka)? Zhodu inkrementuješ, v ďalšom cykle možno tiež a rovnať sa ti to nebude. Resp. bude len v prípade, že v ďalšom cykle sa nesplnia tie dve podmienky pred tým.
3. Poznámka: tolower môžeš používať priamo v podmienke if( tolower(a) == tolower(b) ) a nemusíš to celé prechádzať dva krát.







_________________
Na súkromné správy týkajúce sa problémov, ktoré sa riešia vo fóre, neodpovedám!
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 22.10.12
Prihlásený: 21.10.15
Príspevky: 18
Témy: 5
Príspevok Napísal autor témyOffline : 07.12.2013 10:07

Tak som ten kód zjednodušil na takýto tvar ale stále to nerieši môj problém s vyčistením štruktúry
Kód:
TOVAR *zmaz(TOVAR *zoznam)  //funkcia na zmazanie poloziek podla zadanej znacky
{
    char str[51];
    int i=0;
    char pom[51];
    char *str_pom;
    int pocet_zaznamov=0;
    TOVAR *tmp_automobil,*next_automobil=NULL;
    tmp_automobil=zoznam;
    scanf("%s",str);
   
    next_automobil = tmp_automobil;
    while(tmp_automobil != NULL)
    {
        while (tmp_automobil->znacka[i] != '\0')
        {
            pom[i] = tolower(tmp_automobil->znacka[i]);
            str[i] = tolower(str[i]);
            i++;
        }
        str_pom = strstr(pom, str);
        if (str_pom != NULL)
        {
            free(tmp_automobil);
            pocet_zaznamov ++;
        }
        tmp_automobil=tmp_automobil->dalsi;
        i=0;
    }
   
    printf("Zmazalo sa %d zaznamov \n",pocet_zaznamov);
   
    return zoznam;


Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 01.11.12
Prihlásený: 25.12.14
Príspevky: 40
Témy: 13
Príspevok NapísalOffline : 07.12.2013 21:18

no tak máš tam chybu v scanf, máš to scanf("%s",str); a má byť scanf("%s",&str);


Offline

Čestný člen
Čestný člen
C- Vyčistenie jednej struktury v spajanom zozname

Registrovaný: 11.08.07
Príspevky: 4088
Témy: 34
Bydlisko: Brno
Príspevok NapísalOffline : 07.12.2013 21:48

Ma to spravne, ved retazec je pointer. Kazdopadne "%50s" namiesto "%s" by bolo bezpecnejsie. ; )


Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 01.11.12
Prihlásený: 25.12.14
Príspevky: 40
Témy: 13
Príspevok NapísalOffline : 07.12.2013 22:45

nie pretože v scanf pri tých premenných či ako sa to volá musí byť vždy &, čítal som to ešte pred rokom v učebnici, zostalo mi toho ešte kopu, neviem prečo ale že musí byť to je taký rozdiel


Offline

Čestný člen
Čestný člen
C- Vyčistenie jednej struktury v spajanom zozname

Registrovaný: 11.08.07
Príspevky: 4088
Témy: 34
Bydlisko: Brno
Príspevok NapísalOffline : 08.12.2013 10:31

No, "nevies preco", tak to ocividne nerozumies ani zakladom C (je pravda, ze ja tiez nie, ale aspon si nieco skusim overit predtym, ako trepnem blbost). Este raz, pole v C je ukazatel na prvy prvok, preto ten ampersand uz nie je ziaduci a ak ho tam das, pri kompilacii s -Wall ti to vyhodi aj warning.


Offline

Skúsený užívateľ
Skúsený užívateľ
Obrázok užívateľa

Registrovaný: 17.07.11
Prihlásený: 29.12.20
Príspevky: 1516
Témy: 3
Príspevok NapísalOffline : 08.12.2013 22:16

V prvom rade, na tie kecy okolo ampersandov, "lebo som to čítal v učebnici", radšej nereagujem. Akoby to tu ani nebolo. Ale je pravda, že scanf nie je na načítanie reťazcov úplne dobrý, používa sa radšej funkcia gets.

V druhom rade, ten zjednodušený kód už ani len nepripomína mazanie prvku zo spojového zoznamu. V prípade, že je prvok správny a má sa zmazať, zmažeš si ho a potom chceš zrazu pristupovať k ďalšiemu. Ale akému ďalšiemu, keď si ho už zmazal?!
Nájdi si, ako sa maže prvok zo spojového zoznamu a zmaž to správne (typicky tam iteruješ dva ukazatele, predošlý a aktuálny). Potom by to malo fungovať, už naozaj nevidím dôvod, prečo nie.

// No dobre, aby som nebol zlý, tak aby bolo jasné: scanf očakáva ako parameter adresu prvku, do ktorého má vložiť hodnotu. Adresu prvku preto, lebo sa to správa ako tzv. vstupno-výstupný parameter, alebo v tomto prípade len výstupný parameter (viz lepšie učebnice)







_________________
Na súkromné správy týkajúce sa problémov, ktoré sa riešia vo fóre, neodpovedám!
Odpovedať na tému [ Príspevkov: 8 ] 


Podobné témy

 Témy  Odpovede  Zobrazenia  Posledný príspevok 
V tomto fóre nie sú ďalšie neprečítané témy. c struktury

v Assembler, C, C++, Pascal, Java

5

235

04.01.2013 16:54

marian_r Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Zapojenie jednej GTX 980 a jednej GTX 980 TI do SLI

v PC zostavy

3

613

17.08.2015 14:29

brmbo Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. načítanie stromovej štruktúry

v Databázy

7

1031

26.10.2008 20:14

p360t Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. struktury a subory

v Assembler, C, C++, Pascal, Java

7

509

24.12.2009 14:32

reDo Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Oddelenie logiky od struktury

v PHP, ASP

12

572

14.11.2009 0:01

Snacker Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. thickbox v ul zozname

v JavaScript, VBScript, Ajax

0

300

21.02.2010 13:22

senty Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Pozadie vo vnorenom zozname

v HTML, XHTML, XML, CSS

2

418

13.04.2011 17:50

M4rek Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Problém v zozname programov

v Operačné systémy Microsoft

5

376

03.11.2010 19:08

jkphoenix Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Problem s menu v zozname

v HTML, XHTML, XML, CSS

8

472

17.02.2008 19:58

Creation Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. vycistenie disku

v Ostatné programy

15

1506

12.02.2009 10:33

edulinko Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Vycistenie ram?

v Pamäte

12

7539

01.02.2010 21:58

shiro Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Vycistenie vetracikov

v AMD - Advanced Micro Devices

15

1444

10.09.2007 19:23

Harlequin Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Vycistenie PC

v Antivíry a antispywary

8

1167

15.03.2009 11:04

Mandy Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Vyčistenie PC

v Ostatné

3

257

13.12.2014 18:54

Mandy Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Vyčistenie PC!

v Ostatné

6

1066

07.10.2009 20:05

Mr.Azed Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Zmena písmena disku (nie je v zozname)

v Operačné systémy Microsoft

3

302

17.02.2013 2:40

S1anley Zobrazenie posledných príspevkov


Nemôžete zakladať nové témy v tomto fóre
Nemôžete odpovedať na témy v tomto fóre
Nemôžete upravovať svoje príspevky v tomto fóre
Nemôžete mazať svoje príspevky v tomto fóre

Skočiť na:  

Powered by phpBB Jarvis © 2005 - 2024 PCforum, webhosting by WebSupport, secured by GeoTrust, edited by JanoF
Ako väčšina webových stránok aj my používame cookies. Zotrvaním na webovej stránke súhlasíte, že ich môžeme používať.
Všeobecné podmienky, spracovanie osobných údajov a pravidlá fóra