[Powered by Google Translate] [Osa 6] [mukavampaa] [Rob Bowden] [Harvardin yliopisto] [Tämä on CS50.] [CS50.TV] Voimme suunnata osiosta kysymyksiin. Lähetin URL tilaa ennen. Alku osan kysymyksistä sanovat- ilmeisesti en ole täysin unsick-on erittäin helppo kysymys vain mitä Valgrind? Mitä valgrind tehdä? Kukaan halua sanoa mitä valgrind tekee? [Student] Tarkastukset muistivuotoja. Joo, valgrind on yleinen muisti tarkistin. Se, että lopussa, kertoo jos sinulla on muistivuotoja, joka on useimmiten mitä käytämme sitä, koska jos haluat Pärjätäkseen ongelma mennessä tai jos haluat päästä ison aluksella, sinun ole muistivuotoja mitään, ja jos sinulla on muistivuoto, joka et löydä, myös pitää mielessä, että aina, kun avaat tiedoston ja jos et sulje sitä, että on muistivuoto. Monet ihmiset etsivät joitakin solmun että he eivät vapauttaa kun oikeasti, ne eivät sulje sanakirja aivan ensimmäinen askel. Se myös kertoo, jos sinulla on virheellinen lukee tai kirjoittaa, mikä tarkoittaa, jos yrität ja aseta arvo se pään yli kasaan ja se ei tapahdu segmenteille vian mutta valgrind nappaa sen, koska et saa todella kirjoittamista siellä, ja niin sinun ehdottomasti pitäisi olla mitään niitäkään. Miten käytät Valgrind? Miten käytät Valgrind? Se on yleinen kysymys sellainen suorita se ja katsoa lähdön. Lähtö on ylivoimainen paljon kertaa. Mukana on myös hauska virheitä jos jos sinulla on pahasti vialla asia tapahtuu silmukan, niin lopulta se sano, "Aivan liian paljon virheitä. Aion lopettaa laskemisen nyt. " Se on pohjimmiltaan tekstiin lähtö että sinun täytyy jäsentää. Lopulta se kertoo mitään muistivuotoja, että sinulla on, kuinka monta lohkoa, joka voi olla hyödyllinen, koska jos se on yksi lohko unfreed, niin se on yleensä helpompi löytää yli 1000 lohkot unfreed. 1000 lohkot unfreed luultavasti tarkoittaa ettet vapauttaa linkitetyt listat asianmukaisesti tai jotain. Se on Valgrind. Nyt meillä on osassa kysymyksiä, johon ei tarvitse ladata. Voit klikata nimeni ja vedä niitä ylös avaruuteen. Nyt klikkaa minua. Versio 1 on pinon, joka teemme ensin. Versio 2 on jono, ja Revision 3 tulee yksittäin linkitetty lista. Alkaen pois meidän pino. Kuten tässä sanotaan, pino on yksi perus- perustavanlaatuinen tietorakenteita tietojenkäsittelytieteen. Hyvin prototyyppiä esimerkki on pino lokerot ruokasalissa. Se on pohjimmiltaan aina ollaan ottamassa käyttöön pino, joku tulee sanomaan, "Oh, kuten pino tarjottimia." Pärjäät lokerot ylhäällä. Sitten kun menet vetämään tarjotin, ensimmäinen lokero, joka on menossa veti on viimeinen, joka pantiin pinoon. Pino myös kaltaisten tässä sanotaan, meillä on segmentti muistin kutsutaan pino. Ja miksi sitä kutsutaan pino? Koska kuten pino tietorakenne, se työntää ja ponnahtaa pino kehykset pino, jos pino kehyksiä ovat kuin erityinen kutsu funktion. Ja kuten pino, sinulla on aina palata alkaen toiminto soittaa ennen kuin voit saada alas alempaan pinoon kehyksiä uudelleen. Et voi olla pääasiallinen puhelu foo puhelun baari ja baari palata päävalikkoon suoraan. Se on aina saanut seurata oikea pino työntämällä ja paukkuu. Kaksi operaatiota, kuten sanoin, ovat push ja pop. Ne ovat universaaleja ehtoja. Sinun pitäisi tietää push ja pop kannalta pinot mitä. Näemme jonot ovat tavallaan erilaisia. Se ei todellakaan ole yleinen termi, mutta push ja pop ovat yleismaailmallisia ja pinot. Push on vain laittaa pinon. Pop on otettava pois pinosta. Ja näemme täällä meillä typedef struct pino, joten meillä on char ** jouset. Älkää pelottaa mahdolliset **. Tämä tulee lopulta joukko merkkijonoja tai joukko osoittimia merkkiä, jossa viitteitä merkkiä yleensä merkkijonoja. Sen ei tarvitse olla merkkijonoja, mutta täällä, he tulevat olemaan merkkijonoja. Meillä on joukko merkkijonoja. Meillä on koko, joka edustaa sitä, kuinka monta elementtiä ovat tällä hetkellä pinon ja sitten meillä on kapasiteettia, joka on kuinka monta elementtiä voi olla pinoon. Kapasiteetti pitäisi alkaa sillä jotain suurempaa kuin 1, mutta koko on menossa alkajaisiksi kuin 0. Nyt on pohjimmiltaan kolme erilaista tapaa ajatella pino. No, on luultavasti enemmän, mutta kaksi tapaa ovat voit toteuttaa sen avulla array, tai voit toteuttaa sen avulla linkitetty lista. Liittyy luettelot ovat sellaisia ​​triviaaleja tehdä pinot alkaen. Se on erittäin helppo tehdä pinon avulla linkitettyjen listojen, joten tässä, me aiomme tehdä pinon avulla ryhmät, ja sitten käyttämällä taulukoita, siellä on myös kaksi tapaa voit ajatella sitä. Ennen kun sanoin meillä kapasiteetti pinon, joten meillä mahtuu elementti pinoon. Yksi tapa voisi tapahtua on heti osut 10 elementtiä, niin olet valmis. Saatat tietää, että on olemassa yläraja 10 asiaa maailmassa että sinun ei tarvitse koskaan yli 10 asioita teidän pinoon, jolloin voit olla yläraja kokoa pino. Tai sinulla voisi olla oma pino on rajaton, mutta jos teet array, joka tarkoittaa sitä, että joka ikinen kerta osut 10 elementtiä, sitten olet menossa on kasvaa 20 elementtejä, ja kun osut 20 elementtejä, olet menossa on kasvattaa array 30 osia tai 40 elementtejä. Olet menossa on lisättävä kapasiteettia, joka on mitä aiomme tehdä täällä. Joka kerta pääsemme maksimikoko meidän pinon, kun työntää jotain muuta, aiomme lisättävä kapasiteettia. Täällä olemme push ilmoitettu BOOL push (char * str). Char * str on merkkijono ajamme pinoon, ja bool sanoo vain, onko meillä onnistunut tai epäonnistunut. Miten voimme epäonnistua? Mikä on ainoa seikka, että voit ajatella jossa meidän olisi palata väärä? Joo. [Student] Jos se on täynnä, ja käytämme rajoitettu täytäntöönpanoa. Joo, niin miten me määrittelemme-hän vastasi Jos se on täynnä, ja käytämme rajoitettu täytäntöönpanoa. Sitten varmasti palauttaa false. Heti kun me osuma 10 asioita array, emme voi sovi 11, joten palaamme vääriä. Mitä jos se on rajaton? Joo. Jos et voi laajentaa array jostain syystä. Niin, joten muisti on rajallinen resurssi, ja lopulta, jos pidämme kiire pinoon uudestaan ​​ja uudestaan, aiomme yrittää jakaa isompi array sopivaksi suuremman kapasiteetin, ja malloc tai mitä käytämme on menossa palauttaa false. No, malloc palauttaa null. Muista, joka ikinen kerta kun ikinä soittaa malloc, sinun pitäisi tarkistaa, jos se palauttaa null tai muuta, joka on oikeellisuutta vähennys. Koska haluamme olla rajatonta pino, ainoa tapaus aiomme olla palaamassa väärä on jos yritämme lisätä kapasiteettia ja malloc tai mikä palauttaa false. Sitten pop ei ota argumentteja, ja se palauttaa merkkijonon, joka on päällä pinon. Mitä oli viimeksi ajanut pinoon on mitä pop on palaamassa, ja se myös poistaa sen pinosta. Ja huomaa, että se palauttaa null jos ei ole mitään pino. On aina mahdollista, että pino on tyhjä. Java, jos olet tottunut että tai muita kieliä, yrittää pop tyhjästä pinosta saattaa aiheuttaa poikkeuksen tai jotain. Mutta C, null on eräänlainen paljon tapauksia miten käsitellä näitä ongelmia. Palautus null miten aiomme merkitse sitä, että pino oli tyhjä. Olemme edellyttäen koodi, joka testaa pino toiminnallisuutta, toteuttaa push ja pop. Tämä ei ole paljon koodia. Minä-itse, ennen kuin teemme sen, vihje, vihje- jos et ole nähnyt sitä, malloc ei ole ainoa funktio joka jakaa muisti kasaan sinulle. On olemassa perheen alloc toimintoja. Ensimmäinen on malloc, joita olet tottunut. Sitten on calloc, joka ei sama asia kuin malloc, mutta se nollaa kaiken sinusta. Jos olet koskaan halunnut asettaa kaiken null jälkeen mallocing jotain kannattaa juuri käytetty calloc ensimmäinen paikka kirjoittamisen sijaan varten silmukka nollaan ulos koko muistilohko. Realloc on kuin malloc ja on paljon erityistapauksissa, mutta periaatteessa mitä realloc tekee on se vie osoitin, joka oli jo jaettu. Realloc on toiminto, jonka haluat maksaa huomiota täällä. Se vie osoittimen, joka oli jo palannut malloc. Sanotaan, että olet pyytää malloc osoitin 10 tavua. Sitten myöhemmin huomaat halunnut 20 tavua, niin soitat realloc tästä osoitinta 20 tavua, ja realloc automaattisesti kopioida kaiken puolestasi. Jos soitti juuri malloc taas, kuten olen lohkon 10 tavua. Nyt tarvitsen korttelin 20 tavua, joten jos en malloc 20 tavua, niin minun täytyy manuaalisesti kopioida 10 tavua ensimmäinen asia osaksi toinen asia ja sitten vapaa ensimmäinen asia. Realloc hoitaa sen puolestasi. Huomaa allekirjoitus tulee mitättömäksi * joka on juuri palaamassa osoittimen muistilohko, Sitten void * ptr. Voit ajatella void * kuin yleinen osoitin. Yleensä et koskaan käsitellä void * mutta malloc on palaamassa void *, ja sitten se vain käyttää kuten Tämä on todellakin olemaan char *. Edellisen void *, joka oli palauttanut malloc on nyt menossa välittämisen realloc, ja sitten koko on uusi tavujen haluat jakaa, joten uutta kapasiteettia. Annan teille pari minuuttia, ja tehdä se meidän avaruudessa. Aloita Revision 1. Lopetan sinulle, kun toivottavasti siitä riittävästi aikaa toteuttaa push, ja sitten minä annan sinulle toisen tauon tehdä pop. Mutta se ei todellakaan ole niin paljon koodia ollenkaan. Eniten koodi on todennäköisesti laajenee kamaa, laajentaa kapasiteettia. Okei, ei paineen täysin valmis, mutta niin kauan kuin tuntuu olet oikealla tiellä, se on hyvä. Onko kellään mitään koodia he tuntevat olonsa mukavaksi minut vetämällä ylös? Joo, minä tahdon, mutta ei kellään mitään koodia voin vetää? Okei, voit aloittaa, tallenna se, mikä se on? Olen aina unohtaa tämän vaiheen. Okei, katsomalla push, Haluatko selittää koodi? [Student] Ensinnäkin, olen kasvanut koko. Luulen ehkä minun pitäisi olla että-tapauksessa, olen kasvanut kokoa, ja näen jos se on vähemmän kuin kapasiteetti. Ja jos se on vähemmän kuin kapasiteetti, minä lisätä array että meillä on jo. Ja jos se ei ole, minä kerrotaan kapasiteettia 2, ja minä kohdentaa jouset matriisi jotain suurempaa kapasiteettia koko nyt. Ja sitten jos se epäonnistuu, kerron käyttäjä ja palauttaa false, ja jos se on hienoa, niin laitoin merkkijono uuden paikan. [Rob B.] Huomaa myös, että käytimme kiva bittioperaattori täällä moninkertaistaa 2. Muista, vasen shift on aina menossa kerrotaan 2. OIKEA VAIHTO jaetaan 2 kunhan muistaa että se tarkoittaa jaat 2 kuten kokonaisluku jaettuna 2. Se voi katkaista 1 siellä tai täällä. Mutta muutos vasemmalle 1 on aina menossa kerrotaan 2, ellet ylivuoto rajat kokonaisluku, ja sitten se ei ole. Puoli kommentti. Haluan tehdä-tämä ei tule muuttaa koodausta millään tavoin, mutta haluan tehdä jotain tällaista. Se todella aikoo tehdä hieman pitempi. Ehkä tämä ei ole täydellinen tapaus osoittaa tämän, mutta haluan segmenttiin se nämä lohkot- Okei, jos tämä jos tapahtuu, niin aion tehdä jotain, ja tämän jälkeen funktio on tehty. En tarvitse vieritä sitten silmäni kokonaan alas toiminto mitä tapahtuu sen jälkeen muuta. Se jos tämä jos tapahtuu, niin juuri palata. Se on myös mukava lisäetu kaiken yli tämän Nyt siirtyvät vasemmalle kerran. En enää tarvitse, jos joskus lähellä naurettavan pitkät rivit, Sitten ne 4 tavua auttaa, ja myös enemmän vasemmalle jotain, vähemmän hukkua sinusta tuntuisi, jos haluat-okei, minun täytyy muistaa Olen tällä hetkellä taas silmukka sisällä muuta sisällä ja silmukka. Anywhere voit tehdä paluun välittömästi, olen sellainen kuin. Se on täysin vapaaehtoista, eikä odoteta millään tavalla. [Student] Olisiko koko - in fail kunnossa? Fail ehto täällä emme onnistuneet realloc, niin kyllä. Huomaa miten epäonnistuu kunnossa, oletettavasti, ellemme ilmaista tavaraa myöhemmin, olemme aina menossa epäonnistua ei väliä kuinka monta kertaa yritämme työntää jotain. Jos pidämme työntää, pidämme mukaa kokoa, vaikka emme esitä mitään pinoon. Yleensä emme kasvattaa kokoa, kunnes kun olemme menestyksekkäästi laittaa sen pinoon. Tekisimme sitä, sano, joko täällä ja täällä. Ja sitten vaan sanoa s.size ≤ kapasiteettia, se on vähemmän kuin kapasiteetti, vain siksi muutimme missä kaikki oli. Ja muistakaa, ainoa paikka, voisimme mahdollisesti palauttaa false on täällä, missä realloc palasi null, ja jos satut muistamaan keskivirhe, ehkä voit harkita tätä jos haluat tulostaa keskivirhe, joten fprintf stderr eikä vain tulostaa suoraan standardin ulos. Jälleen, se ei ole odotuksia, mutta jos se on virhe, kirjoita printf, sinun kannattaa tehdä se tulostaa keskivirhe sijaan standardin ulos. Kellään mitään muuta todeta? Kyllä. [Opiskelija] Voitko mennä yli [kuulumattomissa]? [Rob B.] Kyllä, varsinainen binariness sitä tai mitä se on? [Opiskelija] Eli kerrot sen 2? [Rob B.] Joo, periaatteessa. Vuonna binary maa, meillä on aina meidän joukko numeroita. Siirtyminen tämä vasempana 1 pohjimmiltaan lisää sitä täällä oikealla puolella. Takaisin tähän, vain muistaa, että kaikki binary on teho 2, joten tämä merkitsee 2 0, Tämän 2 1, tämä 2 2. Lisäämällä 0 oikealle puolelle nyt, me vain siirtää kaiken yli. Mihin on 2 0 on nyt 2 1, on 2 2. Oikea puoli, että lisätään välttämättä olemaan 0, mikä on järkevää. Jos joskus kerrotaan numeron 2, se ei aio päätyä pariton, niin 2 0 paikkaan pitäisi olla 0, ja tämä on mitä olen puoli varoitti ennen on jos sattuu siirtää pidemmälle bittien lukumäärä on kokonaisluku, tämä 1 on menossa päätyä menee pois. Se on ainoa huoli, jos satut olemaan tekemisissä todella suuri kapasiteetti. Mutta siinä vaiheessa, niin olet tekemisissä joukko miljardeja asioita, jotka eivät ehkä sovi muistiin muutenkin. Nyt voimme saada pop, mikä on vieläkin helpompaa. Voisit Do It Like jos satut pop koko joukko, ja nyt olet puoli kapasiteetista uudelleen. Voisit realloc kutistua määrä muistia sinulla on, mutta sinun ei tarvitse huolehtia siitä, joten ainoa realloc tapaus tulee olemaan kasvaa muisti, ei koskaan kutistuu muisti, joka aikoo tehdä pop super helppoa. Nyt jonot, jotka tulevat olemaan kuten pinoja, mutta jotta otat asiat käännetään. Prototyyppiä esimerkki jono on linja, joten kai jos olisit Englanti, olisin sanonut prototyyppiä esimerkki jono on jono. Niin kuin viiva, jos olet ensimmäinen henkilö vastaa, odotat olla ensimmäinen henkilö pois linja. Jos olet viimeinen henkilö vastaamaan, aiot olla viimeinen henkilö huollettu. Vaadimme, että FIFO malli, kun taas pino oli LIFO malli. Nuo sanat ovat melko yleismaailmallisia. Kuten pinot ja toisin kuin ryhmät, jonot eivät tyypillisesti salli pääsyä elementtien keskellä. Tässä pino, meillä on push ja pop. Täällä satumme heidät kutsunut Aseta jonoon ja dequeue. Olen myös kuullut heitä kutsuttavan muutos ja unshift. Olen kuullut ihmisten sanovan push ja pop koskemaan myös jonoja. Olen kuullut lisätä, poistaa, niin push ja pop, jos puhut pinoja, olet työntää ja popping. Jos puhut jonot, voit valita sanoja haluat käyttää asetettavaksi ja poisto, ja ei ole yksimielisyyttä siitä, mitä sen pitäisi olla nimeltään. Mutta täällä meillä on Aseta jonoon ja dequeue. Nyt struct näyttää lähes identtinen pinon struct. Mutta meidän täytyy seurata pään. Kai se kertoo tänne, mutta miksi me tarvitsemme pään? Prototyypit ovat periaatteessa samanlaisia ​​työntää ja pop. Voit ajatella sitä push ja pop. Ainoa ero on, pop on palaamassa-sijasta viimeksi, se palaa ensimmäiseen. 2, 1, 3, 4, tai jotain. Ja tässä on alku. Meidän jono on aivan täynnä, joten siellä on neljä elementtiä siinä. Lopussa meidän jono on tällä hetkellä 2, ja nyt mennään lisätä jotain muuta. Kun haluamme lisätä että jotain muuta, mitä teimme pinon version on laajensimme lohko muistia. Mikä ongelma tässä? [Student] Siirrät 2. Mitä minä sanoin siitä loppua jonon, Tässä ei ole mitään järkeä, että aloitamme klo 1, sitten haluamme dequeue 1, sitten dequeue 3, sitten dequeue 4, Sitten dequeue 2, sitten dequeue tämä yksi. Emme voi käyttää realloc nyt, tai ainakin, sinun täytyy käyttää realloc eri tavalla. Mutta luultavasti ei pitäisi vain käyttää realloc. Olet menossa on manuaalisesti kopioida muistiin. On olemassa kaksi funktiota kopioida muistiin. On memcopy ja memmove. Olen tällä hetkellä käsittelyssä man sivujen nähdä kumpi olet menossa halua käyttää. Okei, memcopy, ero on että memcopy ja memmove, yksi käsittelee tapauksessa oikein missä olet kopiointi alueeksi, joka sattuu päällekkäin alueelle olet kopiointi. Memcopy ei käsittele sitä. Memmove tekee. Voit ajatella ongelman- sanokaamme haluan kopioida tämä kaveri, nämä neljä tämän kaverin. Lopulta mitä array pitäisi näyttää sen jälkeen, kun kappale on 2, 1, 2, 1, 3, 4, ja sitten joitakin juttuja lopussa. Mutta tämä riippuu siitä, missä järjestyksessä me itse asiassa kopioida, sillä jos emme pidä siitä, että alueella olemme kopioit päällekkäisyydet yksi olemme kopiointi, Sitten voisimme tehdä kuten alku täällä, kopioi 2 siihen paikkaan haluamme mennä, Sitten siirrymme osoittimia eteenpäin. Nyt aiomme olla täällä ja täällä, ja nyt haluamme kopioida tämä kaveri tänä kaveri ja siirtyä meidän viitteitä eteenpäin. Mitä aiomme lopulta saada on 2, 1, 2, 1, 2, 1 sijasta sopivaa 2, 1, 2, 1, 3, 4, koska 2, 1 syrjäytti alkuperäinen 3, 4. Memmove käsittelee sitä oikein. Tässä tapauksessa pohjimmiltaan vain aina memmove koska se käsittelee sitä oikein. Se ei yleensä suorita mitään pahempaa. Ajatuksena on, sen sijaan, että alusta alkaen ja kopiointi tällä tavalla kuten teimme täällä, se alkaa lopusta ja kopioi, ja siinä tapauksessa, et voi koskaan olla ongelma. Ei ole suorituskykyä menetetään. Käytä aina memmove. Koskaan murehtia memcopy. Ja siitä minne olet menossa on erikseen memmove kääritty-around osan jonoon. Ei hätää, jos ei kokonaan tehty. Tämä on vaikeampaa kuin pino, push ja pop. Kellään mitään koodia voisimme työskennellä? Vaikka täysin keskeneräinen? [Student] Joo, se on täysin puutteellinen, vaikka. Täysin keskeneräinen on hyvä niin kauan kuin me-voit tallentaa tarkistamista? Unohdan, että joka ikinen kerta. Okei, unohdetaan mitä tapahtuu, kun meidän kokoa asioita. Täysin huomiotta resize. Selitä tämä koodi. Olen tarkistaa ensin, jos koko on pienempi kuin kopio ensinnäkin ja sitten sen jälkeen, asetan-Otan head + koko, ja olen varmista, että se kiertyy kapasiteetti array, ja asetan uuden merkkijonon kyseisessä asemassa. Sitten kasvattaa kokoa ja palauttaa true. [Rob B.] Tämä on ehdottomasti yksi niistä tapauksista, joissa olet menossa halua käyttää mod. Kaikenlainen jos olet kiertyy, jos luulet kiertyy, välitön ajatus olisi mod. Koska nopea optimointi / tee koodi yhden rivin lyhyempi, huomaat että linja heti tämä on vain koko + +, joten voit yhdistää sen osaksi tätä linjaa, koko + +. Nyt tänne, meillä on tapaus jos meillä ei ole tarpeeksi muistia, niin lisäämme kapasiteettia 2. Kai voisi olla sama ongelma, mutta emme voi sivuuttaa sitä nyt, jos jos ei lisätä kapasiteettia, sitten olet menossa halua laskea kapasiteettia 2 uudelleen. Toinen lyhyt viesti on aivan kuten voit tehdä + =, Voit myös tehdä << =. Lähes mitä tahansa voi mennä ennen yhtä, + =, | =, & =, << =. Char * uusi on meidän uusi lohko muistia. Oh, tänne. Mitä ihmiset ajattelevat tyypistä uuden lohkon muistia? [Opiskelijan] Olisi char **. Thinking takaisin meidän struct täällä, strings me uudelleen kohdentamiseen. Teemme koko uusi dynaaminen varastointi elementtejä jonossa. Mitä aiomme olla määrittämällä teidän strings on mitä me mallocing juuri nyt, ja niin uudet tulee olemaan char **. Se tulee olemaan joukko merkkijonoja. Mikä sitten on kyse, jonka aiomme palata väärä? [Student] Pitäisikö meidän tehdä char *? [Rob B.] Kyllä, hyvä soittaa. [Opiskelija] Mikä se oli? [Rob B.] Halusimme tehdä koko char * koska emme enää- Tämä olisi todella suuri ongelma, koska sizeof (char) olisi 1. Sizeof char * tulee olemaan 4, niin paljon kertaa, kun olet tekemisissä ints, sinulla on taipumus saada pois, koska koko int ja koko int * on 32-bittinen järjestelmä aiotaan sama asia. Mutta täällä, sizeof (char) ja sizeof (char *) nyt olemaan sama asia. Mikä on seikka, jossa palaamme väärä? [Opiskelija] Uusi on null. Joo, jos uusi on nolla, palaamme vääriä, ja aion heittää tänne- [Student] [kuulumattomissa] [Rob B.] Joo, tämä on hieno. Voisit joko tehdä 2 kertaa kapasiteettia tai kapasiteetin muutos 1 ja sitten vain asettaa se tänne tai jotain. Teemme sen kuin meillä oli sitä. Kapasiteetti >> = 1. Ja et koskaan tarvitse huolehtia menettää 1 paikka koska jätit siirretään 1, joten 1 paikka on väistämättä 0, joten oikea Siirtämällä 1, olet silti olemaan hieno. [Opiskelija] Haluatko tehdä sen ennen palauttamista? [Rob B.] Kyllä, tämä ei ole mitään järkeä. Nyt oletetaan, aiomme päätyä takaisin uskollisena loppuun. Miten aiomme tehdä näitä memmoves, meidän on oltava varovaisia, kuinka teemme niitä. Onko kellään mitään ehdotuksia, miten voimme tehdä niitä? Tässä meidän alku. Väistämättä, haluamme aloittaa alusta uudelleen ja kopioi asioita sieltä, 1, 3, 4, 2. Miten teet sen? Ensinnäkin minun täytyy katsoa man-sivulla memmove uudelleen. Memmove, argumenttien järjestystä on aina tärkeää. Haluamme määränpää ensimmäinen, lähde toinen koko kolmas. On paljon toimintoja, jotka kääntää lähde ja kohde. Kohde, lähde yleensä oltava jonkin verran. Siirrä, mitä se palaa? Se palauttaa osoittimen määränpäähän, jostain syystä haluat ehkä että. Voin kuvitella lukea sitä, mutta haluamme siirtyä päämääräämme. Mikä on meidän määränpää aiotaan? [Student] New. [Rob B.] Kyllä, ja minne olemme kopioit? Ensimmäiseksi meidän kopioit tämä 1, 3, 4. Mikä on-tämän 1, 3, 4. Mikä on osoite tämän 1? Mikä on osoite, että 1? [Student] [kuulumattomissa] [Rob B.] Head + osoitteen ensimmäinen osa. Miten saamme ensimmäisen alkion array? [Student] jonoon. [Rob B.] Kyllä, q.strings. Muista, täällä, meidän pää on 1. Darn sitä. Minusta se on maagisesti- Täällä meidän pään on 1. Aion muuttaa väriä liikaa. Ja tässä on jouset. Tämä voimme joko kirjoittaa sen teimme täällä päineen + q.strings. Monet ihmiset myös kirjoittaa ja q.strings [pää]. Tämä ei ole oikeastaan ​​yhtään tehottomampaa. Saatat ajatella sitä olet dereferencing ja sitten saada osoite, mutta kääntäjä on menossa kääntää sitä, mitä meillä oli ennen muutenkin q.strings + pää. Joko niin haluat ajatella sitä. Ja kuinka monta tavua haluamme kopioida? [Student] Capacity - head. Kapasiteetti - head. Ja sitten voit aina kirjoittaa esimerkiksi selvittää, jos se on oikein. [Student] On syytä jaettuna 2 sitten. Joo, niin kai voisimme käyttää kokoa. Meillä on vielä koko on- käyttäen koko, meillä on kooltaan yhtä suuri kuin 4. Meidän koko on 4. Meidän pää on 1. Haluamme kopioida nämä 3 elementtiä. Se järki tarkistaa, että koko - pää on oikein 3. Ja palata tänne, kuten sanoin, jos käytämme kapasiteettia, niin olisimme jakaa 2 koska olemme jo kasvaneet kykymme, joten sen sijaan, aiomme käyttää kokoa. Se kopioiden osa. Nyt meidän täytyy kopioida toisen osan, osa, joka on jäljellä alkua. Että menee memmove, mitä asentoon? [Student] Plus size - head. Kyllä, joten olemme jo kopioitu koko - head tavua, joten jos haluamme kopioida jäljellä tavua on uusi ja sitten koko miinus-hyvin, tavujen olemme jo kopioitu sisään Ja sitten jos me kopioit? [Student] Q.strings [0]. [Rob B.] Kyllä, q.strings. Voisimme joko tehdä & q.strings [0]. Tämä on huomattavasti harvinaisempaa kuin tämä. Jos se on vain olemaan 0, niin sinun on taipumus nähdä q.strings. Siellä olemme kopiointi. Kuinka monta tavua meillä on jäljellä kopioida? >> [Student] 10. Oikea. [Student] Täytyykö meidän kertoa 5-10 kertaa koko tavua tai jotain? Joo, niin tämä on silloin, mitä me kopiointi? [Student] [kuulumattomissa] Mikä on sen tyyppinen asia, olemme kopiointi? [Student] [kuulumattomissa] Joo, niin char * s, että olemme kopiointi, emme tiedä missä ne ovat lähtöisin. No, jos he osoittavat, kuten jouset, päädymme työntämällä se kiinni jono tai enqueuing päälle jonoon. Jos nämä tulevat, meillä ei ole aavistustakaan. Meidän tarvitsee vain seurata char * s itse. Emme halua kopioida koko - head tavua. Haluamme kopioida koko - head char * s, joten aiomme kertoa tämän sizeof (char *). Sama täällä, pää * sizeof (char *). [Opiskelija] Entä [kuulumattomissa]? Tämä täällä? [Student] Ei, alle, koko - pään. [Rob B.] Tämä täällä? Pointer aritmeettinen. Miten osoitin aritmeettinen on menossa töihin on se automaattisesti kertoo koon tyyppiä että olemme tekemisissä. Aivan kuten täällä, uusi + (size - head) vastaa täsmälleen & New [size - head] kunnes odotamme toimisi oikein, sillä jos olemme tekemisissä int array, niin emme indeksiin int- tai jos se on kooltaan 5 ja haluat 4. elementti, sitten indeksinä int array [4]. You älä-[4] * koko int. Joka käsittelee sitä automaattisesti, ja tässä tapauksessa on kirjaimellisesti vastaava, joten kannatin syntaksia on vain menossa muunnetaan tämän heti kääntää. Se on jotain sinun täytyy olla varovainen, että Kun lisäät koko - head lisäät ole yksi tavu. Olet lisäämällä yksi char *, joka voi olla yksi tavua tai mitä tahansa. Muita kysymyksiä? Okei, dequeue tulee olemaan helpompaa. Annan sinulle hetken toteuttaa. Niin, ja kai tämä on sama tilanne, jossa Mitä Aseta jonoon tapauksessa, jos olemme enqueuing null, Ehkä haluamme käsitellä sitä, ehkä emme. Emme tee sitä uudestaan ​​täällä, mutta sama kuin meidän pino tapauksessa. Jos me jonoon null, saatamme haluta jättää sen. Kellään koodia voin vetää? [Opiskelija] Minulla on vain dequeue. Versio 2 on se-kunnossa. Haluat selittää? [Student] Ensin varmista siellä on jotain jonossa ja että koko menee alas 1. Sinun täytyy tehdä se, ja sitten palaat pään ja sitten siirtyä pää ylöspäin 1. Okei, joten on nurkassa tapauksessa meidän on harkittava. Joo. [Student] Jos pää on viimeinen osa, niin et halua päätä kohtaan ulkopuolella jono. Joo, niin heti pää osuu lopussa meidän array, kun me dequeue, meidän pidä pää modded takaisin 0. Valitettavasti emme voi tehdä yhdessä vaiheessa. Luulen niin olisin varmaan korjata se Tämä tulee olemaan char *, mitä olemme palaamassa, mikä tahansa muuttujan nimeä haluaa olla. Sitten haluamme mod päähän meidän kapasiteettia ja sitten palata ret. Monet täällä he voisivat tehdä, Tässä on kyse, you'll nähdä ihmiset tekevät, jos pää on suurempi kuin kapasiteetti, tee pää - kapasiteettia. Ja juuri työskentelee noin mitä mod on. Head mod = kapasiteetti on paljon puhtaampaa on kääre ympärille kuin jos pää on suurempi kuin kapasiteetti pää - kapasiteetti. Kysymyksiä? Okei, viimeinen asia, jota on jäljellä meidän linkitetty lista. Saatat käyttää joitakin linkitetty lista käyttäytymistä, jos teit linkitettyjä listoja teidän hash taulukoita, jos teit hash taulukon. Suosittelen lämpimästi tekemään hash taulukon. Olet ehkä jo trie, mutta yrittää on vaikeampaa. Teoriassa he asymptoottisesti parempi. Mutta katsokaa iso aluksella, ja yrittää koskaan tehdä paremmin, ja ne vievät enemmän muistia. Kaikkea tietoa yrittää päätyy huonompi enemmän työtä. Se mitä David Malan n ratkaisu on aina on hän aina viestiä hänen trie ratkaisu, ja katsotaan, missä hän tällä hetkellä on. Mitä hän oli alle, David J? Hän on # 18, niin se ei ole kauhean paha, ja että tulee olemaan yksi parhaista yrittää voit ajatella tai yksi parhaista yrittää on trie. Eikö edes hänen alkuperäinen ratkaisu? Tunnen trie ratkaisut ovat yleensä tällä alueella RAM usage. Siirry alas hyvin alkuun, ja RAM käyttö on yksinumeroinen. Mene alas kohti pohjaa, ja sitten alkaa nähdä yrittää jossa saat aivan massiivinen RAM usage, ja yrittää ovat vaikeampia. Ei täysin sen arvoista, mutta opettavainen kokemus, jos teit yksi. Viimeinen asia on meidän linkitetty lista, ja nämä kolme asiaa, pinot, jonot ja linkitettyjen listojen, tulevien asia mitä tehdä tietotekniikassa olettaa sinun on tunnettava nämä asiat. Ne ovat vain niin keskeinen kaiken. Liittyy luettelot, ja tässä olemme yksin linkitetty lista tulee olemaan meidän toteuttamiseen. Mitä yksittäin liittyy tarkoita verrattuna kaksinkertaisesti linkitetty? Kyllä. [Student] Se vain osoittaa seuraavan osoittimen pikemminkin kuin osoittimia, kuten yksi sitä edeltävän ja yhden sen jälkeen. Joo, niin kuvaformaatti, mitä minä juuri teen? Minulla on kaksi asiaa. Olen kuva ja kuva. Vuonna kuvaformaatti, meidän yksittäin linkitettyjä listoja, väistämättä, meillä on jonkinlainen osoitin johtaja listallamme, ja sitten sisällä meidän lista, meillä on vain viitteitä, ja ehkä tämä viittaa null. Se tulee olemaan teidän tyypillinen piirros erikseen linkitetty lista. Kaksinkertaisesti linkitetty lista, voit mennä taaksepäin. Jos annan sinulle mitään solmu luettelossa, voit välttämättä saada kaikki muut solmun luettelosta, jos se on kaksin verroin linkitetty lista. Mutta jos saan sinut kolmannen solmun luettelosta ja se yksinään linkitetty lista, no miten olet ikinä päästä ensimmäisen ja toisen solmut. Ja siellä Hyötyjen ja haittojen, ja yksi ilmeinen on otat enemmän kokoa, ja sinun täytyy seurata, jos nämä asiat osoittavat nyt. Mutta me vain välitä yksin toisiinsa. Muutamia asioita aiomme tarvitse toteuttaa. Sinun typedef struct solmu, int i: struct node * seuraava; solmu. Tämä typedef olisi poltettu mielenne. Quiz 1 olisi haluaisin antaa typedef on linkitetty lista solmu, ja sinun pitäisi pystyä heti raapustaa että alas edes ajatellut sitä. Luulen pari kysymystä, miksi tarvitsemme rakenteeseen sisältyvää täällä? Miksi emme voi sanoa solmu *? [Student] [kuulumattomissa] Joo. Ainoa asia, joka määrittelee solmun asia on typedef itse. Mutta tässä vaiheessa, kun olemme eräänlainen jäsennys kautta struct solmu määritelmä, emme ole valmiita meidän typedef vielä, joten sillä typedef ole päättynyt, solmu ei ole olemassa. Mutta struct solmu tekee, ja tämä solmu täällä, Tämän voisi kutsua myös jotain muuta. Tätä voitaisiin kutsua n. Se voisi olla nimeltään linkitetyn listan solmu. Se voisi olla nimeltään mitään. Mutta tämä struct solmun tarvitsee kutsua sama asia kuin tämä struct solmu. Mitä te kutsutte tämä on myös täällä, ja niin, että myös vastaa toisen pisteen kysymyksen minkä vuoksi-Monta kertaa kun näet tietueet ja typedefs sekä tietueet, näet nimetön tietueet jossa voit vain nähdä typedef struct, täytäntöönpanon struct, sanakirja, tai mitä tahansa. Miksi täällä meidän täytyy sanoa solmuun? Miksei se olla nimetön struct? Se on melkein sama vastaus. [Student] Sinun täytyy viitata sen sisällä struct. Joo, sisällä struct, sinun täytyy viitata struct itse. Jos et anna struct nimi, jos se on nimetön struct, et voi viitata siihen. Ja viimeisenä mutta ei vähäisimpänä, näiden kaikkien pitäisi olla hieman yksinkertainen, ja niiden pitäisi auttaa sinua ymmärtämään, jos olet kirjallisesti tämän alas että teet jotain väärin, jos näitä puheita ei ole järkeä. Viimeisenä mutta ei vähäisimpänä, miksi tämä olla struct solmu *? Miksei se vain saa rakenteeseen sisältyvää solmu seuraavaksi? [Student] Pointer seuraavaan struct. Se väistämättä mitä me haluamme. Miksi se voisi koskaan olla struct solmu seuraavaksi? Miksi se pitää olla struct solmu * seuraavaksi? Joo. [Student] Se on kuin loputon silmukka. Joo. [Student] Olisi kaikki olla yhdessä. Joo, ajatelkaa kuinka me tekisimme koko tai jotain. Koko struct on periaatteessa + tai - jonkin kuvion täällä tai siellä. Se on pohjimmiltaan olemaan summa koot asioita struct. Tämä täällä muuttamatta mitään, koko tulee olemaan helppoa. Koko struct solmu tulee olemaan koko i + koko on seuraava. Koko i tulee olemaan 4. Koko on seuraava tulee olemaan 4. Koko struct solmu tulee olemaan 8. Jos meillä ei ole *, ajattelen sizeof, Sitten sizeof (i) tulee olemaan 4. Koko struct solmun vieressä tulee olemaan koko i + koko struct solmun ensi + Koko i + koko struct solmu seuraavaksi. Se olisi ääretön rekursion solmuja. Siksi tämä on, miten asiat on. Jälleen ehdottomasti muistaa, että tai ainakin ymmärtää sitä tarpeeksi, että voit pystyä Syy kautta miltä pitäisi näyttää. Asiat aiomme haluavat toteuttaa. Jos listan pituus- voit huijata ja pitää ympärillä maailmanlaajuinen pituus tai jotain, mutta emme aio tehdä sitä. Aiomme laskea listan pituus. Olemme sisältää, niin että on pohjimmiltaan kuin haku- joten meillä on linkitetty lista kokonaislukuja, onko tämä kokonaisluku on linkitetty lista. Prepend on menossa lisätä alussa luettelosta. Append on menossa lisätä lopussa. Insert_sorted on menossa lisätä osaksi järjestetty paikkaan luettelossa. Insert_sorted sellainen oletetaan, että olet koskaan käyttänyt prepend tai liittää huonossa tavoilla. Insert_sorted kun olet toteuttamisessa insert_sorted- Sanotaan meillä on linkitetty lista. Tämä on mitä se tällä hetkellä näyttää, 2, 4, 5. Haluan lisätä 3, niin kauan kuin luetteloa on jo järjestetty, se on helppo löytää, jos 3 kuuluu. En aloittaa 2. Okei, 3 on suurempi kuin 2, joten haluan jatkaa. Oh, 4 on liian iso, joten tiedän 3 tulee mennä välillä 2 ja 4, ja minun täytyy korjata osoittimia ja kaikkea sellaista. Mutta jos emme ehdottomasti käyttää insert_sorted, kuten Sanotaan vain minä alkuun lisättävä 6, sitten minun linkitetty lista on tulossa tähän. Nyt ei ole mitään järkeä, joten insert_sorted, voit vain olettaa että luettelo on järjestetty, vaikka toimintaa olemassa mikä voi aiheuttaa sen ei lajitella, ja se on siinä. Etsi avulias insert-niin nämä ovat tärkeimmät asiat olet menossa tarvitse toteuttaa. Nyt kestää hetken tehdä pitkä ja sisältää ja niitä pitäisi olla suhteellisen nopea. Lähestyvät sulkemisaika, joten kellään mitään pituus tai sisältää? He tulevat olemaan lähes identtinen. [Student] Length. Katsotaanpa, tarkistaminen. Okei. Haluat selittää? [Opiskelija] olen vain luoda osoittimen solmuun ja alustaa sen ensin, mikä on globaali muuttuja, ja sitten tarkistaa, jos se on tyhjä niin en saa seg vika ja palauttaa 0 jos näin on. Muuten, olen silmukan läpi, pitää kirjaa sisällä kokonaisluku kuinka monta kertaa olen avannut seuraavaan elementtiin luettelon ja samalla lisäys tehdään myös avata että todellinen tekijä, ja sitten tekevät jatkuvasti tarkistaa, onko se null, ja jos se on nolla, sitten se keskeyttää ja palaa aivan elementtien lukumäärä olen näytetty. [Rob B.] Onko kellään mitään kommentteja mistään? Tämä näyttää hieno oikeellisuutta viisas. [Opiskelija] En usko sinun tarvitse solmu == null. Joo, joten jos solmu == null return 0. Mutta jos solmu == null tämä-oh, on oikeellisuutta kysymys. Se oli vain palaat i, mutta se ei ole laajuudeltaan juuri nyt. Tarvitset vain int i, niin i = 0. Mutta jos solmu on null, niin minä vielä olemaan 0, ja aiomme palata 0, joten tässä tapauksessa on sama. Toinen yleinen asia on pitää ilmoitusta solmun sisällä ja silmukka. Voisit sanoa-Voi ei. Pidetään se tähän. Olisin luultavasti laittaa int i = 0 täällä, Sitten solmu * solmu = ensin täällä. Ja tämä on luultavasti kuinka-päästä eroon tästä nyt. Tämä on luultavasti kuinka olisin kirjoittanut sen. Voisit myös tulevaisuuteen sitä näin. Tämä silmukka rakenne täällä pitäisi olla lähes yhtä luonnollista teille kuin int i = 0 i on pienempi kuin pituus array i + +. Jos näin olet toistaa yli array, tämä on miten toistaa yli linkitetty lista. Tämän pitäisi olla toinen luonto jossain vaiheessa. Tässä mielessä, tässä tulee olemaan lähes sama asia. Olet menossa halua toistaa yli linkitetty lista. Jos solmu-Minulla ei ole aavistustakaan, mitä arvoa kutsutaan. Solmun i. Jos arvo että solmu = palaan totta, ja se on siinä. Huomaa, että ainoa tapa koskaan palauttaa false on, jos me kerrata koko linkitetty lista ja koskaan palaa totta, niin että mitä tämä tekee. Sivuhuomautuksena-emme luultavasti saa liittää tai liittää alkuun. Nopea viimeistä nuottia. Jos näet staattinen avainsanan, joten sanokaamme static int count = 0, Sitten teemme count + +, voit periaatteessa ajatella sitä globaali muuttuja, vaikka juuri sanoin tämä ei ole, miten aiomme toteuttaa pituus. Teen tämän täällä, ja sitten laskea + +. Millään tavalla voimme tehdä solmun linkitetyn listan olemme lisäävä meidän count. Kohta tämä on mitä staattinen avainsanan tarkoittaa. Jos minulla vain olisi int count = 0, joka olisi säännöllinen vanha globaali muuttuja. Mitä static int count tarkoittaa sitä, että se on globaali muuttuja tätä tiedostoa. On mahdotonta jonkin muun tiedoston, kuten ajatella PSET 5, jos olet aloittanut. Sinulla on sekä speller.c, ja olet dictionary.c, ja jos vain julistaa asia globaali, niin mitään speller.c voidaan tutustua dictionary.c ja päinvastoin. Globaalit muuttujat pääsee tahansa. C tiedoston, mutta staattiset muuttujat ovat vain pääsee itse tiedostoon, niin sisältä spell checker tai sisällä dictionary.c, Tämä on tavallaan kuinka olisin julistan muuttuja koko minun array tai koko minun numero sanoja sanakirjasta. Koska en halua julistaa globaali muuttuja, että joku on pääsy, Olen oikeastaan ​​vain välitä siitä omiin tarpeisiini. Hyvä asia tässä on myös koko nimi törmäyksen kamaa. Jos jokin muu tiedosto yrittää käyttää globaali muuttuja nimeltään laskea, asiat menevät hyvin, hyvin väärin, joten tämä hienosti pitää asiat turvallinen, ja vain sinä voit käyttää sitä, ja kukaan muu ei voi, ja jos joku muu ilmoittaa globaali muuttuja nimeltä määrä, niin se ei häiritse staattinen muuttuja nimeltään count. Sitähän staattinen on. Se on tiedosto globaali muuttuja. Kysymyksiä mitään? Kaikki valmiina. Hei. [CS50.TV]