[Powered by Google Translate] [Pjesa 6] [More komode]
[Rob Bowden] [Universiteti i Harvardit]
[Kjo është CS50.] [CS50.TV]
>> Ne mund të shkojnë në seksionin tonë të pyetjeve.
I dërguar URL për hapësirën para.
Fillimi i seksionit të pyetjeve them-
me sa duket unë nuk jam plotësisht unsick-është një pyetje shumë e lehtë
të vetëm atë që është Shprehje?
Çfarë do Shprehje bëni?
Çdokush doni të thoni se çfarë Shprehje bën?
[Student] Verifikimet e kujtesës rrjedhjet.
Po, është një checker Shprehje përgjithshëm kujtesës.
Kjo, në fund, ju tregon se në qoftë se ju keni ndonjë rrjedhjet e kujtesës,
e cila është më së shumti atë që ne jemi duke e përdorur atë për shkak se në qoftë se ju doni të
të bëjë mirë në setin e problemit, ose në qoftë se ju doni të
të marrë në bordin e madhe, ju duhet të keni asnjë lloj rrjedhjet e kujtesës,
dhe në rast se ju keni një rrjedhje kujtesës që ju nuk mund ta gjeni,
Gjithashtu mbani në mend se sa herë që ju të hapur një skedë
dhe në qoftë se ju nuk e mbyllni atë, kjo është një rrjedhje kujtim.
>> Shumë njerëz janë në kërkim për disa nyje që ata nuk janë liruar
kur me të vërtetë, ata nuk e mbyll fjalor në hapin e parë.
Ai gjithashtu ju tregon se në qoftë se ju keni ndonjë pavlefshme lexon apo shkruan,
që do të thotë në qoftë se ju provoni dhe të vendosur një vlerë
që është përtej fund të tog dhe kjo nuk ndodh për faj Seg
por Shprehje kap atë, si ju nuk duhet të vërtetë të jetë me shkrim atje,
dhe kështu ju nuk duhet të ketë patjetër ndonjë nga ato ose.
Si mund të përdorni Shprehje?
>> Kjo është një pyetje e përgjithshme e
lloj i drejtuar atë dhe të kërkoni në prodhim.
Prodhimi është e madhe shumë herë.
Ka edhe gabime fun ku në qoftë se ju keni ndonjë gjë tmerrësisht e gabuar
ndodh në një lak, atëherë ai do të thotë: "Rruga gabime shumë.
Unë jam duke shkuar për të ndaluar numërimin tani. "
Kjo është në thelb prodhimit tekstuale që ju duhet të kuptoj.
Në fund, ai do t'ju tregojë ndonjë rrjedhjet e kujtesës që ju keni,
sa blloqe, të cilat mund të jenë të dobishme për shkak se
në qoftë se ajo është një unfreed bllok, atëherë ajo është zakonisht më e lehtë për të gjetur
se 1.000 blloqe unfreed.
1.000 bllokon unfreed ndoshta do të thotë që ju nuk jeni të liruar
listat tuaja të lidhura e pakicës ose diçka.
Kjo është Shprehje.
>> Tani ne kemi pjesën tonë të pyetjeve,
që ju nuk keni nevojë për të shkarkuar.
Ju mund të klikoni mbi emrin tim dhe tërheqja e tyre deri në hapësirë.
Tani klikoni mbi mua.
Rishikimi 1 do të jetë i rafte, të cilat ne jemi duke bërë para.
Revizioni 2 do të jetë radhë, dhe Revision 3 do të jetë lista e veçmas të lidhura.
Duke filluar me rafte tonë.
Si ajo thotë se këtu, një pirg është një nga më themelore,
dhënat themelore strukturat e shkencës kompjuterike.
Shembulli shumë prototipike është
rafte e tabaka në sallë ngrënie.
Kjo është në thelb kur ju jeni duke u futur në një pirg,
dikush do të thonë, "Oh, si një pirg e tabaka."
Ju rafte tabaka deri.
Atëherë kur ju shkoni për të tërhequr një tabaka,
tabaka parë që është duke u tërhequr është i fundit që është vënë në rafte.
Rafte si ajo gjithashtu-thotë këtu-
ne kemi segmentin e kujtesës quajtur rafte.
Dhe pse është quajtur rafte?
>> Sepse si një strukturë të dhënave rafte,
ajo shtyn dhe pops korniza rafte në rafte,
ku korniza rafte janë si një thirrje të veçantë të një funksioni.
Dhe si një pirg, ju gjithmonë do të keni për të kthyer
nga një telefonatë funksion para se ju mund të merrni poshtë në korniza rafte ulta përsëri.
Ju nuk mund të ketë kryesor thirrje foo bar thirrjes dhe kthimin bar të drejtpërdrejt kryesore.
Është gjithmonë e mori për të ndjekur rafte correct shtyjnë dhe popping.
Dy operacione, siç thashë, janë shtytje dhe pop.
Ata janë terma universale.
Ju duhet të dini shtytje dhe pop në aspektin e oxhaqet pa marrë parasysh se çfarë.
Ne do të shohim rradhë janë lloj i ndryshëm.
Ajo nuk ka të vërtetë kanë një term universal, por shtytje dhe pop janë universale për oxhaqet.
Push është vënë vetëm në rafte.
Pop është marrë jashtë rafte.
Dhe ne shohim këtu kemi typedef pirg tonë struct,
kështu që ne kemi vargjet char **.
A nuk merrni frikësuar nga ndonjë **.
Kjo do të përfundojë si një grup i strings
ose një grup i pointers tek karaktereve, ku
pointers karaktere priren të jenë vargjet.
Ajo nuk duhet të jetë vargjet, por këtu, ata do të jenë vargjet.
>> Ne kemi një grup të strings.
Ne kemi një madhësi, e cila përfaqëson sa elemente janë aktualisht në rafte,
dhe pastaj ne kemi kapacitet, e cila është sa elemente mund të jetë në rafte.
Kapaciteti duhet të nisem si diçka të madhe se 1,
por madhësia do të nisem si 0.
Tani, ka në thelb tre mënyra të ndryshme ju mund të mendoni një pirg.
E pra, nuk janë ndoshta më shumë, por të dy rrugët kryesore janë
ju mund të zbatojë atë duke përdorur një rrjet, ose ju mund të zbatojë atë duke përdorur një listë e lidhur.
Listat e lidhura janë lloj i parëndësishëm për të bërë paratë nga.
Ajo është shumë e lehtë për të bërë një pirg duke përdorur listat e lidhura,
kështu që këtu, ne jemi duke shkuar për të bërë një pirg përdorur vargjeve,
dhe pastaj duke përdorur vargjeve, ka edhe dy mënyra që ju mund të mendoni për atë.
Më parë, kur kam thënë ne kemi një kapacitet për rafte,
kështu që ne mund të përshtatet një element në rafte.
>> Një mënyrë kjo mund të ndodhë është sa më shpejt që ju goditi 10 elemente, atëherë ju jeni bërë.
Ju mund të dini se ka një sipërme të detyruar të 10 gjërat në botë
se ju nuk do të ketë më shumë se 10 gjërat në rafte tuaj,
në të cilin rast ju mund të ketë një sipërme të lidhur në madhësinë e rafte tuaj.
Ose ju mund të ketë rafte tuaj të pakufizuar,
por në qoftë se ju jeni duke bërë një grup, që do të thotë se çdo herë të vetme që ju goditi 10 elemente,
atëherë ju jeni do të duhet të rritet në 20 elementeve, dhe kur ju goditi 20 elemente,
ju jeni do të duhet të rritet tuaj për rrjet të 30 elementeve ose 40 elemente.
Ju do të jeni nevojë për të rritur kapacitetin, e cila është ajo që ne jemi duke shkuar për të bërë këtu.
Çdo herë të vetme kemi arritur madhësinë maksimale të rafte tonë,
kur ne shtytje diçka tjetër me radhë, ne do të duhet për të rritur kapacitetin.
Këtu, ne kemi deklaruar si shtytje shtytje bool (char * rr).
Str char * është vargu që ne jemi duke kërkuar mbi rafte,
bool dhe vetëm thotë se ne kemi pasur sukses apo ka dështuar.
>> Si mund të dështojnë?
Çfarë është rrethanë e vetme që ju mund të mendoni
ku ne do të duhet të kthehen rreme?
Po.
[Student] Nëse është e plotë dhe ne jemi duke përdorur një zbatim të kufizohet.
Yeah, kështu që si mund të përcaktojë, ai u përgjigj
nëse është e plotë dhe ne jemi duke përdorur një zbatim të kufizohet.
Pastaj ne patjetër do të kthehen rreme.
Sa më shpejt që ne e goditi 10 gjërat në grup, ne nuk mund të përshtatet 11, kështu që ne të kthehen rreme.
Çfarë nëse ajo është e pakufizuar? Po.
Nëse ju nuk mund të zgjerohet rrjet për disa arsye.
Yeah, kështu që kujtesa është një burim i kufizuar,
dhe përfundimisht, në qoftë se ne të mbajtur gjërat shtyjnë mbi rafte pa pushim,
ne jemi duke shkuar për të përpiqen dhe të ndajë një koleksion të madh të përshtaten
kapaciteti më i madh, dhe malloc apo çfarëdo që ne jemi duke përdorur do të kthehet rreme.
E pra, malloc do të kthehen null.
>> Mos harroni, çdo herë të vetme thirrur ju kurrë malloc, ju duhet të kontrolluar për të parë nëse ajo
kthen null ose tjetër që është një zbritje korrektësia.
Që nga viti ne duam të kemi një pirg i pakufizuar,
rasti i vetëm që ne jemi duke shkuar për të kthyer rreme është nëse ne përpiqemi të
rritjen e kapacitetit dhe malloc ose çfarëdo kthehet rreme.
Pastaj pop merr asnjë argumente,
dhe ajo kthen vargun që është në krye të rafte.
Çfarëdo që është më së fundi shtyrë në rafte është ajo që pop është kthyer,
dhe ajo gjithashtu heq atë nga rafte.
Dhe vini re se ajo kthehet null nëse nuk ka asgjë në rafte.
Ajo është gjithmonë e mundur që rafte është bosh.
Në Java, nëse ju jeni duke përdorur për këtë, apo të gjuhëve të tjera,
duke u përpjekur për të pop nga një pirg të zbrazët mund të shkaktojë një përjashtim apo diçka.
>> Por në C, null është lloj i një shumë prej rasteve se si kemi trajtuar këto probleme.
Kthyer null është se si ne jemi duke shkuar për të ditur se rafte ishte bosh.
Ne kemi dhënë kodin që do të testojë funksionalitetin rafte tuaj,
zbatuar shtytje dhe pop.
Kjo nuk do të jetë një shumë të kodit.
Unë do-fakt, para se të bëjmë këtë, hint, hint-
në qoftë se ju nuk e keni parë atë, malloc nuk është funksion i vetëm
që ndan kujtesës në grumbull për ju.
Nuk janë një familje e funksioneve shenjat e.
E para është malloc, të cilat ju jeni duke përdorur për të.
Pastaj ka calloc, e cila e bën të njëjtën gjë si malloc,
por ajo do të zero gjithçka për ju.
Nëse ju keni kërkuar ndonjëherë për të vendosur gjithçka null pas mallocing diçka
ju duhet të keni përdorur vetëm calloc në vendin e parë në vend e të shkruarit
një për lak në zero nga bllok të tërë të kujtesës.
>> Realloc është si malloc dhe ka një shumë të raste të veçanta,
por në thelb ajo që bën është realloc
ajo merr një tregues se tashmë ishte ndarë.
Realloc është funksion që ju duan të jenë të paguar vëmendje këtu.
Ajo merr një tregues që tashmë ishte kthyer nga malloc.
Le të thonë se ju të kërkojë nga malloc një tregues prej 10 bytes.
Pastaj më vonë ti e kupton që ju të kërkuar 20 bytes,
kështu që ju telefononi realloc në atë treguesin me 20 bytes,
realloc dhe automatikisht do të kopjoni mbi çdo gjë për ju.
Nëse ju vetëm e quajti malloc përsëri, si unë kam një bllok prej 10 bytes.
Tani kam nevojë për një bllok prej 20 bytes,
kështu që nëse unë malloc 20 bytes, atëherë unë kam në dorë kopje Gjatë 10 bytes nga gjëja e parë
në gjë të dytë dhe pastaj të lirë gjëja e parë.
Realloc që do të merret për ju.
>> Njoftim nënshkrimi do të jetë e pavlefshme *,
e cila është vetëm një tregues kthyer në bllokun e kujtesës,
pastaj pavlefshme * ptr.
Ju mund të mendoni * void si një tregues gjenerike.
Në përgjithësi, ju kurrë nuk merren me * void,
por malloc po kthehet një * void, dhe pastaj ajo është përdorur vetëm si
kjo është në të vërtetë do të jetë një char *.
E * void mëparshme që ishin kthyer nga malloc
tani do të jetë për të kaluar realloc, dhe pastaj madhësia
është numri i ri i bytes ju doni të caktojë, kështu që kapaciteti i juaj i ri.
Unë do të ju jap disa minuta, dhe të bëjë atë në hapësirën tonë.
Filloni me Revision 1.
Unë do t'ju ndalojë, pasi shpresë rreth kohë të mjaftueshme për të zbatuar shtytje,
dhe pastaj unë do të ju jap një pushim për të bërë pop.
Por me të vërtetë nuk është se kodi shumë në të gjitha.
Kodi është ndoshta më e stuff zgjeruar, zgjeruar kapacitetin.
Mirë, nuk ka presion për t'u bërë plotësisht,
por për aq kohë sa ju të ndjeni sikur ju jeni në rrugën e drejtë, kjo është e mirë.
>> A ka dikush ndonjë kod ata ndjehen rehat me mua tërhequr lart?
Po, unë do të, por ka njeri të ketë ndonjë kod unë mund të tërheqë deri?
Mirë, ju mund të fillojë, për të shpëtuar atë, çfarëdo qoftë ajo është?
Unë gjithmonë harrojmë atë hap.
Mirë, në kërkim në shtytje,
nuk ju duan të shpjegojë kodin tuaj?
[Student] Para së gjithash, unë u rrit madhësinë.
I guess ndoshta unë duhet të ketë se-gjithsesi, kam rritur madhësinë,
dhe unë të shohim nëse ajo është më pak se sa kapacitetin.
Dhe në qoftë se ajo është më pak se kapaciteti, shtoj në grup që ne tashmë kemi.
Dhe në qoftë se kjo nuk është, unë shumohen kapacitet prej 2,
dhe unë rirezervoj array strings për diçka me një madhësi më të madhe të kapaciteteve tani.
Dhe pastaj, nëse kjo dështon, unë them përdorues dhe kthimit të rreme,
dhe në qoftë se kjo është në rregull, atëherë unë vënë string në vend të ri.
>> [Rob B.] Gjithashtu vini re se ne kemi përdorur një operator bukur bitwise këtu
të shumohen nga 2.
Mos harroni, zhvendosje majtas është gjithmonë do të shumëzohet me 2.
Zhvendosja e drejtë është e ndarë nga 2 për aq kohë sa ju të mbani mend se kjo do të thotë
ndani me 2 në një numër të plotë të ndarë me 2.
Kjo mund të shkurtoj një 1 këtu apo atje.
Por ndryshim lënë nga 1 është gjithmonë do të shumëzohen me 2,
nëse del nga shtrati kufijtë e numër të plotë, dhe atëherë ajo nuk do të jetë.
Një koment anë.
Më pëlqen të bëj-kjo nuk do të ndryshojë coding çdo mënyrë çdo gjë,
por unë doja të bëjë diçka si kjo.
Ajo në fakt është duke shkuar për ta bërë atë pak më të gjatë.
Ndoshta kjo nuk është rasti i përsosur për të treguar këtë,
por unë doja të segmentit atë në këto blloqe të-
rregull, nëse kjo nëse ndodh, atëherë unë jam duke shkuar për të bërë diçka,
dhe pastaj funksioni është bërë.
Unë nuk kam nevojë për të pastaj lëvizni sytë e mi të gjithë rrugën poshtë funksionit
për të parë se çfarë ndodh pas tjetër.
Kjo është nëse kjo ndodh, nëse, atëherë unë vetëm të kthehet.
Ajo gjithashtu ka shtuar dobi të bukur çdo gjë përtej kësaj
është zhvendosur tani lënë një herë.
Unë nuk duhet të-nëse ndonjëherë pranë qesharake linjave të gjata,
pastaj ato 4 bytes mund të ndihmojë, dhe gjithashtu diçka më të majtë është,
më pak të tronditur të ndiheni, nëse pëlqen-rregull, unë kam për të kujtuar
Unë jam aktualisht në një lak, ndërsa në brendësi të një tjetër brenda e një për lak.
Kudo që ju mund ta bëni këtë menjëherë kthimin, unë lloj i si.
Kjo është krejtësisht fakultative dhe nuk pritet që në asnjë mënyrë.
>> [Student] A duhet të ketë një madhësi - në gjendje të dështojnë?
Gjendja dështojnë këtu është që ne nuk realloc, kështu që po.
Vini re se si në gjendje të dështojnë, me sa duket,
nëse ne sende të lirë më vonë, ne jemi gjithmonë do të dështojë
nuk ka rëndësi se sa herë që ne të përpiqemi për të shtyrë diçka.
Nëse ne vazhdojmë të shtyjnë, ne kemi mbajtur madhësinë e bën rritjen,
edhe pse ne nuk jemi vënë asgjë mbi rafte.
Zakonisht ne nuk rritje madhësinë deri
pasi ne kemi sukses vënë atë në rafte.
Ne do të bëjmë atë, të themi, qoftë këtu dhe këtu.
Dhe pastaj në vend të thënë s.size ≤ kapacitet, kjo është më pak se kapaciteteve,
vetëm për shkak se ne kemi lëvizur ku çdo gjë ishte.
>> Dhe mbani mend, vendin e vetëm që ne ndoshta mund të kthehet të rreme
është këtu, ku realloc kthye null,
dhe në qoftë se ju ndodh që të mbani mend gabim standarde,
ndoshta ju mund të konsideroni këtë një rast ku ju doni të printoni një gabim standarde,
Printf kështu fprintf në vend të vetëm direkt në shtypjen jashtë standardit.
Përsëri, kjo nuk është një pritje, por në qoftë se ajo është një gabim,
printf shkruani, atëherë ju mund të dëshironi të bëni të shtypura të gabimit standarde në vend e jashtë standardit.
>> Çdokush keni ndonjë gjë tjetër për të konstatojmë? Po.
[Student] Mund të ju shkoni mbi [e padëgjueshme]?
[Rob B.] Po, binariness aktual i saj ose vetëm çfarë është ajo?
[Student] Kështu që ju të shumohen atë me 2?
[Rob B.] Po, në thelb.
Në vendin binar, ne gjithmonë kemi vendosur tonë të shifrave.
Zhvendosja Kjo la nga 1 thelb fut atë këtu në anën e djathtë.
Mbrapsht në këtë, vetëm duke kujtuar se gjithçka në binar
është një energji e 2, kështu që kjo përfaqëson 2 me 0,
kjo 2 në 1, kjo 2 në 2.
Duke futur një 0 në anën e djathtë tani, ne vetëm zhvendoset gjithçka gjatë.
Atë që përdoret për të jetë 2 në 0 është tani 2 me 1, është 2 në 2.
Ana e drejtë që ne të futur
është domosdoshmërisht do të jetë 0,
gjë që e bën kuptim.
Nëse ndonjëherë të shumohen një numër me 2, kjo nuk do të përfundojë deri çuditshme,
kështu në vendin e 2 0 duhet të jetë 0,
dhe kjo është ajo që unë gjysma paralajmëroi për para është nëse ju do të ndodhë të zhvendoset
përtej numrin e bit në një numër të plotë,
atëherë kjo është 1 do të përfundojnë duke shkuar jashtë.
Kjo është e vetmja merak nëse ju ndodh që të merret me kapacitete të vërtetë të mëdha.
Por në këtë pikë, atëherë ju jeni që kanë të bëjnë me një grup të miliarda gjërave,
të cilat nuk mund të përshtaten në kujtesën anyway.
>> Tani ne mund të merrni për të pop, e cila është edhe më e lehtë.
Ju mund të bëni atë si në qoftë se ju ndodh që të pop një bandë e tërë,
dhe tani ju jeni në gjysmë kapacitet përsëri.
Ju mund të tkurret realloc sasinë e kujtesës keni,
por ju nuk duhet të shqetësohen për këtë, kështu që rasti i vetëm realloc do të jetë
rritje kujtesës, kurrë pakësuar kujtesës,
e cila do të bëjë super pop lehtë.
Tani rradhë, të cilat do të jetë si oxhaqet,
por me qëllim që ju të merrni gjërat jashtë është i kundërt.
Shembulli i një prototipike radhë është një linjë,
kështu që unë mendoj në qoftë se keni qenë Anglisht, unë do të kisha thënë
një shembull prototipike i një radhë është një radhë.
Pra, si një linjë, në qoftë se ju jeni personi i parë në linjë,
ju presim të jetë personi i parë nga linjë.
Nëse ju jeni personi i fundit në rresht, ju do të jetë personi i fundit shërbim.
Ne e quajmë atë model FIFO, ndërsa rafte ishte model LIFO.
Këto fjalë janë goxha universale.
>> Ashtu si oxhaqet dhe ndryshe vargjeve, rradhë në mënyrë tipike nuk do të lejojë qasje në elementet në mes.
Këtu, një pirg, ne kemi shtytje dhe pop.
Këtu, ne të ndodhë të ketë thirrje atyre enqueue dhe dequeue.
Unë kam dëgjuar gjithashtu ato të quhet ndryshim dhe unshift.
Unë kam dëgjuar njerëz që thonë shtytje dhe pop që gjithashtu zbatohet për radhët e gjata.
Unë kam dëgjuar insert, hequr,
kështu që të shtyjë dhe pop, nëse ju jeni duke folur në lidhje me oxhaqet, ju jeni duke kërkuar dhe popping.
Nëse ju jeni duke folur në lidhje me radhët e gjata, ju mund të marr fjalët që ju doni të përdorni
për futje dhe heqjen, dhe nuk ka konsensus mbi atë që duhet të quhet.
Por këtu, ne kemi enqueue dhe dequeue.
Tani, struct duket pothuajse identik me struct rafte.
Por ne duhet të mbajnë gjurmët e kokës.
I guess ajo thotë se këtu poshtë, por pse nuk kemi nevojë për kokë?
Prototipa janë në thelb të njëjta për të nxitur dhe pop.
Ju mund të mendoni për atë si shtytje dhe pop.
Dallimi i vetëm është pop po kthehet-në vend të fundit, është kthyer parë.
2, 1, 3, 4, ose diçka.
Dhe këtu është fillimi.
Queue jonë është plotësisht e plotë, kështu që nuk ka katër elemente në të.
Fundi i radhës tonë është aktualisht 2,
dhe tani ne do të shkojmë për të futur diçka tjetër.
>> Kur ne duam të futur atë diçka tjetër, ajo që ne e bëmë për versionin rafte
është zgjeruar ne bllok tonë të kujtesës.
Cili është problemi me këtë?
[Student] Ju lëvizë 2.
Çfarë kam thënë më parë për fund të rreshtit,
kjo nuk ka kuptim që ne të fillojë në 1,
atëherë ne duam të dequeue 1, atëherë dequeue 3, pastaj dequeue 4,
pastaj dequeue 2, pastaj dequeue këtë.
Ne nuk mund të përdorë realloc tani,
ose në shumë pak, ju duhet të përdorni realloc në një mënyrë të ndryshme.
Por ju ndoshta nuk duhet të përdorni vetëm realloc.
Ju do të keni në dorë kopje kujtesën tuaj.
>> Ka dy funksione të kopje kujtesës.
Ka memcopy dhe memmove.
Unë jam duke lexuar faqet e njeri për të parë që ju jeni do të dëshironi të përdorni.
Mirë, memcopy, dallimi është
se memcopy dhe memmove, një trajton çështjen saktë
ku ju jeni kopjimit në një rajon që ndodh të përputhen rajonin
ju jeni kopjimit nga.
Memcopy nuk trajtojë atë. Memmove bën.
Ju mund të mendoj për këtë problem, si-
le të thonë se unë dua të kopjoni këtë djalë,
këto katër deri në këtë djalë mbi.
Në fund, çfarë array duhet të duken si
pas kopje është 2, 1, 2, 1, 3, 4, dhe pastaj disa sende në fund.
Por kjo është e varur në mënyrë në të cilën ne fakt kopje,
që nëse ne nuk e konsiderojmë faktin se rajoni ne jemi kopjimit në
përputhet një ne jemi duke kopjuar nga,
atëherë ne mund të bëjmë si fillim këtu, kopje 2 në vendin ne duam të shkojnë,
më pas të shkojë pointers tonë përpara.
>> Tani ne do të jetë këtu dhe këtu, dhe tani ne duam të kopjoni
ky djalë mbi këtë djalë dhe për të shkuar përpara pointers tona.
Çfarë ne jeni do të përfundojë deri në marrjen është 2, 1, 2, 1, 2, 1
në vend të 2 përshtatshme, 1, 2, 1, 3, 4 sepse
2, 1 overrode e 3 origjinale, 4.
Memmove trajton se si duhet.
Në këtë rast, në thelb vetëm të përdorni përherë memmove
sepse ajo trajton atë të saktë.
Ajo në përgjithësi nuk ka kryer ndonjë e keqe.
Ideja është në vend të filluar nga fillimi dhe kopjim në këtë mënyrë
si ne vetëm e bëri këtu, fillon nga fundi dhe kopjon në,
dhe në këtë rast, ju kurrë nuk mund të ketë një problem.
Nuk ka performanca e humbur.
Gjithmonë përdorni memmove. Asnjëherë mos u shqetësoni për memcopy.
Dhe kjo është ajo ku ju jeni do të duhet të vete memmove
the-rreth përfundoi pjesa e radhës tuaj.
Nuk shqetësohet nëse nuk bëhet plotësisht.
Kjo është më e vështirë se rafte, shtytje, dhe pop.
>> Çdokush keni ndonjë kod ne mund të punojnë me të?
Edhe nëse krejtësisht paplotë?
[Student] Yeah, kjo është plotësisht e plotë, pse.
Plotësisht të paplota është e mirë për aq kohë sa ne mund të ju kursejnë-revizioni?
Kam harruar se çdo herë të vetme.
Rregull, duke injoruar çfarë ndodh kur ne kemi nevojë për të resize gjëra.
Injorojë krejtësisht Resize.
Shpjegoni këtë kod.
Unë jam duke kontrolluar para së gjithash nëse madhësia është më pak se kopjen e parë të të gjitha
dhe pastaj pas kësaj, kam futur-unë të marrë kokën + madhësi,
dhe unë sigurohuni që ajo përfundon rreth kapacitetit të grup,
dhe unë futur varg të ri në atë pozitë.
Pastaj unë të rritur madhësinë dhe kthimin e vërtetë.
>> [Rob B.] Kjo është pa dyshim një nga ato raste ku ju jeni do të duan të jenë duke përdorur mod.
Çdo lloj i rastit kur ju kanë dhënë rreth, në qoftë se ju mendoni mbështjellës rreth,
Mendimi i menjëhershëm duhet të jetë mod.
Si një optimizim të shpejtë / të bërë një tuaj kod linjë të shkurtër,
vini re se të vijë menjëherë pas kësaj një
është vetëm madhësia + +, kështu që ju shkrihen se në këtë linjë, madhësia + +.
Tani këtu poshtë, ne kemi rastin
ku ne nuk kemi kujtesë të mjaftueshme,
kështu që ne jemi rritur kapacitetin tonë nga 2.
I guess ju mund të ketë të njëjtin problem këtu, por ne mund të injorojë atë tani,
ku në qoftë se ju nuk arriti të rritur kapacitetin tuaj,
atëherë ju jeni do të duan për të ulur kapacitetin tuaj nga 2 përsëri.
Një tjetër shënim të shkurtër është vetëm si ju mund të bëni + =,
ju gjithashtu mund të bëjë << =.
Pothuajse çdo gjë mund të shkoni përpara se të barabartë, + =, | =, = &, << =.
Char * ri është bllok tonë të ri të memories.
Oh, mbi këtu.
>> Çfarë mendojnë njerëzit në lidhje me llojin e bllokut tonë të re të kujtesës?
[Student] Ajo duhet të jetë ** char.
Duke menduar përsëri në struct tonë deri këtu,
strings është ajo që ne po rishpërndarjen.
Ne jemi duke bërë një ruajtje të tërë të re dinamike për të elementeve në radhë.
Ajo që ne jemi duke shkuar për të caktuar në vargjet tuaja është ajo që ne jemi mallocing tani,
dhe aq e re do të jetë një char **.
Ajo do të jetë një grup i strings.
Atëherë çfarë është rasti me të cilin ne do të kthehen të rreme?
[Student] Duhet të jemi të bërë char *?
[Rob B.] Po, thirrje mirë.
[Student] Çfarë ishte kjo?
[Rob B.] Ne kemi kërkuar të bëjmë madhësinë e * char, sepse ne nuk jemi më-
kjo në fakt do të jetë një problem shumë i madh, sepse sizeof (char) do të jetë 1.
Sizeof * char do të jetë 4,
kështu që një shumë e kohës kur ju jeni që kanë të bëjnë me ints,
ju kanë tendencë për të marrë larg me të, sepse madhësia e int dhe madhësia e int *
në një sistem të 32-bit do të jetë e njëjta gjë.
Por këtu, sizeof (char) dhe sizeof (char *) janë tani do të jetë e njëjta gjë.
>> Çfarë është rrethanë ku ne kthimit të rreme?
[Student] Re është i pavlefshëm.
Po, në qoftë se i ri është i pavlefshëm, do të kthehemi të rreme,
dhe unë jam duke shkuar për të hedhur poshtë këtu-
[Student] [padëgjueshme]
[Rob B.] Po, kjo është e mirë.
Ju mund ta bëni 2 herë kapacitetin ose zhvendosje e kapaciteteve 1 dhe pastaj vetëm vënë atë poshtë këtu ose çfarëdo.
Ne do të bëjmë atë si të kemi pasur atë.
Kapaciteti >> = 1.
Dhe ju kurrë nuk jeni do të ketë për t'u shqetësuar rreth humbjes së vendin e 1
sepse jeni larguar nga zhvendos me 1, në mënyrë që vendi i 1 është domosdoshmërisht një 0,
në mënyrë të drejtë zhvendosur me 1, ju jeni ende do të jetë mirë.
[Student] A ju duhet të bëni që para kthimit?
[Rob B.] Po, kjo e bën absolutisht asnjë kuptim.
>> Tani supozojmë ne do të përfundojë deri në kthimin e vërtetë deri në fund.
Mënyrën se si ne jemi duke shkuar për të bërë këto memmoves,
ne duhet të jenë të kujdesshëm me atë se si të bëjmë ato.
A ka dikush ndonjë sugjerime për mënyrën se si të bëjmë ato?
Këtu është fillimi tonë.
Në mënyrë të pashmangshme, ne duam të fillojë në fillim përsëri
dhe gjërat kopje në nga atje, 1, 3, 4, 2.
Si do të bëni këtë?
Së pari, unë duhet të shikoni në faqen e njeriut për memmove përsëri.
Memmove, rendi i argumenteve është gjithmonë e rëndësishme.
Ne duam destinacionin tonë të parë, të dytë burimi, madhësia e tretë.
Nuk janë një shumë e funksioneve të cilat kundërt burim dhe destinacion.
, Destinacioni burimi tenton të jenë në përputhje disi.
Leviz, çfarë është ajo kthehet?
Ajo kthen një tregues për destinacion, për çfarëdo arsye ju mund të dëshironi që të.
Unë mund të foto lexuar atë, por ne duam të shkojmë në destinacionin tonë.
>> Çfarë është destinacioni ynë do të jetë?
[Student] Re.
[Rob B.] Po, dhe ku jemi kopjimi nga?
Gjëja e parë që ne jemi kopjimi është ky 1, 3, 4.
Çfarë është-kjo 1, 3, 4.
Cila është adresa e këtij 1?
Çfarë është adresa e se 1?
[Student] [padëgjueshme]
[Rob B.] Shef + adresën e elementit të parë.
Si mund të marrim elementin e parë në grup?
[Student] rreshtit.
[Rob B.] Po, q.strings.
Mos harroni, këtu, kreu ynë është 1.
Mallkuar atë. Unë thjesht mendoj se është magjike-
Këtu, kreu ynë është 1. Unë jam duke shkuar për të ndryshuar ngjyrën time too.
Dhe këtu është strings.
Këtë, ne mund ta shkruajë atë siç bëmë gjatë këtu
me kokat + q.strings.
Shumë njerëz gjithashtu shkruajnë atë dhe q.strings [kreu].
Kjo nuk është me të vërtetë më pak efikase.
Ju mund të mendoni për atë si ju jeni dereferencing atë dhe pastaj të marrë adresën e,
por përpiluesit do të përkthejnë atë në atë që ne kishim para gjithsesi, q.strings + kokë.
Ose mënyrë ju doni të mendoni për atë.
>> Dhe sa bytes duam të kopje?
[Student] Kapaciteti - kokë.
Kapaciteti - kokë.
Dhe atëherë ju gjithmonë mund të shkruani nga një shembull
të kuptoj se në qoftë se është e drejtë.
[Student] Ajo duhet të jetë ndarë nga 2 pastaj.
Yeah, kështu që unë mendoj se ne mund të përdorni size.
Ne ende kemi madhësinë e qenit-
duke përdorur madhësinë, ne kemi madhësi të barabartë me 4.
Madhësia e jonë është 4. Kreu jonë është 1.
Ne duam të kopjoni këto 3 elemente.
Kjo është mendje e shëndoshë kontrolloni se madhësia - kreu 3 saktë.
Dhe të vijnë këtu, si e thamë më përpara,
nëse kemi përdorur kapacitetin, atëherë ne do të duhet të ndajnë nga 2
sepse ne kemi rritur tashmë kapacitetet tona, kështu që në vend të kësaj, ne jemi duke shkuar për të përdorur madhësinë.
Se kopjet që pjesa.
Tani, ne kemi nevojë të kopjoni pjesën tjetër, pjesa që ka mbetur nga fillimi.
>> Kjo do të memmove në çfarë pozicioni?
[Student] Madhësia Plus - kokë.
Po, kështu që ne kemi kopjuar tashmë në madhësi - bytes kokë,
dhe kështu kur ne duam të kopjoni bytes mbetura është e re
dhe pastaj madhësia minus-edhe, numri i bajt ne kemi kopjuar tashmë in
Dhe pastaj ku jemi ne nga kopjimi?
[Student] Q.strings [0].
[Rob B.] Po, q.strings.
Ne mund ta bëni dhe q.strings [0].
Kjo është dukshëm më pak e zakonshme se kjo.
Në qoftë se ajo është vetëm do të jetë 0, atëherë ju do të priren për të parë q.strings.
Kjo është ajo ku ne jemi duke kopjuar nga.
Sa bytes nuk kemi lënë të kopjoni? >> [Student] 10.
Drejtë.
[Student] A kemi të shumohen 5-10 herë madhësia e bytes apo diçka?
Yeah, kështu që kjo është ajo ku-çfarë saktësisht jemi kopjimi?
[Student] [padëgjueshme]
Cili është lloji i gjë që ne jemi kopjimit?
[Student] [padëgjueshme]
Yeah, kështu që s * char që ne jemi duke kopjuar, ne nuk e dimë se ku ata vijnë nga.
E pra, ku ata janë treguar, si vargjet, deri ne fund shtyjnë atë mbi radhë
ose enqueuing mbi radhë.
Ku ata vijnë nga, ne nuk kemi ide.
Ne vetëm duhet të mbajnë gjurmët e S * char vetë.
Ne nuk duam të kopjoni size - bytes kokë.
Ne duam të kopjoni size - Kreu char * s,
kështu që ne jemi duke shkuar për të shumëfishohen këtë duke sizeof (char *).
Same këtu poshtë, kreu * sizeof (char *).
>> [Student] Po [padëgjueshme]?
Kjo e drejtë këtu?
[Student] Jo, më poshtë se, madhësia - kokë.
[Rob B.] Kjo e drejtë këtu?
Aritmetike pointer.
Si aritmetike tregues është duke shkuar për të punuar është
ajo automatikisht shumëfishon nga madhësia e llojit që ne jemi që kanë të bëjnë me të.
Ashtu si gjatë këtu, i ri + (madhësia - kreu)
është pikërisht ekuivalente me & ri [size] - Kreu
derisa ne presim që të punojmë si duhet,
që nëse ne jemi që kanë të bëjnë me një grup int, atëherë ne nuk indeks nga int-
ose në qoftë se ajo është e madhësisë prej 5 dhe ju doni elementin 4, atëherë ne indeksi në të
int array [4].
Ju don 't-[4] * Madhësia e int.
Që trajton atë automatikisht, dhe ky rast
është fjalë për fjalë ekuivalente, kështu sintaksa kllapa
është vetëm do të konvertohet për këtë sa më shpejt që ju të përpilojnë.
Kjo është diçka që ju duhet të jenë të kujdesshëm që
kur ju jeni duke shtuar madhësinë - Kreu
ju jeni duke shtuar jo një bajt.
Ju jeni duke shtuar një * char, e cila mund të jetë një ose çfarëdo bytes.
>> Pyetje të tjera?
Mirë, dequeue do të jetë më e lehtë.
Unë do të ju jap një minutë për të zbatuar.
Oh, dhe unë mendoj se kjo është e njëjta situatë, ku
atë rast enqueue, në qoftë se ne jemi enqueuing null,
ndoshta ne duam për të trajtuar atë, ndoshta ne nuk bëjmë.
Ne nuk do të bëjë atë përsëri këtu, por njëjtë si rastin tonë rafte.
Nëse ne enqueue null, ne mund të dëshironi të shpërfillin atë.
Çdokush kanë një kod që unë mund të tërheqë deri?
[Student] Unë vetëm duhet dequeue.
Versioni 2-është se në rregull.
Ju dëshironi të shpjegojë?
[Student] Së pari, ju me siguri ka diçka në radhë
dhe se madhësia është duke shkuar poshtë nga 1.
Ju duhet për të bërë këtë, dhe pastaj ju kthehen kokën
dhe pastaj të lëvizë kokën lart 1.
Mirë, kështu që nuk është një rast qoshe ne duhet të marrin në konsideratë. Po.
[Student] Nëse kreu i juaj është në elementin e fundit,
atëherë ju nuk doni të tregojnë kreu jashtë array.
>> Yeah, kështu që sa më shpejt që kreu godet fundin e array tonë,
kur ne dequeue, kreu ynë duhet të kthehet në modded 0.
Për fat të keq, ne nuk mund të bëjmë që në një hap.
I guess mënyrë unë ndoshta do të rregullohet kjo është
kjo do të jetë një * char, ajo që ne po kthehej,
çfarëdo emri yt do të jetë i ndryshueshëm.
Atëherë ne duam të mod kokën nga kapaciteti ynë
dhe pastaj kthehen ret.
Shumë njerëz këtu ata mund të bëjnë,
ky është rasti i-you'll shihni njerëz bëni nëse kreu
është më i madh se kapaciteti, të bëjë kokë - kapacitet.
Dhe kjo është vetëm duke punuar rreth asaj që mod është.
Kreu mod = kapaciteti është shumë më e pastër
i një mbështjellës rreth se në qoftë se koka e madhe se koka e kapaciteteve - kapaciteteve.
>> Pyetje?
Mirë, gjëja e fundit që kemi lënë është lista jonë e lidhur.
Ju mund të përdoren për të disa nga sjelljet lista lidhur në qoftë se ju e bëri
të lidhura listat në tavolinat tuaja hash, në qoftë se keni kryer një tabelë hash.
Unë fuqimisht rekomandoj duke bërë një tabelë hash.
Ju mund të keni bërë tashmë një trie,
por përpiqet janë më të vështira.
Në teori, ata janë asymptotically mirë.
Por vetëm shikoni në bordin e madhe,
dhe përpiqet të bëjë më mirë kurrë, dhe ata të marrin më shumë memorie.
Gjithçka rreth përpiqet përfundon duke qenë më keq për punën e më shumë.
Kjo është ajo që zgjidhja David Malan-së gjithmonë është
është ai gjithmonë postime zgjidhjen e tij trie, dhe le të shohim ku ai aktualisht është.
Cili ishte ai nën, David J?
Ai është # 18, kështu që nuk është tmerrësisht e keqe,
dhe kjo do të jetë një e mirë përpiqet që ju mund të mendoni
ose një nga të mirë përpiqet i një trie.
A nuk është edhe zgjidhja e tij origjinale?
Unë ndjehem si zgjidhje trie priren të jenë më shumë në këtë varg e përdorimit RAM.
>> Shko poshtë për të shumë të lartë, dhe përdorimi RAM është në shifra të vetme.
Shko poshtë në drejtim të poshtme, dhe pastaj ju filloni duke parë përpiqet
ku mund të merrni përdorimin absolutisht masiv RAM,
dhe përpiqet janë më të vështira.
Jo tërësisht ia vlen, por një përvojë arsimore në qoftë se ju e bëri një të tillë.
Gjëja e fundit është lista jonë lidhur,
dhe këto tri gjëra, oxhaqet, Radhët, dhe listat lidhura,
ndonjë gjë të ardhmen ju kurrë bëni në shkenca kompjuterike
do të supozojmë që ju keni familjaritet me këto gjëra.
Ata janë vetëm në mënyrë themelore për çdo gjë.
>> Të lidhura listat, dhe këtu ne kemi një listë të lidhura veçmas do të jetë zbatimi tonë.
Çfarë do të thotë të lidhura veçmas në krahasim me lidhur dyfish? Po.
[Student] Ajo vetëm vë në treguesin e ardhshëm sesa për pointers,
si ai i parapriu atë dhe njëri pas saj.
Yeah, kështu që në format foto, çfarë nuk kam vetëm të bëj?
Unë kam dy gjëra. Unë kam foto dhe foto.
Në format foto, veçmas listat tona të lidhura,
në mënyrë të pashmangshme, ne kemi disa lloj treguesin në krye të listës sonë,
dhe pastaj brenda listën tonë, ne vetëm duhet pointers,
dhe ndoshta kjo pikë të pavlefshëm.
Ajo do të jetë vizatimi juaj tipike e një listë veçmas lidhur.
Një listë e lidhur dyfish, ju mund të shkoni prapa.
Nëse unë ju jap ndonjë nyje në listë, atëherë ju mund të merrni për të domosdoshmërisht
çdo nyje të tjera në listën e në qoftë se ajo është një listë e lidhur dyfish.
Por në qoftë se unë të marrë ju nyja e tretë në listë dhe kjo është një listë e lidhur në formë individuale,
asnjë mënyrë ju jeni ndonjëherë do të merrni në nyjet e parë dhe të dytë.
Dhe nuk ka përfitime dhe detriments, dhe një e qartë
është që ju të marrë madhësinë e më shumë, dhe ju duhet të mbajnë gjurmët e ku këto gjëra janë treguar tani.
Por ne vetëm intereson lidhur veçmas.
>> Një disa gjëra ne do të duhet të zbatojnë.
Nyja typedef tuaj struct, int: struct * nyja tjetër; nyje.
Kjo typedef duhet të digjet në mendjet tuaja.
Quiz 1 duhet të jetë si të japë një typedef i një nyje lista lidhur,
dhe ju duhet të jetë në gjendje që menjëherë të shkarravitje se poshtë
edhe pa menduar për të.
I guess një pyetje çift, pse nuk kemi nevojë struct këtu?
Pse nuk mund të themi * nyje?
[Student] [padëgjueshme]
Po.
E vetmja gjë që përcakton një nyje si një gjë
është typedef vetë.
Por si të kësaj pike, kur ne jemi lloj i parsing përmes këtij përkufizimi nyjeve struct,
ne nuk kemi mbaruar typedef tonë ende, kështu që pasi typedef nuk ka përfunduar,
nyje nuk ekziston.
Por struct nyjen e bën, dhe kjo nyje në këtu,
kjo mund të quhet asgjë tjetër.
Kjo mund të quhet n.
Kjo mund të quhet nyje lidhur listë.
Kjo mund të quhet asgjë.
Por kjo nyje struct duhet të quhet njëjtën gjë si kjo nyje struct.
Çfarë ju telefononi kjo duhet të jetë edhe këtu,
dhe kështu që edhe përgjigjet pikën e dytë të pyetjes
cila është arsyeja pse-shumë herë kur ju shihni structs dhe typedefs e structs,
ju do të shihni structs anonim ku ju do të shihni vetëm struct typedef,
Zbatimi i, fjalor struct, ose çfarëdo.
>> Pse ketu nuk kemi nevojë për të thënë nyje?
Pse nuk mund të jetë një struct anonim?
Është pothuajse e njëjta përgjigje.
[Student] Ju duhet të referohen në atë brenda struct.
Po, brenda struct, ju duhet të referohen struct vetë.
Nëse ju nuk japin struct një emër, në qoftë se ajo është një struct anonim, ju nuk mund të referoheni në të.
Dhe e fundit por jo më pak, këto duhet të jenë disi të drejtpërdrejtë,
dhe ata duhet të ju ndihmojë të kuptojnë nëse ju jeni duke shkruar këtë poshtë
se ju jeni duke bërë diçka të gabuar nëse këto llojet e gjërave nuk ka kuptim.
E fundit por jo më pak, pse e bën këtë duhet të jetë struct * nyje?
Pse nuk mund të jetë vetëm struct nyje e ardhshme?
[Student] Pointer në struct tjetër.
Kjo është ajo që ne duam të pashmangshme.
Pse nuk mund të jetë nyja struct e ardhshme?
Pse e bën atë duhet të jetë nyja struct * ardhshme? Po.
[Student] Është si një lak pafund.
Po.
[Student] Ajo do të jetë e gjitha në një.
Po, ashtu mendoj se si ne do të bëjmë madhësinë e apo diçka.
Madhësia e një struct është në thelb + ose - disa model këtu apo atje.
Kjo është në thelb do të jetë shuma e madhësive të gjërave në struct.
Kjo e drejtë këtu, pa ndryshuar asgjë, madhësia do të jetë e lehtë.
Madhësia e nyjeve struct do të jetë madhësia e përmasat i + e ardhshëm.
Madhësia e unë do të jetë 4. Madhësia e ardhshëm do të jetë 4.
Madhësia e nyjeve struct do të jetë 8.
Nëse ne nuk kemi *, të menduarit e sizeof,
atëherë sizeof (I) do të jetë 4.
Madhësia e nyjeve struct ardhshëm do të jetë madhësia e kam + madhësia e nyjes struct ardhshëm
+ Madhësia e përmasat i + e nyje struct ardhshëm.
Ajo do të jetë një recursion pafund e nyjeve.
Kjo është arsyeja pse kjo është se si gjërat duhet të jetë.
>> Përsëri, patjetër mësuar përmendësh se,
ose të paktën e kuptojnë atë të mjaftueshme që ju mund të jetë në gjendje të
Arsyeja përmes asaj që ajo duhet të duken si.
Gjërat që ne do të duan për të zbatuar.
Nëse gjatësia e listës-
ju mund të mashtrojnë dhe për të mbajtur rreth një
Gjatësia globale apo diçka, por ne nuk jemi duke shkuar për të bërë këtë.
Ne jemi duke shkuar për të numëruar gjatësinë e listës.
Ne kemi përmban, kështu që në thelb si një kërkim,
kështu që ne kemi një listë e lidhur e integers për të parë nëse kjo integer është në listën e lidhur.
Prepend do të futur në fillim të listës.
Append do të futur në fund.
Insert_sorted është duke shkuar për të futur në pozitën renditura në listë.
Lloj Insert_sorted e supozon se kurrë nuk keni përdorur prepend ose append në mënyra të këqija.
>> Insert_sorted kur ju jeni zbatimin insert_sorted-
le të thonë se ne kemi listën tonë lidhur.
Kjo është ajo që ajo aktualisht duket si, 2, 4, 5.
Unë dua të futur 3, aq sa kohë që lista e vetë është renditur tashmë,
është e lehtë për të gjetur se ku 3 takon.
Unë të fillojë në 2.
Mirë, 3 është më e madhe se 2, kështu që unë dua të do të mbajë.
Oh, 4 është shumë i madh, kështu që unë e di 3 do të shkojnë në mes të 2 dhe 4,
dhe unë kam për të rregulluar pointers dhe të gjitha që stuff.
Por nëse ne nuk përdorim rreptësisht insert_sorted,
si le të them vetëm unë prepend 6,
pastaj lista ime e lidhur do të bëhet kjo.
Ajo tani ka kuptim, kështu që për insert_sorted, ju mund vetëm të supozojmë
se lista është e renditur, edhe pse ekzistojnë operacione
cila mund të shkaktojë ajo nuk tek të renditura, dhe që është ajo.
Gjej nje dobishme insert-kështu që ata janë gjërat kryesore që ju jeni do të duhet të zbatojnë.
>> Tani për tani, të marrë një minutë për të bërë gjatësi dhe përmban,
dhe ata duhet të jenë relativisht të shpejtë.
Pranë mbylljes kohë, kështu që dikush të ketë asgjë për gjatësi ose përmban?
Ata do të jetë pothuajse identike.
[Student] Length.
Le të shohim, rishikim.
Rregull.
Ju dëshironi të shpjegojë?
[Student] Unë vetëm krijuar një nyje akrep dhe nisja atë për të parë, e cila është e ndryshueshme tonë globale,
dhe pastaj unë kontrolloni për të parë nëse ajo është i pavlefshëm kështu që unë nuk do të marrë një gabim dhe të kthehet seg 0 në qoftë se është rasti.
Përndryshe, unë loop përmes, mbajtja e brenda numër i plotë
sa herë kam arrihen elementin tjetër të listës
dhe në të njëjtën operacion rritjeje edhe qasje atë element aktuale,
dhe pastaj unë vazhdimisht të bëjë kontrolloni për të parë nëse ajo është null,
dhe në qoftë se është i pavlefshëm, atëherë ajo aborts dhe vetëm kthen numrin e elementeve kam arrihen.
>> [Rob B.] A ka dikush ndonjë koment për asgjë?
Kjo duket korrektësia gjobë mençur.
[Student] Unë nuk mendoj se ju duhet nyjen == null.
Yeah, kështu që nëse nyjen == 0 null kthimit.
Por nëse == nyjen null atëherë kjo-oh, nuk është një çështje e korrektësisë.
Ajo ishte vetëm ju jeni kthyer i, por kjo nuk është në fushëveprimin e drejtë tani.
Ju duhet vetëm int i, kështu që i = 0.
Por nëse nyjen është i pavlefshëm, atëherë unë ende do të jetë 0,
dhe ne jemi duke shkuar për kthim 0, kështu që ky rast është identik.
Një tjetër gjë e zakonshme është që të mbajë deklaratën e
nga brenda nyjen e për lak.
Ju mund të thoni-Oh, jo.
Le të mbani atë si kjo.
Unë ndoshta do të vënë int i = 0 këtu,
pastaj nyjen * nyja = e parë në këtu.
Dhe kjo është ndoshta si-marrjen e shpëtoj këtë tani.
Kjo ndoshta është se si unë do të kishte shkruar atë.
Ju gjithashtu mund të-shikuar atë si kjo.
Kjo për strukturën lak të drejtë këtu
duhet të jetë pothuajse si të natyrshme për ju si për int i = 0
i është më pak se gjatësia e grup i + +.
Nëse kjo është se si ju të iterate mbi një rrjet, kjo është se si ju iterate mbi një listë të lidhura.
>> Kjo duhet të jetë natyra e dytë në disa pika.
Me këtë në mendje, kjo do të jetë pothuajse e njëjta gjë.
Ju jeni do të duan të iterate mbi një listë të lidhura.
Nëse nyjen-Unë nuk kam asnjë ide se çfarë vlera quhet.
Nyja i.
Nëse vlera në atë nyje = i kthehet e vërtetë, dhe kjo është ajo.
Vini re se mënyra e vetme që ne ndonjëherë kthehen rreme
është nëse ne iterate mbi të gjithë listën lidhur dhe kurrë nuk kthehet e vërtetë,
kështu që kjo është ajo që e bën këtë.
Si një shënim anë, ne ndoshta nuk do të merrni për të append ose prepend.
>> Shënim të shpejtë e kaluar.
Nëse ju shikoni fjalen statike, kështu që le të themi statike int numërimin = 0,
atëherë ne bëjmë numërimin + +, ju mund të thelb mendojnë për atë si një variabël globale,
edhe pse unë vetëm tha se kjo nuk është se si ne jemi duke shkuar për të zbatuar gjatësi.
Unë jam duke bërë këtë këtu, dhe pastaj numërimin + +.
Çdo mënyrë ne mund të hyjë në një nyje në listën tonë i lidhur ne po bën rritjen numërimin tonë.
Pika e kjo është ajo që do të thotë fjalen statike.
Nëse unë vetëm e kishte numërimin int = 0 që do të jetë një rregullt ndryshueshme vjetër globale.
Çfarë do të thotë statike int akuzë është se ajo është një ndryshore globale për këtë skedar.
Është e pamundur për ndonjë dosje tjetër,
si mendoni pset 5, në qoftë se ju keni filluar.
Ju keni dy Shkruaj një fjalë, dhe ju keni dictionary.c,
dhe në qoftë se ju vetëm të deklarojë një gjë globale, atëherë asgjë në Shkruaj një fjalë
mund të arrihen në dictionary.c dhe anasjelltas.
Variablat globale janë të arritshme nga ndonjë skedar. C,
por variablat statike janë të arritshëm vetëm nga brenda file vetë,
kështu që brenda spell checker ose brenda dictionary.c,
kjo është lloj i si unë do të deklaroj ndryshueshme time për madhësinë e array tim
ose madhësia e numrit tim e fjalëve në fjalor.
Që unë nuk dua të deklarojë një ndryshore globale se çdokush ka qasje në,
Unë me të vërtetë vetëm kujdeset për atë për qëllime të mi.
>> Gjë e mirë për këtë është edhe tërë përplasja emri stuff.
Nëse disa fotografi të tjera të përpiqet për të përdorur një ndryshore globale quajtur akuzë, gjërat shkojnë shumë, shumë gabim,
kështu që kjo e mban gjëra të bukur të sigurt, dhe vetëm ju mund të hyni në atë,
dhe askush tjetër nuk mundet, dhe nëse dikush tjetër e deklaron një ndryshore globale quajtur akuzë,
atëherë ajo nuk do të ndërhyjë me ndryshore statike tuaj quajtur akuzë.
Kjo është ajo që është statike. Kjo është një ndryshore globale fotografi.
>> Pyetjet për asgjë?
Të vendosur të gjithë. Bye.
[CS50.TV]