Binární strom - vložení jmen, výpis délky – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Binární strom - vložení jmen, výpis délky – C / C++ – Fórum – Programujte.comBinární strom - vložení jmen, výpis délky – C / C++ – Fórum – Programujte.com

 

tynry0
Duch
19. 3. 2018   #1
-
0
-

Dobrý den, potřebovala bych pomoc. 

Dostala jsem za úkol naprogramovat binární strom, kterému předáme pole jmen, tyto jména do toho binárního stromu postupně vložíme, nakonec vypíšeme jeho výšku. 

Kód mi vyhazuje chybu u funkce Novy Prvek konkrétně se tomu nelíbí to x. 

Moc prosím o radu co je špatně. 

Předem děkuji.

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

struct prvek
{
	char hodnota[50];		//chceme do hodnoty uložit řetězec
	struct prvek *left;
	struct prvek *right;
};

const char *Jmena[]=
{ "Marie","Jan","Jana","Petr","Josef","Pavel","Jaroslav","Martin","Miroslav","Eva",
"Anna","Hana","Karel","Lenka","Milan","Michal","Alena","Petra","Lucie","Jaroslava",
"Ludmila","Helena","David","Ladislav","Jitka","Martina","Jakub","Veronika","Jarmila","Stanislav",
"Michaela","Ivana","Roman","Monika","Tereza","Zuzana","Radek","Vlasta","Marcela","Marek",
"Dagmar","Dana","Daniel","Marta","Irena","Miroslava","Barbora","Pavla","Miloslav","Olga",
"Andrea","Iveta","Filip","Blanka","Milada","Ivan","Zdenka","Libor","Renata","Rudolf",
"Vlastimil","Nikola","Gabriela","Adam","Radka","Simona","Milena","Miloslava","Iva","Daniela",
"Patrik","Bohumil","Denisa","Robert","Romana","Aneta","Ilona","Dominik","Stanislava","Emilie",
"Radim","Richard","Kamila","Ivo","Rostislav","Vladislav","Bohuslav","Alois","Vit","Kamil",
"Jozef","Vendula","Bohumila","Viktor","Emil","Michael","Ladislava","Magdalena","Eduard","Dominika",
"Marcel","Sabina","Julie","Antonie","Alice","Peter","Dalibor","Kristina","Otakar","Karla",
"Hedvika","Alexandra","Silvie","Erika","Nela","Vratislav","Nikol","Leona","Jolana","Margita",
"Bohuslava","Radovan","Josefa","Terezie","Marian","Linda","Igor" };

const unsigned Pocet=sizeof(Jmena)/sizeof(*Jmena);


//binární vyhledávací strom, pro ukládání jmen


struct prvek* NovyPrvek(char x[]) {
	struct prvek *u;
	u->hodnota = x;		//ukládáme řetězec
	u->left = NULL;
	u->right = NULL;

	return u;
}

struct prvek Insert(struct prvek *root, char x[]) {
	struct prvek *u;
	int cyklus;
	if (root == 0) {
		root = NovyPrvek(x);
		return *root;
	}
	u = root;
	while (cyklus != 1) {
		if (x < u->hodnota) {
			if (u->left == 0) {
				u->left = NovyPrvek(x);
				cyklus = 1;
			}
			u = u->left;
		}
		else {
			if (x > u->hodnota) {
				if (u->right == 0) {
					u->right = NovyPrvek(x);
					cyklus = 1;
				}
				u = u->right;
			}
			else {
				cyklus = 0;
			}
		}
	}
}

void InorderWalk(struct prvek *x) {
	if (x != NULL) {
		InorderWalk(x->left);
		printf("%c ", x->hodnota);
		InorderWalk(x->right);
	}
}

void main() {
	struct prvek *koren = NULL;
	int i;

	for (i = 0; i < Pocet; i++) {
		Insert(koren,Jmena[i]);
	}
}


//vložit jména z pole Jmena do stromu
//vypsat jména uložená ve stromu funkci InorderWalk(x)
/*
InorderWalk(x)
if x!= nil
	InorderWalk(x.left)
	print x.data
	InorderWalk (x.right)
*/
//Zjistete a vypiste vysku sestavenoho vyhled stromu se jmeny
Nahlásit jako SPAM
IP: 176.102.144.–
19. 3. 2018   #2
-
0
-

V C a C++ pole nezná svou velikost.  Výraz

const unsigned Pocet=sizeof(Jmena)/sizeof(*Jmena);

bude mít hodnotu 1, dělíš velikosti ukazatelů. Můžeš prvky v poli spočítat ručně a pak to zadat jako konstantu. "Ohebnější" je jako poslední prvek pole mít prázdný řetězec a čtení ukončit při načtení prázdného řetězce.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
MilanL+1
Grafoman
19. 3. 2018   #3
-
0
-

#1 tynry
hm viděl bych tam ještě problémek u stejného jména se to zacyklí ne?

viz to druhé else { cyklus = 0 }  - nezmění se žádné proměnné a cyklus se opakuje do nekonečna

Nahlásit jako SPAM
IP: 91.139.9.–
zh
~ Anonymní uživatel
7 příspěvků
19. 3. 2018   #4
-
0
-

#2 hlucheucho
Dělí velikost pole velikostí jeho prvku. Dostane počet prvků.

Nahlásit jako SPAM
IP: 213.211.51.–
zh
~ Anonymní uživatel
7 příspěvků
19. 3. 2018   #5
-
0
-

#3 MilanL
Při přiřazení do proměnné se nějaká proměnná mění, ne? Dokonce ta, která ten cyklus řídí.

Nahlásit jako SPAM
IP: 213.211.51.–
zh
~ Anonymní uživatel
7 příspěvků
19. 3. 2018   #6
-
0
-

#1 tynry 

strcpy(u->hodnota, x);
Nahlásit jako SPAM
IP: 213.211.51.–
19. 3. 2018   #7
-
0
-

#4 zh
Zkus si např.: 

int pole[6] = {1, 2, 3, 4, 5, 6};
int pocet;

pocet = sizeof(pole);

Identifikátor pole představuje ukazatel. Do proměnné pocet pak překladač vloží velikost ukazatele v Bytech. Velikost ukazatele závisí na platformě, pokud to zkusíš s MS VS, pravděpodobně dostaneš 4, na 64-bitovém OS můžeš dostat i 8. Na jednočipech to může být i 1 (např. 8051 bez XRAM).

hu

Nahlásit jako SPAM
IP: 195.178.67.–
MilanL+1
Grafoman
19. 3. 2018   #8
-
0
-

#5 zh
no cyklus je proměná, ale jen řídí cyklus a pokud je 0 tak se cyklus opakuje a vzhledem k tomu, že žádná z ostatních proměnných na které tam jsou podmínky se nemění bude se cyklus stále opakovat - pokaždé to podmínkami projde na to samé místo.

Nahlásit jako SPAM
IP: 185.112.167.–
zh
~ Anonymní uživatel
7 příspěvků
20. 3. 2018   #9
-
0
-

#7 hlucheucho
Velikost toho 'pole' je 6 * int.

Nahlásit jako SPAM
IP: 213.211.51.–
zh
~ Anonymní uživatel
7 příspěvků
20. 3. 2018   #10
-
0
-

#8 MilanL
To jo, má to špatně, jen mě zarazila ta formulace.

Nahlásit jako SPAM
IP: 213.211.51.–
20. 3. 2018   #11
-
0
-

#9 zh 

int main()
{
	int pole[6] = { 1, 2, 3, 4, 5, 6 };
	int pocet;


	pocet = sizeof(pole);
	printf("sizeof(pole) je %i \n", pocet);
	printf("pole ukazuje na %X \n", pole);
	printf("prvni prvek pole je %i \n", *pole);

	getchar();
	
	return 0;
}

a výstup vypadal takto:

Připojen obrázek.

Doplnění:
Hledal jsem vysvětlení svého omylu. U statických polí operátor sizeof opravdu vrací jejich velikost v Bytech. U dynamických polí vrátí velikost ukazatele. Námitka, že sizeof vrátí velikost ukazatele mi utkvěla v paměti bohužel bez souvislostí, ve kterých byla použita.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
KIIV
~ Moderátor
+43
God of flame
20. 3. 2018   #12
-
0
-

#11 hlucheucho
sizeof nad statickym polem dava velikost pole v bajtech. Proto se pouziva sizeof(Jmena)/sizeof(*Jmena) - tj. velikost celeho pole v bajtech podelene velikosti jednoho prvku. Je to jedna z mala moznosti, jak to v C udelat. V C++ se da pro zjisteni velikosti pouzit template, rozdil std::end(Jmena)-std::begin(Jmena), da se to primo prochazet pomoci range based foru -> for (char* jmeno : Jmena).

Kazdopadne v C je to zdrojem neskutecneho mnozstvi chyb. Hlavne, kdyz se to preda do funkce s prototypem parametru jako  (typ pole[]) nebo (typ* pole), tak uz je to jen cisty pointer (ale variabilita chyb je nekonecna). Pak uz to bude vracet jen pocet bajtu v jednom pointeru a velikost se musi predat z venku.

Nahlásit jako SPAM
IP: 185.163.41.–
Program vždy dělá to co naprogramujete, ne to co chcete...
20. 3. 2018   #13
-
0
-

#12 KIIV
range based for je hezká vychytávka. Co se týče C++11, jsou moje znalosti takřka nulové. Pro Windows jsem v C++ dělal naposled před 3 lety, používal jsem C++ Builder XE5, který měl C++11 implementovaný mizerně. Přešel jsem na MS VS a C#, hodně mi to usnadnilo práci. 

Kazdopadne v C je to zdrojem neskutecneho mnozstvi chyb. Hlavne, kdyz se to preda do funkce s prototypem parametru jako ...

potom, co jsem si tohle přečetl, se mi vybavil kontext, ve kterém jsem to na fóru viděl nejčastěji.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
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, 16 hostů

Podobná vlákna

Binární strom — založil garamond

Binární strom — založil Michaela

Binární strom — založil Tomáš

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ý