Kód: Vybrat vše
uzel1:uzel2,uzel5
uzel2:uzel3
uzel3:uzel1
uzel4:
uzel5:uzel1
Pak tam mely byt nejake parametry z prikazove radky, vstup bud ze stdin nebo ze souboru, vystup to melo umet vypsat bud na stdout nebo do souboru (to neni vyber, program mel umet oboje). Nicmene mne to cteni parametru nekontroloval, takze zpetne si myslim, ze je asi lepsi si tyhle rutinni zalezitosti nechat az nakonec.
Cas na to byl 2,5 hodiny, pak to bylo jeste prodlouzeno. Kolik lidi to dalo nevim.
Reseni je asi jasny, jen je nutny dat si pozor na par veci.
Pokud to delat v C++, tak vam tam mozna Microsoft Visual Studio vnuti tuhle hlavicku funkci:
Kód: Vybrat vše
int _tmain(int argc, _TCHAR* argv[])
int main(int argc, char* argv[])
Protoze jinak to bude posilat parametry z prikazovy radky zakodovany v (patrne) Unicode a nebude to UTF-8, takze to neni zpetne kompatibilni se 7-bit ASCII. Cili kdyz se podivate na retezec *argv, tak bude mit jen jeden znak, protoze hned ten druhy je \0 (to unicode dela). Ja o tom nevedel az do vcerejska vecer, protoze sem se nikdy s parametrama na prikazovy radce neotravoval, kdybych se s tim babral behem zapoctu, urcite bych to neudelal.
Pak mi taky pripada fajn neotravovat se se spojovyma seznamama a pokud to jde, pouzit dynamicky realokovane pole. Tj. mit nasledujici funkci (ktera je bez zaruky, mozna je v ni nejaka pekelna chyba, ale uz dva cvicici mi ji uznaly):
(ta funkce je tu i s examplem a ve skutecnosti je fakt kratka; jo a ten zdrojak je striktne receno v C++)
Kód: Vybrat vše
// grow.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <stdlib.h>
// zavolanim tehle funkce rikam programu "mam pole p, s poctem prvku count, velikost
// polozek je element_size a chtel bych zapisovat do p[index], ocheckuj mi to a pripadne
// to pole realokuj na dvojnasobnou velikost"
void * grow(void * p, size_t index, size_t * count, int element_size)
{
if (index < *count)
{
// vsechno dobre
if (index < 0)
{
// pretekli jsme
abort();
return NULL; // asi zbytecny, ale jinak z toho je warning
}
else
{
// ok
return p;
}
}
else
{
// zdvojnasobime velikost pole
void * q;
if (*count == 0)
{
*count = 4;
}
else
{
*count *= 2;
}
// realokujeme
if (NULL == (q = realloc(p, *count * element_size)))
{
// dosla pamet
abort();
return NULL;
}
else
{
// zatim dobry, zavolame se rekurzivne a osetrime tak stav,
// kdy je nutne pole zvetsit jeste vic nez dvakrat
p = q;
return grow(p, index, count, element_size);
}
}
}
int main(int argc, char * argv[])
{
int * pole = NULL; // to NULL tam velmi nutne MUSI byt!
size_t velikost_pole = 0; // rovnez dobre inicializovat na 0
// chceme zapsat do pole[100], pred kazdym takovym zapisem zavolame:
pole = (int *)grow(pole, 100, &velikost_pole, sizeof(int));
// a uz se nemusime o nic starat, samo se to realokovalo (pokud to bylo nutne)
pole[100] = 12345;
printf("To cislo je %d
", pole[100]);
// jeste
pole = (int *)grow(pole, 2500, &velikost_pole, sizeof(int));
pole[2500] = 172;
printf("Jine cislo je %d
", pole[2500]);
// konec
free(pole);
fgetc(stdin);
return 0;
}
pole = (int *)grow(pole, i, &velikost_pole, sizeof(int));
A muzu to pouzit na delani poli cehokoliv...