Vymazanie záznamu v jednosmernom lineárnom zozname – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Vymazanie záznamu v jednosmernom lineárnom zozname – C / C++ – Fórum – Programujte.comVymazanie záznamu v jednosmernom lineárnom zozname – C / C++ – Fórum – Programujte.com

 

Kent0
Stálý člen
30. 11. 2013   #1
-
0
-

Dobrý deň,

mám problém s vymazaním záznamu v jednosmernom lin. zozname. Úloha je, že mám záznam kde sú zapísané autá a mám zadať nejakú značku(alebo časť značky) a ak sa nachádza v zozname tak mám ten záznam vymazať. Ale akosi mi to nefunguje tak by som poprosil o pomoc.

p_pom=(*zaznam);		//prvy prvok v zozname
while(p_pom!=NULL)
{
	if(strstr(p_pom->znacka,znacka_zmaz))!=NULL)
	{	
		pocet++;	//pocet zaznamov ktore sa zmazu
		break;
	}
	p_pom=p_pom->p_dalsi;		//posun v zozname
	aktualny=p_pom;						
}
	aktualny->p_dalsi=p_pom->p_dalsi;	//spojenie predchadzajuceho s nasledovnim		
	free((void*)p_pom);
Nahlásit jako SPAM
IP: 178.253.132.–
KIIV
~ Moderátor
+43
God of flame
1. 12. 2013   #2
-
0
-

nevypada ze moc pocitas s tim, ze tam ten prvek na smazani byt vubec nemusi

a taky nevypada, ze bys pocital s tim, ze muze byt prvek na smazani hned na prvnim miste

taktez kdyby tam byl vicekrat by asi moc nefungovalo

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Kent0
Stálý člen
1. 12. 2013   #3
-
0
-

#2 KIIV
to, že môže byť na prvom mieste mám už vyriešené tak som to tu nedal ..v tomto cykle ho chcem zmazať ak nie je na prvom mieste 

Nahlásit jako SPAM
IP: 178.253.132.–
KIIV
~ Moderátor
+43
God of flame
1. 12. 2013   #4
-
0
-

no kdyz se to udela dobre, tak se to da smazat vse v jednom cyklu...

ce se mi tam nelibi vic, je to, ze to delas free az po cyklu - pokud to cele neopakujes do zblbnuti, tak nikdy nesmazes vic nez jeden prvek v tomdle cyklu

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Kent0
Stálý člen
1. 12. 2013   #5
-
0
-

#4 KIIV
no a problém je, že neviem ako to spraviť 

aktualny->p_dalsi=p_pom->p_dalsi;	//spojenie predchadzajuceho s nasledovnim		
	free((void*)p_pom);

toto by malo byť v tej podmienke? 

Nahlásit jako SPAM
IP: 178.253.132.–
KIIV
~ Moderátor
+43
God of flame
1. 12. 2013   #6
-
0
-

mohlo .. jen samozrejme musis posunout p_pom po free na   aktualny->p_dalsi ..  a misto break dat continue..
 

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
KIIV
~ Moderátor
+43
God of flame
1. 12. 2013   #7
-
0
-

nebo bych to mozna videl nejak takto (netestovano - je to spise koncept, jak by to melo fungovat):

int smaz(list ** act, char * co) {
  int cnt=0;
  while (*act != NULL) {
    if (strstr((*act)->znacka, co) != NULL) {
      ++cnt;
      list * tmp = *act;
      *acr = (*act)->p_dalsi;   // prepiseme *act
      free(tmp);
      // neposouvat dal, tim ze se zaznam smazal, tak je "posunuto" tak jak tak
    } else {
      act = &((*acr)->p_dalsi); // posuneme act - respektive udrzujeme si pointer na misto, kde je ulozen pointer aktualniho prvku :)
    }
  }
  return cnt;
}
Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Kent0
Stálý člen
1. 12. 2013   #8
-
0
-

#6 KIIV 

p_pom=(*zaznam);        //prvy prvok v zozname
        while(p_pom!=NULL)
        {
            if((strstr(p_pom->znacka,znacka_zmaz))!=NULL)
                {    
                    aktualny->p_dalsi=p_pom->p_dalsi;
                    free((void*)p_pom);
                    p_pom=aktualny->p_dalsi;
                    pocet++;            //pocet zaznamov ktore sa zmazu
                    continue;
                }
        }

neviem či som správne pochopil ale asi nie lebo mi to nefunguje

Nahlásit jako SPAM
IP: 178.253.132.–
KIIV
~ Moderátor
+43
God of flame
1. 12. 2013   #9
-
0
-

#8 Kent
nepochopils uplne...  ted se zapominas v tom cyklu posouvat, pokud se nema mazat

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Kent0
Stálý člen
1. 12. 2013   #10
-
0
-

#9 KIIV 

if((strstr(p_pom->znacka,znacka_zmaz))!=NULL)
				{	
					aktualny=p_pom;
					p_pom=p_pom->p_dalsi;
					free((void*)aktualny);
					//p_pom=aktualny->p_dalsi;
					pocet++;			//pocet zaznamov ktore sa zmazu
					continue;
				}
				else
				{
				p_pom=p_pom->p_dalsi;				//posun v zozname
				aktualny=p_pom;		}	

teraz to mam tak nejako ale stale nieco nie je dobre 

Nahlásit jako SPAM
IP: 178.253.132.–
KIIV
~ Moderátor
+43
God of flame
1. 12. 2013   #11
-
0
-

   

	aktualny->p_dalsi=p_pom->p_dalsi;	//spojenie predchadzajuceho s nasledovnim		
	free((void*)p_pom);

// kdy se z toho stalo:
aktualny=p_pom;
p_pom=p_pom->p_dalsi;
free((void*)aktualny);

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Kent0
Stálý člen
1. 12. 2013   #12
-
0
-

#11 KIIV
ale keď to dám takto tak mi to nejde:  

if((strstr(p_pom->znacka,znacka_zmaz))!=NULL)
				{	
					aktualny->p_dalsi=p_pom->p_dalsi;	//spojenie predchadzajuceho s nasledovnim		
					free((void*)p_pom);
					pocet++;			//pocet zaznamov ktore sa zmazu
					continue;
				}
			else
				{
					p_pom=p_pom->p_dalsi;				//posun v zozname
					aktualny=p_pom;
				}			

ja som sa už stratil v tom .. 

Nahlásit jako SPAM
IP: 178.253.132.–
KIIV
~ Moderátor
+43
God of flame
1. 12. 2013   #13
-
0
-

pokud si se v tom ztratil, je na case si to zacit kreslit na papire

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
z
~ Anonymní uživatel
268 příspěvků
1. 12. 2013   #14
-
0
-

V else prohoď ty dva příkazy.

Nahlásit jako SPAM
IP: 88.101.8.–
Kent0
Stálý člen
1. 12. 2013   #15
-
0
-

#13 KIIV
nakreslil som si to a našiel som si tú chybu ktorú mi napísal "z" ale stále mi ho hádže chybu
#14 z
áno to som spravil Ďakujem ale stále mi to hádže chybu "RangeChecks instrumentation code detected an out of range array access."

Nahlásit jako SPAM
IP: 178.253.132.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 56 hostů

Podobná vlákna

Zoznam v zozname — založil allicce

Vymazanie adresára — založil gaben

Vymazanie objektu — založil Patrik

Vymazanie neakého riadku . — založil zonda

Subory (vymazanie, edit) — založil jozo0025

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý