Stránka: 1 z 1
| [ Príspevkov: 8 ] | |
Autor | Správa |
---|
Registrovaný: 22.10.12 Prihlásený: 21.10.15 Príspevky: 18 Témy: 5 | 5 |
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
|
|
Registrovaný: 17.07.11 Prihlásený: 29.12.20 Príspevky: 1516 Témy: 3 | 3 |
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! |
|
Registrovaný: 22.10.12 Prihlásený: 21.10.15 Príspevky: 18 Témy: 5 | 5 |
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;
|
|
Registrovaný: 01.11.12 Prihlásený: 25.12.14 Príspevky: 40 Témy: 13 | 13 |
no tak máš tam chybu v scanf, máš to scanf("%s",str); a má byť scanf("%s",&str);
|
|
Registrovaný: 11.08.07 Príspevky: 4088 Témy: 34 | 34 Bydlisko: Brno |
Ma to spravne, ved retazec je pointer. Kazdopadne "%50s" namiesto "%s" by bolo bezpecnejsie. ; )
|
|
Registrovaný: 01.11.12 Prihlásený: 25.12.14 Príspevky: 40 Témy: 13 | 13 |
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
|
|
Registrovaný: 11.08.07 Príspevky: 4088 Témy: 34 | 34 Bydlisko: Brno |
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.
|
|
Registrovaný: 17.07.11 Prihlásený: 29.12.20 Príspevky: 1516 Témy: 3 | 3 |
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! |
|
Stránka: 1 z 1
| [ Príspevkov: 8 ] | |
Podobné témy | Témy | Odpovede | Zobrazenia | Posledný príspevok |
---|
| v Assembler, C, C++, Pascal, Java | 5 | 267 | 04.01.2013 16:54 marian_r | | v PC zostavy | 3 | 690 | 17.08.2015 14:29 brmbo | | v Databázy | 7 | 1057 | 26.10.2008 20:14 p360t | | v Assembler, C, C++, Pascal, Java | 7 | 551 | 24.12.2009 14:32 reDo | | v PHP, ASP | 12 | 614 | 14.11.2009 0:01 Snacker | | v JavaScript, VBScript, Ajax | 0 | 322 | 21.02.2010 13:22 senty | | v HTML, XHTML, XML, CSS | 2 | 438 | 13.04.2011 17:50 M4rek | | v Operačné systémy Microsoft | 5 | 401 | 03.11.2010 19:08 jkphoenix | | v HTML, XHTML, XML, CSS | 8 | 490 | 17.02.2008 19:58 Creation | | v Pamäte | 12 | 7599 | 01.02.2010 21:58 shiro | | v AMD - Advanced Micro Devices | 15 | 1484 | 10.09.2007 19:23 Harlequin | | v Antivíry a antispywary | 8 | 1196 | 15.03.2009 11:04 Mandy | | v Ostatné | 3 | 288 | 13.12.2014 18:54 Mandy | | v Ostatné | 6 | 1108 | 07.10.2009 20:05 Mr.Azed | | v Ostatné programy | 15 | 1560 | 12.02.2009 10:33 edulinko | | v Operačné systémy Microsoft | 3 | 328 | 17.02.2013 2:40 S1anley |
|