[Powered by Google Translate] [6 §: vähemmän mukavaksi]
[Nate Hardison] [Harvardin yliopisto]
[Tämä on CS50.] [CS50.TV]
Selvä. Tervetuloa 6 §.
Tällä viikolla aiomme puhua tietorakenteita kohdassa,
pääasiassa koska tällä viikolla ongelman asetettu spellr
tekee koko joukko erilaisia ​​tietorakenteen etsintä.
On olemassa joukko erilaisia ​​tapoja voit mennä ongelman asetettu,
ja enemmän tietorakenteet tiedät, enemmän hienoja asioita voit tehdä.
>> Joten aloita. Ensin aiomme puhua pinoja,
pino ja jono tietorakenteita että aiomme puhua.
Pinot ja jonot ovat todella hyödyllisiä, kun alamme puhua kuvaajia,
joita emme aio tehdä niin paljon juuri nyt.
Mutta he todella hyvä ymmärtää yksi iso perustavanlaatuinen tietorakenteita CS.
Kuvaus ongelmasta asetettu spesifikaatio,
jos vedät sen ylös, kertoo pinot kuin sukua
kasa dining tarjottimia, että sinulla on kahvilassa ruokasalia
missä milloin ruokailu henkilökunta tulee ja tuo ruokailu lokerot jälkeen he siivonnut niitä,
he pinoa ne päällekkäin muiden.
Ja sitten kun lapset tulevat saamaan ruokaa,
ne vetää tarjottimet pois ensin alkuun yksi, sitten yksi alla, sitten yksi alle.
Eli käytännössä ensimmäinen lokero, ruokailu henkilökunta laittaa alas on viimeinen, joka saa ottaa pois.
Viimeinen että ruokailu henkilökunta laittaa on ensimmäinen, joka saa ottaa pois päivälliselle.
Vuonna ongelma setin spec, jonka voit ladata, jos et ole jo,
puhumme mallintaa pino data stucture käyttämästä tällaista struct.
>> Joten mitä meillä täällä, tämä on samanlainen kuin mitä oli esitetty luento,
paitsi luento esitimme tätä ints eikä char * s.
Tämä tulee olemaan pino, joka tallentaa mitä?
Daniel? Mitä me säilytykseen tässä pinossa?
[Daniel] Strings? >> Olemme tallentamiseen merkkijonoja tässä pinossa, tarkalleen.
Kaikki mitä tarvitset, jotta voidaan luoda pino on matriisi
tietyn kapasiteetin, joka tässä tapauksessa,
kapasiteetti tulee olemaan kaikissa lakit, koska se on jatkuvaa.
Ja sitten lisäksi jono, meidän ei tarvitse seurata on nykyistä taulukon koko.
Yksi asia huomata tässä, että on tavallaan viileä
on, että olemme perustetaan pinottu tietorakenne päälle toisen datarakenteen, jono.
On olemassa erilaisia ​​tapoja toteuttaa pinoja.
Emme tee sitä ihan vielä, mutta toivottavasti kun tekee linkitetyn-listan ongelmista,
näet kuinka voit helposti toteuttaa pinon päälle linkitetty lista samoin.
Mutta nyt, me kiinni ryhmät.
Joten jälleen kaikki tarvitsemme erilaisia ​​ja meidän täytyy vain seurata taulukon koko.
[Sam] Sorry, miksi se, että sanoit piipun päälle jouset?
Minusta se tuntuu jouset ovat pinossa.
[Hardison] Joo. Luomme, viemme array tietorakenne -
se on hyvä kysymys. Joten kysymys kuuluu, miksi ihmisiä, jotka katsovat tätä verkossa,
Miksi me sanoa, että pino on päällä jouset,
koska täällä se näyttää jouset ovat sisällä pino?
Joka on täysin tapauksessa.
Mitä viittasin oli että meillä array tietorakennetta.
Meillä joukko char * s, tämä joukko merkkijonoja,
ja aiomme lisätä että luodakseen pinottu tietorakennetta.
>> Joten pino on hieman monimutkaisempi kuin array.
Voimme käyttää array rakentaa pinon.
Niin, että jos sanomme, että pino on rakennettu päälle array.
Samoin kuten sanoin aiemmin, voimme rakentaa pino päälle linkitetty lista.
Sen sijaan käyttää array pitää meidän elementtejä,
voisimme käyttää linkitetty lista pitää meidän elementtejä ja rakentaa pino kiertää.
Kävellään läpi pari esimerkkiä, katsomalla jotain koodia,
nähdä, mitä todella tapahtuu täällä.
Vasemmalla olen heittänyt mitä se pino struct näyttäisi muistissa
jos kapasiteettia # määritelty olevan neljä.
Meillä myös neljän elementin char * array.
Meillä strings [0], merkkijonot [1], merkkijonot [2], merkkijonot [3],
ja sitten se viimeinen tilaa meidän koko kokonaisluku.
Onko tämä järkevää? Okei.
Tämä on mitä tapahtuu, jos mitä teen oikealla,
joka on minun koodi, on vain julistaa struct, pinottu struct nimeltään s.
Tämä on mitä saamme. Siinä vahvistetaan tämä jalanjälki muistiin.
Ensimmäinen kysymys on, mitä ovat sisältö pino struct?
Juuri nyt he mitään, mutta he eivät täysin mitään.
He tällaista roskaa. Meillä ei ole aavistustakaan mitä niissä.
Kun me julistamme pino s, me vain heittää että alaspäin päälle muistin.
Se on tavallaan kuin julistaa int i eikä alustamatta.
Et tiedä mitä siellä. Voit lukea mitä siellä,
mutta se ei ehkä erittäin hyödyllistä.
Yksi asia, jonka haluat aina muistaa tehdä, on alustaa mitä täytyy alustaa.
Tässä tapauksessa aiomme alustaa koon nollaksi,
koska tulee osoittautua erittäin tärkeää meille.
Voisimme mennä eteenpäin ja alustaa kaikki osoittimet, kaikki char * s,
olevan joitakin ymmärrettäviä arvo todennäköisesti null.
Mutta se ei ole täysin välttämätöntä, että teemme niin.
>> Nyt, kaksi operaatiot pinot ovat?
Joku muistan luento mitä tehdä pinot? Kyllä?
[Stella] Pushing ja popping? >> Aivan.
Pushing ja popping ovat kaksi tärkeintä toimintansa pinot.
Ja mitä push tehdä? >> Siinä jotain päälle alkuun
pinon, ja sitten huikeassa ottaa sen pois.
[Hardison] Aivan. Joten työntää työntää jotain päälle pinon.
Se on kuin dining henkilökunnan käyttöön ruokailu lokero alas laskuri.
Ja popping vie ruokailu lokero pois pinosta.
Kävellään läpi pari esimerkkiä siitä, mitä tapahtuu
kun ajaa asioita pinoon.
Jos me ajaa merkkijono "Hello" päälle meidän pinoon,
Tämä on mitä kaavio näyttäisi nyt.
Katso mitä tapahtuu?
Me työnnetään ensimmäinen osa meidän merkkijonojen joukko
ja me kasvattaneet meidän koko määrä on 1.
Joten jos katsomme ero dioja, täällä oli 0, tässä ennen push.
Tässä on jälkeen push.
Ennen push jälkeen push.
Ja nyt meillä on yksi osa meidän pinoon.
Se on merkkijono "hello", ja se on siinä.
Kaikki muu on array, meidän strings array, on edelleen roskaa.
Emme ole alustettu sitä.
Sanotaan työntää toisella merkkijonolla kiinni meidän pinoon.
Aiomme paina "world" tällä kertaa.
Joten voit nähdä "maailma" tässä menee päälle "Hei",
ja koko määrä nousee 2.
Nyt voimme työntää "CS50" ja että menemme päälle uudestaan.
Jos menemme takaisin, voit nähdä, kuinka olemme kiire päälle pinon.
Ja nyt saamme pop.
Kun me piipahti jotain pois pinosta, mitä tapahtui?
Kukaan näe eroa? Se on melko hienovarainen.
[Opiskelija] koko. >> Joo, koko muuttui.
>> Mitä muuta olisit odotetaan muuttuvan?
[Opiskelija] jouset, too. >> Oikea. Strings liikaa.
On käynyt ilmi, että kun teet näin,
koska emme kopioimalla elementit meidän pinoon,
me itse ei tarvitse tehdä mitään, me voimme vain käyttää kokoa
seurata useita asioita meidän array
niin että kun me pop uudestaan, uudestaan ​​me vain vähentääksesi meidän koko alas 1.
Ei tarvitse itse mennä ja korvata mitään.
Kind of funky.
On käynyt ilmi, että me yleensä vain jättää asioita yksin, koska se on vähemmän työtä meidän tekevän.
Jos meillä ei tarvitse mennä takaisin ja korvata jotain, niin miksi tehdä se?
Joten kun pop kahdesti pois pinosta, tämä vain vähentääksesi kokoa pari kertaa.
Ja vielä, tämä on vain siksi emme kopiointi asioita meidän pinoon.
Kyllä? Menkää.
[Student, käsittämätön] >> Ja mitä sitten tapahtuu, kun painat jotain taas?
Kun painat jotain uudelleen, mihin se menee?
Jos se menee, Basil? >> Merkkijonoiksi [1]? >> Oikea.
Miksi ei mennä merkkijonot [3]?
[Basil] Koska unohdin, että oli mitään strings [1] ja [2]?
[Hardison] Aivan. Meidän pino, lähinnä "unohti", että se oli tilalla mitään
in strings [1] tai merkkijonot [2], joten kun me push "woot"
se vain tuo sen osaksi elementin jouset [1].
Onko kysymyksiä siitä, miten tämä toimii, perustasolla?
[Sam] Joten tämä ei ole dynaaminen millään tavalla mitattuna määrä
tai kannalta pinon koon?
[Hardison] Aivan. Tämä on - kohta oli se, että tämä ei ollut dynaamisesti growning pino.
Tämä on pino joka mahtuu enimmillään neljä char * s, enintään neljä asiaa.
Jos olisimme yrittää työntää viidesosa juttu, mitä luulet pitäisi tapahtua?
[Opiskelijat, käsittämättömällä]
[Hardison] Aivan. On olemassa monia asioita, jotka voisi tapahtua.
Se voisi seg vika, riippuen siitä mitä olimme -
miten tarkalleen olimme täytäntöön back-end.
Se voi korvata. Se voisi olla, että puskurin ylivuoto että puhuimme luokassa.
Mikä olisi ilmeisin asia, joka saattaa olla päälle
jos yritimme työntää ylimääräistä asia meidän pino?
Joten te mainitsitte puskurin ylivuoto.
Mikä voisi olla asia, joka saisi kirjoittanut yli tai polki
jos me overflowed vahingossa yrittää työntää ylimääräinen juttu?
[Daniel, käsittämätön] >> mahdollista.
Mutta aluksi, mitä voisi tapahtua? Mitä jos me yritettiin neljäsosaa juttu?
Se voi korvata koko, ainakin tällä muistilla kaavion että meillä.
>> Vuonna Harjoitus eritelmä, joka on mitä aiomme olla täytäntöönpanon tänään,
mitä haluamme tehdä, on vain palauttaa false.
Meidän painalluksella tulee palauttaa boolean arvon,
ja että boolean arvo on tosi, jos push onnistuu
ja epätosi, jos emme voi työntää mitään muuta, koska pino on täynnä.
Kävellään läpi vähän että koodia nyt.
Tässä meidän push-toiminto.
Meidän push toiminto pino aikoo ryhtyä merkkijono laittaa pinoon.
Se tulee palauttaa true jos merkkijonon onnistuneesti ajanut
pinoon ja vääriä toisin.
Kaikki ehdotukset, mitä voisi olla hyvä ensimmäinen asia tehdä täällä?
[Sam] Jos koko vastaa kapasiteetin palaa väärä?
[Hardison] Bingo. Hyvää työtä.
Jos koko on kapasiteettia, aiomme palauttaa false.
Emme voi laittaa mitään muuta meidän pinoon.
Muuten, haluamme laittaa jotain pinon päälle.
Mikä on "päällimmäinen" aluksi?
[Daniel] Koko 0? >> Size 0.
Mikä on päällimmäinen jälkeen on olemassa yksi asia pino? Missy, tiedätkö?
[Missy] One. >> Koko on yksi, täsmälleen. Sinun pitää lisätä kokoa,
ja joka kerta olet ottamassa uuden elementin indeksin koko jono.
Voimme tehdä sen, että sellainen sutkaus, jos se on järkevää.
Joten meillä meidän jouset array, aiomme käyttää sitä koko indeksin
ja olemme juuri menossa tallentaa myös char * siellä.
Huomaa kuinka Ei ole merkkijono kopiointi meneillään täällä,
no dynaaminen jakaminen muistia?
Ja sitten Missy esille mitä meidän on nyt tehtävä,
koska olemme tallennettu merkkijono sopiva paikka array,
ja hän sanoi, että meidän oli kasvattaa kokoa yhteen niin, että olemme valmiita seuraavaan push.
Joten voimme tehdä sen s.size + +.
Tässä vaiheessa olemme työnnetään meidän array. Mikä on viimeinen asia, meidän täytyy tehdä?
[Student] return true. >> Return true.
Joten se on melko yksinkertainen, melko yksinkertainen koodi. Ei liikaa.
Kun olet kääritty pään ympärille miten pino toimii,
Tämä on melko yksinkertainen toteuttaa.
>> Nyt seuraava osa on popping merkkijono pois pinosta.
Aion antaa te aikaa työstää tätä hieman.
Se on melkein lähinnä päinvastainen mitä olemme tehneet täällä push.
Mitä olen tehnyt on oikeastaan ​​- oho.
Olen käynnistetty laite tänne, ja laite,
Olen revitä ongelmaan asetettu 5 erittely.
Jos me zoomata täällä, näemme olen klo cdn.cs50.net/2012/fall/psets/pset5.pdf.
Oletteko ladannut tämän koodin, joka sijaitsee täällä, section6.zip?
Selvä. Jos et ole tehnyt sitä, tee se nyt, todella nopeasti.
Teen sen minun pääteikkunassa.
Olen itse tehnyt sen tänne. Joo.
Kyllä, Sam? >> Minulla on kysymys siitä, miksi sanoit s.string n suluissa size = str?
Mikä on str? Onko se määritelty jossain aiemmin, tai - oh, in char * str?
[Hardison] Kyllä, täsmälleen. Se oli argumentti. >> Ai, okei. Anteeksi.
[Hardison] Olemme täsmennetään merkkijono työntää sisään
Toinen kysymys, joka voisi keksiä, että emme todellakaan puhu täällä oli
otimme itsestäänselvyytenä, että meillä oli tämä muuttuja nimeltä s
joka oli laajuudeltaan ja helposti meille.
Otimme selvänä, että s oli tämä pino struct.
Joten katson taaksepäin tätä push koodia,
voit nähdä, että teemme juttuja tällä merkkijonolla että sai hyväksyttiin
mutta sitten yhtäkkiä, me päästä s.size, kuten, jos ei s kotoisin?
Vuonna koodin että olemme menossa katsomaan jaksossa arkisto
ja sitten kamaa, että voit tehdä oman ongelman asettaa,
teimme pino rakenteeseen sisältyvää globaaliin muuttujaan
jotta voimme saada sitä meidän kaikkien eri toimintojen
ilman käsin siirtää se ympäri ja kulkevat sen viittaus,
tehdä kaikki tällaista tavaraa siihen.
Olemme vain huijaa vähän, jos haluatte, tehdä asioita mukavampaa.
Ja se on jotain teemme täällä, koska se on hauskaa, se on helpompaa.
Usein näet ihmiset tekevät tätä, jos heillä on yksi suuri tietorakenne
joka on parhaillaan liikennöi niiden ohjelmasta.
>> Mennään takaisin päälle laitteeseen.
Oliko kaikki onnistuneesti saada section6.zip?
Kaikki pura se käyttäen unzip section6.zip?
Jos menet 6 § hakemisto -
aah, koko paikka -
ja sinä luetella, mitä on täällä, näet, että sinulla kolme. C-tiedostoja.
Sinulla jono, SLL, joka on yksin-linkitetyn listan, ja pino.
Jos avaat stack.c,
voit nähdä, että meillä on tämä struct määritellyt meille,
tarkka struct että me juuri puhuttu dioja.
Meillä globaalia muuttujaa pinon,
meillä myös push-toiminto,
ja sitten meillä meidän pop-toiminto.
Laitan koodin työntää takaisin ylös dian täällä,
mutta mitä haluaisin te tehdä on, parhaan kykysi,
mene ja toteuttaa pop-toiminto.
Kun olet toteuttanut sen, voit kääntää tämän kanssa tehdä pino,
ja sitten ajaa tuloksena pinon executable,
ja joka jatkuu koko tämän testin koodin tänne se on pääasiassa.
Ja tärkein huolehtii todella tehdä push ja pop puhelut
ja varmistaa, että kaikki menee läpi kunnossa.
Se myös alustaa pinon kokoa täällä
joten sinun ei tarvitse huolehtia alustetaan se.
Voit olettaa, että se on oikein alustettu
mennessä kerran avaat sen pop-toiminto.
Onko siinä järkeä?
Joten tässä sitä mennään. On push koodin.
Annan teille kaverit 5 tai 10 minuuttia.
Ja jos sinulla on kysyttävää välivaiheen kun olet koodaus,
kysy niitä ääneen.
Joten jos saat kompastuskivi, kysykää.
Haluaisin tietää, anna kaikki muutkin tietävät.
Työ lähimmäistäsi liikaa.
[Daniel] Olemme juuri täytäntöön pop juuri nyt? >> Sujauta.
Vaikka voit kopioida täytäntöönpanoa push jos haluat
niin että testaus toimii.
Koska se on vaikea testata asioita joutumassa -
tai se on vaikea testata popping asioita ulos pino jos ei ole mitään pino aluksi.
>> Mikä on pop tarkoitus palata? Elementti pinon päälle.
Se pitäisi saada osa pois pinon
ja sitten dekrementoidaan pinon koon,
ja nyt olet menettänyt elementin päällä.
Ja sitten palaat elementin päällä.
[Student, käsittämättömällä]
[Hardison] Mitä tapahtuu, jos teet sen? [Student, käsittämättömällä]
Mitä päätyy tapahtumassa on olet todennäköisesti päästä joko
elementti, joka ei ole alustettu vielä, joten laskenta
ja, jossa viimeinen elementti on pois päältä.
Joten tässä, jos huomaat, push, me päästä jouset s.size elementti
koska se on uusi hakemisto.
Se on uusi pinon.
Taas pop, s.size tulee olemaan seuraava tilaa,
tila, joka on päälle kaikki elementit pino.
Niin ylimmäinen elementti ei tällä s.size,
vaan se on sen alle.
>> Toinen asia tehdä, kun - pop,
on sinulla on vähentääksesi kokoon.
Jos muistat takaisin pikku kaavio täällä,
oikeastaan ​​ainoa asia, että näimme tapahtuu kun soitimme pop
oli se, että tämä koko putoaa, ensin 2, sitten 1.
Sitten kun me työnnetään uusi elementti, se menisi oikeaan paikkaan.
[Basil] Jos s.size on 2, niin eikö mennä elementin 2,
ja sitten et haluaisi pop että elementti pois?
Joten jos menimme - >> Joten katsokaamme asiaa uudelleen.
Jos tämä on pino tässä vaiheessa
ja kutsumme pop,
jossa indeksi on Ylimmässä elementti?
[Basil] 2, mutta se tulee pop 3. >> Oikea.
Niin, että jos meidän koko on 3, mutta haluamme pop elementin indeksin 2.
Se on niin tyypillistä sellainen pois joka teillä on nolla-indeksointi matriiseja.
Joten et halua pop kolmas elementti, mutta kolmas osa ei tällä indeksi 3.
Ja syystä emme tarvitse tehdä miinus 1, kun olemme työntää
on sillä nyt, huomaat että Ylimmässä elementti,
jos me työntää jotain muuta pinoon tässä vaiheessa,
haluaisimme ajaa sitä indeksi 3.
Ja se vain niin, että koko ja indeksit riviin kun olet työntää.
>> Kenellä työskentelee pino täytäntöönpanon?
Sinulla työskentelee pinota. Onko sinulla pop toimi vielä?
[Daniel] Kyllä. Luulen niin.
>> Ohjelman käynnissä eikä seg Virhesovellus, se tulostetaan ulos?
Onko se tulostaa "menestys", kun suoritat sen?
Joo. Tee pino, ajaa, jos se tulostuu "menestys" ja ei mene puomi,
Sitten kaikki on hyvää.
Selvä. Mennään yli laite todella nopeasti,
ja käydään läpi tätä.
Jos katsomme mitä tapahtuu täällä pop,
Daniel, mikä oli ensimmäinen asia, että teit?
[Daniel] Jos s.size on suurempi kuin 0.
[Hardison] Okei. Ja miksi teit sen?
[Daniel] Varmista, että siellä oli jotain sisällä pino.
[Hardison] Oikea. Haluat testata varmistaa, että s.size on suurempi kuin 0;
muuten, mitä haluat on tapahtunut?
[Daniel] return? >> Return null, tarkalleen.
Joten jos s.size on suurempi kuin 0. Sitten mitä me teemme?
Mitä teemme, jos pino ei ole tyhjä?
[Stella] Olet vähentääksesi koko? >> Voit vähentääksesi kokoa, okei.
Joten miten teit sen? >> S.size--.
[Hardison] Suuri. Ja mitä sitten teit?
[Stella] Ja sitten minä sanoin paluun s.string [s.size].
[Hardison] Suuri.
Muuten palaat null. Kyllä, Sam?
[Sam] Miksi se ei tarvitse olla s.size + 1?
[Hardison] Plus 1? >> Joo. >> Selvä.
[Sam] Ajattelin koska olet ottaen 1 lähtö,
sitten olet menossa olevan palaamassa ole se, että he pyysivät.
[Hardison] Ja tämä oli juuri sitä mitä me puhuimme tämän koko kysymystä 0 indeksit.
Joten jos me zoomata takaisin tänne.
Jos katsomme tämä kaveri täällä, voit nähdä, että kun me pop,
olemme popping elementin indeksin 2.
>> Joten me pienentää myös koko ensimmäinen, sitten meidän koko vastaa meidän indeksiin.
Jos emme vähentääksesi kokoa ensin, sitten meidän täytyy tehdä koko -1 ja sitten vähennys.
Suuri. Kaikki hyvin?
Kysyttävää tästä?
On olemassa useita eri tapoja kirjoittaa tämän hyvin.
Itse voimme tehdä jotain jopa - voimme tehdä sutkaus.
Voimme tehdä yhden rivin tuottoa.
Joten voimme todella vähentääksesi ennen palaamme tekemällä niin.
Joten laskemisesta - ennen s.size.
Se tekee linjan todella tiheä.
Jos ero - s. Koko ja s.size--
että tämä postfix - he kutsuvat sitä postfix koska - tulee sen jälkeen s.size--
tarkoittaa sitä, että s.size arvioidaan varten löytää indeksin
koska se on tällä hetkellä, kun tätä linjaa on suoritettu,
ja sitten tämä - tapahtuu sen jälkeen linja saa suorittaa.
Kun elementti indeksi s.size päästään.
Ja se ei ole, mitä haluamme, koska haluamme vähennys tapahtuu ensin.
Othewise, aiomme olla pääsy array, tehokkaasti, out of bounds.
Aiomme olla pääsy elementin yläpuolella, joka todella haluamme päästä.
Niin, Sam? >> Onko nopeammin tai käyttää vähemmän RAM tehdä yhdellä rivillä vai ei?
[Hardison] Oikeasti, se riippuu oikeastaan.
[Sam, käsittämätön] >> Joo, se riippuu. Voit tehdä kääntäjä temppuja
saada kääntäjä tunnistaa, että yleensä, uskoisin.
>> Joten olemme maininneet hieman tästä kääntäjä optimointi kamaa
että voit tehdä kokoamisessa,
ja se on sellainen asia, että kääntäjä voisi selvittää,
kuten Hei, ehkä voin tehdä tämän kaiken yhdellä kertaa,
toisin kuin lastaus koko muuttujan RAM,
decrementing se, tallentamalla sen takaisin ulos, ja sitten lastaus se takaisin
käsitellä loput tämän operaation.
Mutta tyypillisesti, ei, tämä ei ole sellainen asia
että menee tekemään ohjelmaa huomattavasti nopeammin.
Enempää kysymyksiä pinot?
>> Joten työntää ja paukkuu. Jos kaverit haluavat kokeilla hakkeri painos,
mitä olemme tehneet hakkeri painos on todella mennyt
ja teki tämän pino kasvaa dynaamisesti.
Haasteena on ensisijaisesti täällä push-toiminto,
selvittää, miten tehdä, että joukko kasvaa
kun pitää työntää enemmän ja enemmän elementtejä pinoon.
Se on oikeastaan ​​ole liikaa lisäkoodi.
Vain puhelun - täytyy muistaa saada puhelut malloc siellä oikein,
ja sitten selvittää, kun aiot soittaa realloc.
Se on hauska haaste, jos olet kiinnostunut.
>> Mutta toistaiseksi mennään eteenpäin, ja puhutaanpa jonoja.
Selaa täältä.
Jono on tiivis sisarus pinon.
Joten pino, asioita, jotka otettiin viime
olivat ensimmäisiä asioita sitten hakea.
Meillä tätä last in, first out tai LIFO, tilaaminen.
Taas jonossa, niin voit odottaa kun seisot jonossa,
ensimmäinen henkilö saada linjassa, ensimmäinen asia päästä jonoon,
on ensimmäinen asia, joka saa hakea jonosta.
Jonot ovat myös usein käytetään kun olemme tekemisissä kuvaajia,
kuten puhuimme lyhyesti pinot,
ja jonot ovat myös kätevä joukko muita asioita.
Eräs asia, joka tulee esiin usein yrittää säilyttää, esimerkiksi
lajiteltu luettelo elementtejä.
Ja voit tehdä tämän array. Voit säilyttää lajitella luetteloa asioita array,
mutta jos se saa hankala on sinun aina löytää
sopiva paikka lisätä seuraava asia.
Joten jos sinulla on joukko numeroita, 1: stä 10,
ja sitten haluat laajentaa että kaikki numerot 1 100,
ja olet saada nämä numerot satunnaisessa järjestyksessä ja yrittää pitää kaiken
lajiteltu kuten mennä läpi, voit päätyä tarvitse tehdä paljon siirtää.
, Joilla on tiettyjä jonoja ja tiettyjen taustalla tietorakenteita,
voit itse pitää sitä melko yksinkertainen.
Sinun ei tarvitse lisätä jotain ja sitten remontti koko juttu joka kerta.
Eikä sinun tarvitse tehdä paljon siirtyminen sisäisten elementtien ympärille.
Kun katsomme jonoon, huomaat että - myös queue.c jaksossa koodi -
struct että olemme antaneet sinulle on todella samanlainen struct että annoimme sinulle pinon.
>> On yksi poikkeus, ja että yksi poikkeus
on, että meillä on tämä ylimääräinen kokonaisluku kutsutaan pää-
ja pää tässä on pitää kirjaa jonon,
tai ensimmäinen elementti jonossa.
Jossa pino, pystyimme pitämään kirjaa elementin, että olimme aikeissa hakea,
tai pinon, käyttäen vain kokoa,
kun taas jonon, olemme ottaa käsitellä vastakkaisiin päihin.
Yritämme tack asioita lopussa, mutta palaavat sitten asioita edestä.
Niin tehokkaasti, pää, meillä on indeksi alussa jonoon,
ja koko antaa meille indeksi lopussa jonon
jotta voimme hakea asioita pään ja lisätä asioita ja häntää.
Kun taas pinon, olimme aina vain käsittelee pinon päälle.
Emme koskaan tarvinnut käyttää pinon pohjalle.
Me vain lisätty asioita ylös ja otti asiat pois alkuun
joten emme tarvitse tuota ylimääräistä kentän sisällä meidän struct.
Onko se yleensä järkeä?
Selvä. Kyllä, Charlotte? [Charlotte, käsittämättömällä]
[Hardison] Se on hyvä kysymys, ja se oli yksi esille tulleet luento.
Ehkä kävely läpi muutamia esimerkit havainnollistavat miksi
emme halua käyttää merkkijonojen [0] kuin jonon.
>> Joten kuvitella, että meillä on jonossa, aiomme kutsua sitä jonoon.
Alussa, kun olemme juuri instantiated sitä,
kun olemme juuri ilmoittanut sen, emme ole alustettu mitään.
Se kaikki roskat. Niinpä tietenkin haluamme varmistaa, että meillä alustat
Sekä koon ja pään kentät olla 0, jotain järkevää.
Voisimme myös mennä eteenpäin ja null ulos elementtejä meidän jonoon.
Ja jotta tämä kaavio sopivaksi, huomaat, että nyt meidän jono voi olla vain kolme tekijää;
taas meidän pino mahtui neljä meidän jono voi olla vain kolme.
Ja tämä on vain tehdä kaavion sovi.
Ensimmäinen asia, joka tapahtuu tässä on meidän jonoon merkkijono "HI".
Ja aivan kuten teimme pino, ei mitään kauhean erilaista täällä,
heitämme string klo jouset [0] ja kasvattaa meidän kokoa 1.
Me jonoon "heippa", se saa laittaa.
Joten tämä näyttää pino suurimmaksi osaksi.
Aloitimme täällä, uusi elementti, uusi elementti, koko pitää menossa ylös.
Mitä tapahtuu tässä vaiheessa, kun haluamme dequeue jotain?
Kun haluamme dequeue, joka on elementti, että me haluamme dequeue?
[Basil] Kielet [0]. >> Zero. Täsmälleen oikea, Basil.
Haluamme päästä eroon ensimmäinen merkkijono, tämä "hei".
Joten mikä oli toinen asia, joka muutti?
Huomaa kun piipahti jotain pois pinosta, me juuri muuttanut koko,
mutta täällä meillä pari asiaa, jotka muuttuvat.
Ei ainoastaan ​​koon muuttaminen, mutta pää muuttuu.
Tämä menee takaisin Charlotte näkökulmasta aiemmin:
miksi meillä on tämä pää samoin?
Onko mitään järkeä nyt, Charlotte? >> Tavallaan.
[Hardison] Kind of? Joten mitä tapahtui, kun me dequeued?
Mitä päätä tehdä sitä nyt on mielenkiintoista?
[Charlotte] Voi, koska se muutti - okei. Ymmärrän.
Koska pää - jossa pää on osoittaa muutoksia kannalta sijainnin.
Se ei ole enää aina nolla indeksin yksi. >> Aivan.
Mitä tapahtui oli jos dequeueing suuri osa
tehtiin ja meillä ei ole tätä päätä alalla
koska olimme aina vaatineet tämän merkkijonon 0 indeksi pään meidän jono,
Sitten meillä olisi siirtää loput jonon alas.
Meidän täytyisi siirtää "hei" mistä alkaen jouset [1] merkkijonot [0].
Ja jousille [2] alas strings [1].
Ja olisimme täytyy tehdä tämä koko luettelo tekijöistä,
koko joukko elementtejä.
Ja kun teemme tätä array, että saa todella kallista.
Joten tässä, se ei ole iso juttu. Meillä on vain kolme tekijää meidän array.
Mutta jos meillä oli jonossa tuhat elementtejä tai miljoona elementtejä,
ja sitten yhtäkkiä, alamme tehdä kasan dequeue kutsuu kaikki silmukka,
asiat ovat todella hiljenee sillä se siirtää kaiken alas jatkuvasti.
Tiedätkö, siirtyvän 1, muutos 1, muutos 1, muutos 1.
Sen sijaan käytämme tämän pään, me kutsumme sitä "osoitin", vaikka se ei oikeastaan ​​osoitin
suppeassa merkityksessä, se ei ole osoitin tyyppiä.
Se ei ole int * tai char * tai mitään sellaista.
Mutta se osoittaa tai ilmoitetaan pää meidän jonoon. Niin?
>> [Opiskelija] Kuinka dequeue tietää vain pop pois mitä on pään?
[Hardison] Kuinka dequeue osaa kupsahtaa mitä on kärjessä? >> Aivan, joo.
>> Mitä se katselee vain mitä päähän kentän asetetaan.
Joten tässä ensimmäisessä asiassa, jos katsomme täällä,
päämme on 0, indeksi 0. >> Oikea.
[Hardison] Niin se vain sanoo kunnossa, hyvin, elementti indeksi 0, merkkijono "hi"
on elementti kärjessä meidän jonoon.
Joten menemme dequeue että kaveri.
Ja että on elementti, joka saa takaisin soittajalle.
Kyllä, Saad? >> Joten pään periaatteessa asettaa - jos olet menossa indeksoida sitä?
Se alku se? >> Joo. >> Okei.
[Hardison] Tuo tulossa uutta alkua meidän array.
Joten kun dequeue jotain, kaikki sinun tarvitsee vain käyttää elementin indeksin q.head,
ja että on elementti, jonka haluat dequeue.
Sinulla on myös vähentääksesi kokoon.
Tulemme näkemään vähän missä asiat saavat hieman hankala tätä.
Me dequeue, ja nyt, jos me jonoon uudelleen,
missä me jonoon?
Mistä seuraava osa mennä meidän jonossa?
Sano haluamme jonoon merkkijono "CS".
Johon indeksi sen mennä? [Opiskelijat] Kielet [2]. >> Kaksi.
Miksi 2 eikä 0?
[Basil] Koska nyt pää on 1, niin että on kuin alun listan?
[Hardison] Oikea. Ja mitä tarkoittaa listan loppuun?
Mitä käytämme kuvaamaan loppuun meidän jonoon?
Pää on pää meidän jonon alku meidän jonoon.
Mikä on lopussa meidän jonoon? [Opiskelijat] Koko. >> Size, tarkalleen.
Joten meidän uusia elementtejä mennä klo koon, ja tekijät, jotka otamme pois irrota pään.
Kun jonoon seuraavan elementin, me laitamme sen osoitteessa kokoa.
[Opiskelija] Ennen kuin laitat että vaikka koko oli 1, eikö?
[Hardison] Oikea. Joten ole aivan koko. Koko +, ei +1, mutta + pää.
Koska muutimme kaiken pään määrällä.
Joten tässä, nyt meillä jono koko 1, joka alkaa klo indeksi 1.
Häntä on indeksi 2. Kyllä?
>> [Opiskelija] Mitä tapahtuu kun dequeue merkkijonot [0] ja jousien lähtö muistiin
vain saada tyhjennetty, pohjimmiltaan, tai vain unohtanut?
[Hardison] Joo. Tässä mielessä me vain unohtaa ne.
Jos me tallentamalla niiden jäljennökset -
monet tietorakenteet usein tallentaa omia kopioita elementtien
niin, että henkilö hallintaan tietorakenne ei tarvitse huolehtia
mistä kaikki osoittimet ovat menossa.
Tietorakenne pitää kiinni kaikesta, pitää kiinni kaikista kopiot,
varmista, että kaikki jatkuu asianmukaisesti.
Kuitenkin tässä tapauksessa nämä tietorakenteita vain, yksinkertaisuuden vuoksi,
ei tehdä kopioita mitään, että olemme tallentamalla niihin.
[Opiskelija] Eli tämä jatkuva joukko -? >> Kyllä.
Jos me katsomme taaksepäin, mikä määritelmän oli tämän rakenteen, se on.
Se on vain tavallinen array kuten olet nähnyt,
joukko char * s.
Onko se -? >> Joo, olin juuri mietin
jos sinun lopulta loppuu muisti, jossain määrin,
Jos sinulla on kaikki nämä tyhjät kohdat sinun array?
[Hardison] Joo, hyvä pointti.
>> Jos katsomme, mitä on tapahtunut nyt tässä vaiheessa,
olemme täynnä meidän jonoon, se näyttää.
Mutta emme ole oikeastaan ​​täynnä meidän jonossa
koska meillä on jonon, joka on koko 2, mutta se alkaa indeksi 1,
koska sieltä meidän pään osoitin on.
Kuten sanoit, että elementin jouset [0], on indeksi 0, ei oikeastaan ​​ole olemassa.
Se ei ole meidän jonoon enää.
Me vain ei viitsinyt mennä ja korvata sen, kun me dequeued sitä.
Joten vaikka se näyttää olemme loppuu muisti, emme todellakaan ole.
Tämä piste on meille käyttöä.
Asianmukaista käyttäytymistä, jos olisimme yrittää ja ensimmäisen dequeue jotain
kuten "hei", joka pop hei pois.
Nyt meidän jono alkaa indeksin 2 ja on kooltaan 1.
Ja nyt jos yrittää laittaa jonoon jotain uudestaan, vaikkapa 50,
50 pitäisi mennä tällä paikalla klo indeksi 0
koska se on vielä saatavilla meille. Kyllä, Saad?
[Saad] se tapahtuu automaattisesti?
[Hardison] Se ei tapahdu aivan automaattisesti. Sinun täytyy tehdä matematiikka
tehdä työtä, mutta lähinnä mitä olemme tehneet, on meillä vain kiedottu.
[Saad] Ja se on ok, jos tämä on reikä keskellä se?
[Hardison] On, jos voimme tehdä matematiikka treenata kunnolla.
>> Ja näyttää siltä, ​​että se on oikeastaan ​​ole niin vaikea tehdä mod operaattorin.
Eli aivan kuten teimme Caesar ja crypto tavaraa,
käyttäen mod, voimme saada asioita Ulottumamitan ja jatka
ympäri ja ympäri ja ympäri meidän jono,
pitää, että pää osoitin liikkuu.
Huomaa, että koko on aina kunnioittaa alkioiden lukumäärä tosiasiallisesti sisällä jonoon.
Ja se on vain esiosoitinta joka pitää pyöräilyn kautta.
Jos katsomme, mitä täällä tapahtui, jos menemme takaisin alkuun,
ja juuri katsella mitä tapahtuu pään
kun jonoon jotain, mitään ei tapahtunut päähän.
Kun me enqueued jotain muuta, mitään ei tapahtunut päähän.
Heti kun me dequeued jotain, pää nousee yhdellä.
Me enqueued jotakin, mitään ei tapahdu päähän.
Kun me dequeue jotain, yhtäkkiä pää saa kasvatetaan.
Kun me jonoon jotakin, mitään ei tapahdu päähän.
>> Mitä tapahtuisi tässä vaiheessa, jos me dequeue jotain uudelleen?
Mitään ajatuksia? Mitä tapahtuisi päähän?
Mitä pitäisi tapahtua päähän
jos me dequeue jotain muuta?
Pää nyt on indeksi 2,
mikä tarkoittaa sitä, että jonon on jouset [2].
[Student], joka palauttaa 0? >> Olisi palata 0. Sen pitäisi kääri takaisin noin, täsmälleen.
Toistaiseksi aina vaadimme dequeue, olemme lisäämällä yksi pää,
lisätä yhden pään, lisää yksi pää, lisätään yksi päähän.
Heti kun tämä esiosoittimen saa viimeinen indeksi meidän array,
Sitten meidän on kääriä se takaisin noin alkuun, mene takaisin 0.
[Charlotte] Mikä määrittää kapasiteetin jono pino?
[Hardison] Tässä tapauksessa olemme juuri käyttämällä # määritellyn vakio. >> Okei.
[Hardison] Varsinaisessa. C-tiedoston, voit mennä ja sonta sen kanssa hieman
ja tehdä se niin suuri tai pieni kuin haluat.
[Charlotte] Joten kun teet sen jonon, miten teet tietokoneen tietävät
kuinka iso haluat pino olla?
[Hardison] Se on hyvä kysymys.
On olemassa pari tapaa. Yksi on vain määritellä se edessä
ja sanoa tämä tulee olemaan jonoon, joka on 4 elementtiä tai 50 osia tai 10000.
Toinen tapa on tehdä mitä hakkeri painos ihmiset tekevät
ja luoda toimintoja on teidän jono kasvaa dynaamisesti enemmän asioita saa lisätä tuumaa
>> [Charlotte] Joten mennä ensimmäinen vaihtoehto, mitä syntaksia käytät
kertoa ohjelman, mikä on koko jonon?
[Hardison] Ah. Joten ulos tästä.
Olen edelleen stack.c täällä, joten olen juuri menossa vierittää ylös tänne.
Näetkö tämän täällä? Tämä on # define kapasiteetti 10.
Ja tämä on melkein täsmälleen samaa syntaksia meillä on jonossa.
Paitsi jonossa, meillä että ylimääräistä struct kenttä täällä.
[Charlotte] Voi, luulin kapasiteetin vuoksi kapasiteetin merkkijono.
[Hardison] Ah. >> Että se on maksimipituus sanan. >> Selvä.
Joo. Kapasiteetti täällä - se on hyvä piste.
Ja tämä on jotain, joka on hankala
sillä mitä olemme julisti täällä on joukko char * s.
Joukko osoittimia.
Tämä on matriisi merkkiä.
Tämä on luultavasti mitä olet nähnyt, kun olet ollut julistaa sinun puskurit tiedoston I / O,
kun olet ollut luomassa jouset manuaalisesti pinoon.
Mutta se, mitä meillä täällä on joukko char * s.
Joten se joukko osoittimia.
Oikeastaan, jos me zoomata takaisin ulos ja katsomme mitä tapahtuu täällä
esityksen, näet että todelliset tekijät, merkin tietoja
ei ole tallennettu matriisin sisällä itse.
Mikä on talletettu joukko täällä ovat osoittimia merkin tietoihin.
Okei. Joten olemme nähneet, kuinka koko jono aivan kuten pinon
koko kunnioittaa aina elementtien lukumäärä tällä hetkellä jonossa.
Tehtyään 2 enqueues, koko on 2.
Tehtyään dequeue koko on nyt 1.
Tehtyään toisen Aseta jonoon koko on takaisin enintään 2.
Joten koko ehdottomasti noudattaa elementtien määrä jonossa,
ja sitten pää vain pitää pyöräily.
Se menee 0-1-2, 0-1-2, 0-1-2.
Ja joka kerta me kutsumme dequeue, esiosoitinta saa kasvaa seuraavaan indeksiin.
Ja jos pää on aikeissa mennä yli, se palaa takaisin noin 0.
Niin, että voimme kirjoittaa dequeue toimintoa.
Ja me aiomme lähteä Aseta jonoon toiminto te toteuttaa sijaan.
>> Kun me dequeue osa ulos meidän jono,
Mikä oli ensimmäinen asia, että Daniel teki, kun aloimme kirjallisesti pop toiminto pinot?
Saanen kuulla jonkun, joka ei ole puhunut vielä.
Katsotaanpa, Saad, muistatko mitä Daniel teki niin ensimmäinen asia, kun hän kirjoitti pop?
[Saad] Siellä oli, se oli - >> Hän testasi jotain.
[Saad] Jos koko on suurempi kuin 0. >> Aivan.
Ja mikä oli se testaus?
[Saad] Tämä oli testata, onko siellä mitään sisällä array.
[Hardison] Joo. Aivan. Joten et voi pop mitään pois pinosta, jos se on tyhjä.
Samoin, et voi dequeue mitään jonoon, jos se on tyhjä.
Mikä on ensimmäinen asia, joka meidän pitäisi tehdä meidän dequeue toiminto täällä, luulet?
[Saad] Jos koko on suurempi kuin 0? >> Joo.
Tässä tapauksessa olen oikeastaan ​​juuri testattu nähdä, jos se on 0.
Jos se on 0, voimme palata null.
Mutta täsmälleen samaa logiikkaa.
Ja jatkakaamme tätä.
Jos koko ei ole 0, missä on elementti, että me haluamme dequeue?
[Saad] Kärjessä? >> Aivan.
Voimme vain vetää ulos ensimmäinen elementti meidän jonossa
avaamalla elementin päähän.
Mikään hullu.
Sen jälkeen, mitä meidän pitäisi tehdä? Mitä on tapahtunut?
Mikä oli toinen asia, että puhuimme dequeue?
Kaksi asiaa täytyy tapahtua, koska meidän jono on muuttunut.
[Daniel] Pienennä kokoa. >> Meillä pienentää ja kasvattaa pää? Aivan.
Voit lisätä pään, emme voi sokeasti lisätä pään, muistan.
Emme voi vain tehdä queue.head + +.
Meidän on myös tähän mod mennessä kapasiteettia.
Ja miksi me mod jonka kapasiteettia, Stella?
[Stella] Koska se on kietoa. >> Aivan.
Me mod n kapasiteetti, koska se on kääriä takaisin noin 0.
Joten nyt tässä vaiheessa, voimme tehdä mitä Daniel sanoi.
Me voi vähentää kokoa.
Ja sitten voimme vain palata elementin, joka oli yläosassa jonon.
Se näyttää sellaista gnarly aluksi. Saatat olla kysymys. Anteeksi?
>> [Sam] Miksi on ensin yläosassa jonossa? Minne se meni?
[Hardison] Se tulee neljäs rivi alhaalta.
Kun testaamme varmistaa, että jono ei ole tyhjä,
me vedä char * Ensinnäkin, me vedä elementti, joka istuu päähän indeksi
meidän valikoima, meidän merkkijonojen joukko, >> ja soita se ensimmäinen?
[Hardison] Ja me kutsumme sitä ensin. Joo.
Vain seurata, että miksi luulet meidän piti tehdä se?
[Sam] Kukin ensimmäinen on juuri palaamassa q.strings [q.head]? >> Joo.
>> Koska teemme tätä muuttaminen q.head kanssa mod-toiminto,
ja ei ole tapa tehdä se sisällä paluulinjaan myös.
[Hardison] Aivan. Olet paikalla. Samin täysin kohdalleen.
Siksi meidän piti vetäytyä ensimmäinen elementti meidän jonoon ja tallentaa sen muuttujaan
johtuu tämä rivi jossa olimme juuri q.head,
siellä mod toimija ei ole jotain, mitä voimme tehdä
ja ovat sen voimaan päähän ilman - yhdellä rivillä.
Joten meillä on todellakin vetää ulos ensimmäinen osa, säädä pää-
Säädä kokoa ja palauta elementti, että me vedetään ulos.
Ja tämä on jotain, että näemme keksiä myöhemmin
linkitettyjä listoja, kuten leikkiä heidän kanssaan.
Usein kun olet vapauttaa tai hävittämistä linkitettyjä listoja
sinun täytyy muistaa seuraavan elementin, seuraava osoitin linkitetyn listan
ennen hävittämistä nykyinen.
Koska muuten heität pois tietoa siitä, mitä on jäljellä luettelossa.
Nyt, jos menet laitteesi, voit avata queue.c--x pois tästä.
Joten jos olen avata queue.c, haluan zoom täällä,
huomaat, että sinulla on samanlainen näköinen tiedosto.
Samanlaisia ​​näköisiä tiedosto mitä meillä oli aiemmin stack.c.
Meillä myös struct varten jonon määritellään kuten näimme dioja.
>> Meillä Aseta jonoon toiminto, joka on sinua tekemään.
Ja meillä on dequeue toimintoa täällä.
Dequeue toiminto tiedoston toteutumatta,
mutta laitan sen takaisin ylös PowerPoint jotta voit kirjoittaa sen, jos haluat.
Joten seuraavan 5 minuuttia tai niin, te työtä Aseta jonoon
mikä on lähes aivan vastakohta dequeue.
Sinun ei tarvitse säätää pään kun olet enqueueing, mutta mitä sinun täytyy säätää?
Size. Joten kun Aseta jonoon, pää pysyy koskemattomana, kokoa saa muuttaa.
Mutta se vie vähän - joudut leikkiä että mod
selvittää, mitä indeksi uutuutta Lisätään.
Joten annan teitä vähän, laita dequeue takaisin ylös dian,
ja koska teillä kysymyksiä, huutaa ne pois, jotta voimme
kaikki puhuvat niitä ryhmässä.
Lisäksi, kokoa älä - kun säädät kokoa, voit aina juuri -
sinulla mod kokoon koskaan? [Daniel] No >> Sinun ei tarvitse mod kokoon, oikea.
Koska koko aina, jos Sinä - olettaen olet hallinnassa asioita asianmukaisesti,
koko on aina välillä 0 ja 3.
Missä teillä on mod kun teet Aseta jonoon?
[Student] Vain päähän. >> Vain päähän, täsmälleen.
Ja miksi olet mod lainkaan Aseta jonoon?
Kun on tilanne, jossa sinun täytyy mod?
[Opiskelija] Jos tavaraa tilat, kuten välien 1 ja 2,
ja sitten sinun piti lisätä jotain 0.
[Hardison] Joo, aivan. Joten jos päätäsi osoitin on aivan lopussa,
tai jos kokoa plus pää on isompi, tai pikemminkin on menossa kietoa jonoon.
>> Joten tässä tilanteessa, että meillä täällä diassa juuri nyt,
jos haluan jonoon jotain juuri nyt,
haluamme jonoon jotain index 0.
Joten jos tarkastellaan missä 50 menee, ja kehotan Aseta jonoon 50,
se menee alas siellä alareunassa. Se menee indeksi 0.
Se korvaa "hi", joka oli jo dequeued.
[Daniel] Älä hoidat että dequeue jo?
Miksi se tee mitään pää Aseta jonoon?
[Hardison] Ai, niin et ole muuttaa pään, anteeksi.
Mutta sinun täytyy käyttää mod operaattori kun olet siirtymässä
elementti, jonka haluat laittaa jonoon kun olet siirtymässä
Seuraava osa jonoon.
[Basil] En tee sitä, ja sain "menestys" on siellä.
[Daniel] Oh, ymmärrän mitä sanot.
[Hardison] Joten didn't - teit kello q.size?
[Basil] Joo. Olen juuri vaihtanut puolia en tee mitään päähän.
[Hardison] Sinun ei oikeastaan ​​tarvitse palauttaa pään olla mitään,
mutta kun indeksinä jouset array,
sinun todella täytyy mennä eteenpäin ja laskea missä seuraava elementti on,
koska withe pino, seuraava osa pino oli aina
on indeksi, joka vastaa kokoa.
Jos katsomme taaksepäin ylös meidän pino push-toiminto,
voisimme aina jysäyttää meidän uusi elementti aivan indeksin kokoa.
Kun taas jono, emme voi tehdä sitä
sillä jos me olemme tässä tilanteessa,
jos me enqueued 50 uuden merkkijonon menisi aivan merkkijonot [1]
jotka emme halua tehdä.
Haluamme olla uusi merkkijono mennä indeksi 0.
>> Onko kukaan - kyllä? [Opiskelija] Minulla on kysymys, mutta se ei varsinaisesti liity.
Mitä se tarkoittaa, kun joku vain pyytää jotain pred osoitin?
Mikä on se nimi lyhenne? Tiedän, että se on vain nimi.
[Hardison] Pred osoitin? Katsotaanpa. Missä yhteydessä?
[Student] Se oli insertti. Voin kysyä myöhemmin, jos haluat
koska se ei varsinaisesti liity, mutta minä vain -
[Hardison] Daavidin insertti koodin luento?
Voimme vetää, että ylös ja puhua siitä.
Puhumme siitä ensi kerran saamme linkitettyjä listoja.
>> Joten todella nopeasti katsoa, ​​mitä Aseta jonoon toiminto näyttää.
Mikä oli ensimmäinen asia, että ihmiset yrittivät tehdä oman Aseta jonoon linja? Tähän jonoon?
Samanlaisia ​​mitä teit pinon työntää.
Mitä teit, Stella?
[Stella, käsittämättömällä]
[Hardison] Aivan. Jos (q.size == kapasiteetti) -
Minun täytyy laittaa henkselit oikeassa paikassa - palauttaa false.
Lähennä hieman. Okei.
Nyt mitä seuraava asia, että meidän piti tehdä?
Aivan kuten pino, ja lisätään oikeaan paikkaan.
Ja niin mikä oli oikea paikka lisätä, että?
Kanssa pino oli indeksin kokoa, tämä se ei ole aivan niin.
[Daniel] Olen q.head--tai - >> q.strings? >> Joo.
q.strings [q.head + q.size mod KAPASITEETTI]?
[Hardison] Me varmaan laittaa sulkeet ympärillä
jotta saamme tarvittavat edelle ja niin se cleart kaikille.
Ja asetetaan se tasa-arvoisia? >> STR? >> STR. Suuri.
Ja nyt, mitä on viimeinen asia, että meidän täytyy tehdä?
Aivan kuten teimme pinossa. >> Increment koko? >> Increment kokoa.
Boom. Ja sitten, koska käynnistin koodi juuri palannut vääriä oletuksena,
haluamme muuttaa arvoksi true, jos kaikki menee läpi ja kaikki menee hyvin.
Selvä. Se on paljon tietoa osiossa.
Emme ole aivan yli. Haluamme puhua todella nopeasti noin yksin-linkitettyjen listojen.
Laitan tämän niin voimme palata siihen myöhemmin.
Mutta mennään takaisin meidän esityksen vain muutaman dioja.
Joten Aseta jonoon on TODO, nyt olemme tehneet sen.
>> Nyt katsomaan yksin-linkitettyjen listojen.
Puhuimme näistä vähän enemmän luennossa.
Kuinka moni teistä nähnyt demon, jossa meillä oli ihmisiä
hankalasti osoittavat toisilleen ja hallussapidosta numeroita? >> Olin siinä.
>> Mitä olette mieltä? Oliko se toivottavasti selventäisi nämä vähän?
Kanssa luettelon, käy ilmi, että me käsittelemme tätä tyyppiä aiomme kutsua solmuun.
Kun taas jono ja pino meillä oli tietueet, että olimme kutsumme jono pino,
meillä oli nämä uudet jono pino tyyppejä,
Tässä lista on todella vain koostuu joukko solmuja.
Samalla tavoin, että jouset ovat vain joukko merkkiä kaikki riviin vierekkäin.
Linkitetty lista on vain solmun ja toisen solmun ja toisen solmun ja toisen solmun.
Ja sen sijaan Smashing kaikki solmut yhteen ja tallentamalla ne vierekkäisesti
kaikki aivan toistensa muistiin,
ottaa tämä seuraava osoitin antaa meille mahdollisuuden tallentaa solmut missä, satunnaisesti.
Ja sitten sellainen lanka ne kaikki yhteen kohtaan yhdestä seuraavaan.
>> Ja mikä oli suuri etu, että tämä oli yli array?
Yli varastointi kaiken vierekkäin aivan kiinni vierekkäin?
Muistatko? Niin? >> Dynaaminen muisti jako?
>> Dynaaminen muisti jako missä mielessä?
[Student] Tässä voit pitää tehdä se isompi ja sinun ei tarvitse siirtää koko array?
[Hardison] Aivan. Joten array, kun haluat laittaa uuden elementin keskellä,
sinun täytyy siirtää kaiken tehdä tilaa.
Ja kuten puhuimme kanssa jonoon,
Siksi pidämme että pää osoitin,
jotta emme jatkuvasti muuttuvia asioita.
Koska se saa kallista, jos sinulla on iso joukko
ja olet jatkuvasti tekee näitä satunnaisia ​​lisäyksiä.
Kun taas listan, sinun tarvitsee vain heittää se uusi solmu,
Säädä osoittimet, ja olet valmis.
Mitä imee tästä?
Paitsi että se ei ole niin helppoa työstää kuin array? Niin?
[Daniel] No, kai se on paljon vaikeampaa saada erityinen elementti linkitetty lista?
[Hardison] Et voi vain hypätä mielivaltainen elementti keskellä sinun linkitetty lista.
Miten sinun täytyy tehdä sen sijaan? >> Sinun täytyy selata koko juttu.
[Hardison] Joo. Sinun täytyy käydä läpi yksi kerrallaan, yksi kerrallaan.
Se on valtava - se tuskaa.
Mikä muu - on toinen kaatuminen tähän.
[Basil] Et voi mennä eteenpäin ja taaksepäin? Sinun täytyy mennä yhteen suuntaan?
[Hardison] Joo. Miten siis ratkaista se joskus?
[Basil] Kahdesti-linkitettyjä listoja? >> Aivan. On kaksoislaimennettu linkitettyjä listoja.
Myös - Anteeksi?
>> [Sam] Onko se sama kuin käyttämällä pred asia -
Muistin juuri, ei se, mitä pred asia on?
Eikö se välillä kaksinkertaisesti ja yksin?
[Hardison] Katsokaamme mitä hän oli tekemässä.
Joten tässä sitä mennään. Tässä lista koodin.
Täällä meillä on predptr, täällä. Tätäkö puhuit?
Joten tämä oli - hän vapauttaa luettelo ja hän yrittää tallentaa osoittimen siihen.
Tämä ei ole kaksinkertaisesti, yksittäin liitetty-listat.
Voimme puhua tästä myöhemmin lisää, koska tämä puhuu vapauttaa lista
ja haluan näyttää joitakin muita juttuja ensin.
mutta se on vain - se muistaa arvoa PTR
[Student] Voi, se on edeltävän osoitin? >> Joo.
Jotta voimme kasvattaa ptr itsensä ennen kuin sitten vapaa mitä predptr on.
Koska emme voi ilmaiseksi ptr ja soita ptr = ptr seuraavaksi, eikö?
Se olisi huono.
Joten katsotaanpas, takaisin tämä kaveri.
>> Muut huono puoli luetteloista on, että kun taas array
meillä on vain kaikki elementit itse pinottu toistensa vieressä,
Täällä myös ottaneet käyttöön tämän osoitin.
Joten siellä lisää kimpale muistia että emme ottaa käyttöön
jokaisen elementin että olemme varastointi listalta.
Saamme joustavuutta, mutta se tulee kalliiksi.
Sen mukana tulee tällä kertaa kustannuksia,
ja se tulee tämän muistin hinta liian.
Aika siinä mielessä, että meidän on nyt käytävä läpi jokainen alkio
löytää yksi indeksi 10, tai että olisi ollut indeksi 10 array.
>> Vain todella nopeasti, kun kaavio nämä luettelot,
tyypillisesti pidämme kiinni pään luettelon tai ensimmäinen osoitin luettelon
ja huomata, että tämä on totta osoitin.
Se on vain 4 tavua. Se ei ole varsinainen solmu itse.
Niin näet, että sillä ei ole int arvoa siinä, ei ensi osoittimen siihen.
Se on kirjaimellisesti vain osoitin.
Se tulee osoittamaan jotain, joka on todellinen solmu struct.
[Sam] osoittimen nimeltään solmu? >> Tämä on - no. Tämä on osoitin jotain tyyppiä solmun.
Se on osoitin solmuun struct. >> Ai, okei.
Kaavio vasemmalla, koodi oikealla.
Voimme asettaa sen null, mikä on hyvä tapa aloittaa.
Kun kaavio on, sinulla on joko kirjoittaa sen nolla tai laittaa linjan läpi tuolla tavalla.
>> Yksi helpoimmista tavoista työskennellä luetteloihin,
ja pyydämme et niin prepend ja liittää nähdä erot kahden,
mutta panemalla on varmasti helpompaa.
Kun alkuun lisättävä, tämä on silloin, kun - kun prepend (7),
mennä ja luoda solmu struct
ja asetat ensin osoitat sitä, koska nyt, koska me etuliitteen sitä,
se tulee olemaan alussa luettelosta.
Jos me prepend (3), joka luo toisen solmun, mutta nyt 3 tulee ennen 7.
Joten olemme pohjimmiltaan kiire päälle listalta.
Nyt voit nähdä, että prepend, joskus ihmiset kutsuvat sitä työntää,
koska olet työntää uuden elementin päälle luettelossa.
Se on myös helppo poistaa edessä luettelon.
Joten ihmiset usein soittaa että pop.
Ja tällä tavalla, voit emuloida pinon avulla linkitetty lista.
Oho. Anteeksi, nyt olemme joutumassa append. Joten tässä me etuliitteen (7), nyt me prepend (3).
Jos me etuliitteen jotakin muuta päälle tähän luetteloon, jos me etuliitteen (4),
Sitten olisimme 4 ja sitten 3 ja sitten 7.
Joten voisimme pop ja poistaa 4, poista 3, poista 7.
Usein enemmän intuitiivinen tapa ajatella tätä on kanssa append.
Joten olen kaaviona mitä se näyttää kanssa liittää tänne.
Tässä liitteenä (7) ei näytä mitään erilaista
koska siellä on vain yksi elementti luettelossa.
Ja liittämällä (3) laittaa sen lopussa.
Ehkä näet nyt temppu append
on, että koska tiedämme vain jos listan alkuun on,
liittämään listan sinun täytyy kävellä koko matkan läpi listan
päästä loppuun, lopeta, sitten rakentaa solmu ja jysäyttää kaiken alas.
Kytke kaikki jutut ylös.
Joten prepend, kuten juuri repi tämän todella nopeasti,
kun alkuun lisättävä luetteloon, se on melko yksinkertainen.
>> Teet uuden solmun, jota jossain dynaamisen muistin jakamista.
Joten tässä Teemme solmun struct käyttäen malloc.
Joten malloc käytämme siksi että saat varattu muisti meille myöhemmin
koska emme halua tätä - haluamme tätä muistia kestävät pitkään.
Ja saamme osoitin muistitilaa että me juuri jaettu.
Käytämme koko solmun, emme Yhteenvetona kentät.
Emme manuaalisesti tuottaa tavujen,
vaan käytämme sizeof jotta tiedämme saamme sopiva määrä tavuja.
Teemme Testaa että malloc puhelu onnistui.
Tämä on jotain haluat tehdä yleensä.
On nykyaikaiset koneet, loppumassa muisti ei ole jotain, joka on helppo
ellet jaetaan tonneittain tavaraa ja tehdä valtava luettelo,
mutta jos olet rakentamassa kamaa, sano, kuten iPhone tai Android-
sinulla on rajoitettu muisti resursseja, varsinkin jos olet tekemässä jotain intensiivistä.
Joten se on hyvä päästä käytäntöön.
>> Huomaa, että olen käyttänyt pari eri toimintoja täällä
että olet nähnyt, jotka ovat tavallaan uusia.
Joten fprintf on aivan kuten printf
paitsi sen ensimmäinen väite on virta, jolle haluat tulostaa.
Tässä tapauksessa haluamme tulostaa keskivirhe merkkijono
joka on erilainen kuin tavallinen outstream.
Oletuksena se näkyy samassa paikassa.
Se myös tulostaa päätteeseen, mutta voit -
käyttäen näitä komentoja opit, uudelleenohjaus tekniikoita
opit vuonna Tommyn video Harjoitus 4, voit ohjata sen
eri alueilla poistu, täällä, poistuu ohjelman.
Se on pohjimmiltaan kuin palaamassa tärkeimmistä,
paitsi käytämme exit koska täällä paluu ei tee mitään.
Emme ole tärkein, joten paluu ei poistu ohjelmaa kuten haluamme.
Niinpä käytämme exit toiminto ja anna se virhekoodi.
Sitten täällä asetamme uuden solmun arvon alalla, sen minä alan olla yhtä i, ja sitten me lanka sen ylös.
Asetimme uuden solmun vieressä osoitin osoittamaan ensinnäkin,
ja sitten ensimmäinen nyt osoittamaan uuteen solmuun.
Nämä ensimmäiset koodiriviä, olemme todella rakentaa uuden solmun.
Ei kaksi viimeistä riviä tätä toimintoa, mutta ensimmäiset.
Voit itse vetää ulos toiminnon tulee auttaja toimintoa.
Tämä on usein mitä teen on, vedän sen ulos funktio,
Kutsun sitä jotain build solmu,
ja että pitää prepend toiminto melko pieni, se on vain 3 riviä sitten.
Olen soittaa minun rakentaa solmuun toiminto, ja sitten minä johdin kaiken ylös.
>> Viimeinen asia haluan näyttää sinulle,
ja annan sinun tehdä append ja kaikki omalla,
on se, miten iteroida yli luettelo.
On olemassa joukko erilaisia ​​tapoja iteroida yli luettelo.
Tässä tapauksessa aiomme löytää pituuden luettelon.
Joten aloitamme pituus = 0.
Tämä on hyvin samanlainen kirjoittamiseen strlen varten merkkijono.
Tämä on mitä haluan näyttää, tämä silmukka täällä.
Se näyttää jotenkin outoja, se ei ole tavallista int i = 0, i <riippumatta, i + +.
Sen sijaan se alustetaan meidän muuttuja n on listan alussa.
Ja sitten kun meidän iteraattori muuttuja ei ole tyhjä, pidämme menossa.
Tämä johtuu siitä, sopimuksen mukaan, lopussa meidän luettelo on tyhjä.
Ja sitten kasvattaa, eikä tee + +,
linkitetty lista ekvivalentti + + on n = n-> seuraava.
>> Kerron täytät aukot täällä, koska olemme myöhässä.
Mutta pitää tämä mielessä, kun työstät spellr psets.
Linkitettyjä listoja, jos olet täytäntöön hash-taulukko,
varmasti tulla hyvin kätevä.
Ja ottaa tämä idiomi kierrättämiseksi yli asioita tekee elämästä paljon helpompaa, toivottavasti.
Kaikki kysymykset, nopeasti?
[Sam] Aiotteko lähettää täytetty SLL ja SC?
[Hardison] Joo. Lähetän ulos valmiiksi diat ja valmiiksi SLL pino ja queue.cs.
[CS50.TV]