[Powered by Google Translate] Programavimo, mes dažnai reikia atstovauti vertybių sąrašus, pavyzdžiui, studentų vardų sekcijoje ar jų balai naujausioje viktorina. C kalba, pareiškė, grotelės gali būti taikomos laikyti sąrašus. Tai lengva išvardyti sąrašo elementus saugomi masyve, ir jei jums reikia prisijungti prie arba pakeisti ith sąrašo elementas dėl kokių nors savavališkai indeksas I , kad galima padaryti nuolat, bet matricos turi trūkumų. Kai mes pareiškiame, mes pasakyti priekyje, kokio jos dydžio, tai yra, kiek elementų jie gali laikyti ir kokio dydžio šie elementai yra, kuris yra nustatomas pagal jų tipą. Pavyzdžiui, int arr (10) gali laikyti 10 elementų kad yra int dydis. Mes negalime pakeisti masyvo dydį po deklaracijos. Mes turime padaryti naują masyvą, jei norime saugoti daugiau elementų. Priežastis, šis apribojimas yra tai, kad mūsų programa saugo daug įvairių gretimuose atminties riekė. Sako, tai yra buferis, kur saugomi mūsų masyvas. Gali būti kiti kintamieji įsikūręs šalia į masyvą atmintyje, todėl mes negalime tiesiog įsitikinkite, masyvas didesnis. Kartais mes norėtume prekiauti masyvas greitą prieigą prie duomenų greitis šiek tiek daugiau lankstumo. Įveskite susietą sąrašą, kitas pagrindinis duomenų struktūra jums gali būti susipažinę su. Aukštu lygiu, susietas sąrašas saugo duomenis mazgų seka , kurie yra sujungti vienas su kitu, su nuorodomis, Taigi pavadinimas "susijęs sąrašas." Kaip matysime, šis dizaino skirtumas veda prie skirtingų privalumų ir trūkumų kaip masyvo. Štai kai C kodas, skirtas labai paprasta susijęs sveikųjų skaičių sąrašą. Jūs galite pamatyti, kad mes turime atstovaujama kiekvienas mazgas kaip struct, kuriame yra 2 dalykų sąrašą, sveikasis skaičius laikyti vadinamas "Val" ir nuorodą į kitą mazgą sąraše , kuriuos mes atstovaujame, kaip žymeklis, vadinamas "Kitas". Tokiu būdu, mes galime stebėti visą sąrašą tik vieną 1-ojo mazgo rodyklė į ir tada mes galime sekti kitą patarimų į 2-mazgas, 3 mazgas, į 4 mazgas, ir taip toliau, kol mes gauti į sąrašo pabaigoje. Jums gali būti suteikta galimybė žr. 1 pranašumą, tai turi per statinio masyvo struktūros susietą sąrašą mums nereikia didelė riekė atminties apskritai. 1-oji sąraše mazgas galėtų gyventi šios vietos atmintyje, ir 2-oji mazgas gali būti čia. Mes galime gauti visų mazgų, nesvarbu, kur atmintyje jie, nes pradedant nuo 1-ojo mazgo, kiekvienas mazgas šalia rodyklė pasakoja mums tiksliai, kur eiti toliau. Be to, mes neturime pasakyti iš anksto kaip didelis susietas sąrašas bus kaip mes darome su statinio masyvų, nes mes galime pridėti mazgų sąrašą tol, kol yra vietos kažkur atmintyje naujų mazgų. Todėl susietų sąrašai yra lengva dydį dinamiškai. Pasakykite, vėliau programoje turime pridėti daugiau mazgų į mūsų sąrašą. Norėdami įterpti naują mazgas į mūsų sąrašą skristi, visi mes turime padaryti, yra paskirstyti atmintį Šis mazgas, pūkštelėti duomenų vertės, ir tada padėkite jį kur mes norime reguliuojant atitinkamus nurodymus. Pavyzdžiui, jei mes norėjome įdėti mazgas tarp 2-oji ir 3-oji sąraše mazgai,  mes nebūtume perkelti 2 ar 3 mazgai ne visi. Tarkime, mes įdėti šią raudoną mazgas. Visi mes norime turėti tai padaryti naujas mazgas kitą žymeklį atkreipti dėmesį į 3-ojo mazgo ir tada naujo elekrifikuoti 2. mazgas kitą žymeklį mūsų naujas mazgas. Taigi, mes galime dydį mūsų sąrašuose skristi nes mūsų kompiuteris nesiremia indeksavimo, , o susieti naudojant rodykles juos laikyti. Tačiau trūkumas susiję sąrašai yra tai, kad, skirtingai nuo statinio masyvo, kompiuteris gali ne tik peršokti į sąrašo viduryje. Kadangi kompiuteris turi aplankyti kiekvienas mazgas į susietą sąrašą gauti į kitą, jis ketina užtrukti ilgiau rasti tam tikrą mazgas nei ji būtų masyve. Išanalizuoti visą sąrašą reikia laiko proporcingas sąrašo ilgį, arba O (n) asimptotinio notacijos. Vidutiniškai pasiekti bet kokį tašką taip pat reikia laiko proporcingas n. Dabar galime parašyti šiek tiek kodo , kuri dirba su, susijusius sąrašus. Tarkime, mes norime susietą sąrašą sveikųjų skaičių. Mes galime atstovauti mazgas vėl mūsų sąraše kaip su 2 srityse struct, sveikasis skaičius vertė vadinama "Val" ir kitas rodyklė į kitą mazgą sąrašo. Na, atrodo gana paprasta. Tarkime, mes norime parašyti funkciją kerta sąrašą ir spausdina saugoma vertė per pastaruosius mazgas sąrašo. Na, tai reiškia, kad mums reikia išanalizuoti visus sąraše mazgų rasti naujausia, bet kadangi mes ne pridedant ar išbraukiant nieko, mes ne nori pakeisti vidaus struktūra Çstaigose sąraše. Taigi, mums reikės rodyklę specialiai Sankryþos kuriuos mes vadiname "skaitytuvas". Ji bus nuskaityti per visas sąraše elementų po Çstaigose grandinę. Visi mes įrašėte, yra rodyklė į 1 mazgas, arba "galva" iš sąrašo. Galvos iki 1 mazgo. Tai tipo rodyklė mazgas. Gauti faktinę 1. mazgas sąraše, turime dereference šį žymeklį, bet kol mes galime dereference, mes turime patikrinti, jei žymeklis yra niekinis pirmas. , Jei tai nulis, sąrašas yra tuščias, ir mes turi išspausdinti pranešimą, kad, kadangi sąrašas yra tuščias, nėra paskutinis mazgas. Bet, tarkime, kad šis sąrašas nėra tuščias. Jei ne, tada mes turėtume nuskaityti per visą sąrašą kol mes gauti iki paskutinės mazgas sąrašo, ir kaip mes galime pasakyti, jei mes ieškome paskutinę mazgas sąraše? Na, jei mazgo rodyklė NULL, mes žinome, kad esate pabaigoje , nes paskutinis kitą rodyklė neturės iš sąrašo, kad rodytų į kitą mazgą. Tai gera praktika visada laikyti praėjusių mazgas inicijuotas kitą žymeklį į null turėti standartizuotą turtą, kuris įspėja mus, kai mes pasiekėme sąrašo pabaigoje. Taigi, jei skaitytuvas → šalia yra nulis, prisiminti, kad rodyklė sintaksė yra spartusis dereferencing rodyklė į struct, tada susipažinimo jos tolimesnis laukas atitinka nepatogu: (* Skaitytuvas). Kitą. Kai mes paskutinį mazgas, mes norime spausdinti vikšriniai → Val, dabartinio mazgo vertė mes žinome, yra naujausia. Priešingu atveju, jei mes dar paskutinę mazgas sąraše, mes turime pereiti į kitą mazgą sąraše ir patikrinti, jei tai yra naujausia. Norėdami tai padaryti, mes tiesiog mūsų skaitytuvu žymeklį dabartinės mazgo sekančią reikšmę, tai yra, kitas mazgas sąraše. Tai daroma nustatant vikšriniai = vikšriniai → kitą. Tada mes su kilpa pavyzdžiui, pakartokite šį procesą, , kol randame paskutinį mazgas. Taigi, pavyzdžiui, jei skaitytuvas buvo nukreipta į galvą, mes nustatome skaitytuvas atkreipti į vikšrinis → kitą, kuris yra toks pat, kaip ir 1-ojo mazgo į kitą lauką. Taigi, dabar mūsų skaitytuvas nukreipta į 2-mazgas, , ir vėl kartojame tai su kilpa, kol mes pastebėjome, paskutinis mazgas, tai yra, kur mazgas šalia rodyklė yra nukreipta į nulis. Ir ten mes turime tai, mes pastebėjome, paskutinis mazgas sąraše, ir spausdinti savo vertę, mes tiesiog naudoti vikšriniai → VAL. Judantis nėra taip blogai, bet ką apie įterpiant? Sakykime, norime įterpti sveikasis skaičius į 4 poziciją sveikasis skaičius sąraše. Kad yra tarp dabartinių 3 ir 4 mazgų. Vėlgi, mes turime feed sąrašą tik gauti 3 elemento, mes įterpiant po. Taigi, mes vėl sukurti vikšrinį žymeklį feed sąrašą, patikrinti, jeigu mūsų pagrindinė rodyklė yra niekinis, ir, jei taip nėra, atkreipti mūsų skaitytuvu žymeklį ties pagrindinį mazgą. Taigi, mes ne 1-ojo elemento. Mes turime eiti į priekį 2 daugiau elementų, prieš mes galime įterpti, todėl mes galime naudoti for ciklas int i = 1; i <3; i + + kilpa iteracijos ir kiekvienam, anksto mūsų skaitytuvu žymeklį į priekį, 1 mazgas tikrinti, ar dabartinio mazgo Kitas laukas yra niekinis, ir, jei taip nėra, mūsų skaitytuvu žymeklį perkelti į kitą mazgą nustato, per kiek laiko ji lygi kito dabartinio mazgo rodyklė. Taip, nes sako, kad padaryti, kad mūsų Loop du kartus, mes pasiekėme į 3-iąją mazgas, ir kai mūsų robotas rodyklė pasiekė mazgas po kurią norime įterpti mūsų naują sveikasis skaičius, kaip mes iš tikrųjų įterpiant? Na, mūsų naujas sveikasis skaičius turi būti įtrauktas į sąrašą kaip savo paties mazgo struct, nes tai tikrai mazgų seka. Taigi, galime sukurti naują žymeklį į mazgą vadinamas "new_node, ir nustatykite ją į atmintį, kad dabar mes skirti paties mazgo krūvos, ir kiek atminties mums reikia paskirstyti? Na, mazgas dydis, ir mes norime sukurti savo Val lauką į sveikojo skaičiaus, kad mes norime įterpti. Tarkime, 6. Dabar, mazgas yra mūsų skaitinę vertę. Taip pat gera praktika inicijuoti naujas mazgas kitą lauką atkreipti null, bet kas dabar? Mes turime pakeisti vidaus struktūrą sąrašo ir Çstaigose sąraše esamų 3 ir 4 taškų. Kadangi Çstaigose nustatyti sąrašo tvarką, nes mes įterpiant mūsų naują mazgas į sąrašo viduryje, ji gali būti šiek tiek sudėtinga. Taip yra todėl, atminkite, kad mūsų kompiuteris tik žino mazgų vietą iš sąrašo nes iš ankstesnių mazgų saugomų Çstaigose. Taigi, jei mes kada nors prarasti sekti bet kurį iš šių vietų, pasakyti keičiant vieną iš Çstaigose mūsų sąraše, Tarkim, mes pakeitėme 3. mazgas šalia lauko atkreipti dėmesį į kai per čia mazgas. Mes norime būti iš laimės, nes mes gi ne turi kokių nors idėjų, kur rasti likusią sąrašo, ir akivaizdu, kad tai tikrai blogai. Taigi, mes turime būti labai atsargūs, apie tvarka , kurioje mes manipuliuoti mūsų Çstaigose įkišimo metu. Taip, kad būtų paprasčiau, tarkime, kad mūsų pirmieji 4 mazgai yra vadinami A, B, C, ir D, su rodyklėmis, atstovaujančių rodykles grandinę kad prisijungti mazgai. Taigi, mes turime įterpti naują mazgas tarp mazgų C ir D Tai svarbu tai padaryti teisinga tvarka, ir aš jums parodysiu, kodėl. Pažvelkime neteisinga būdas tai padaryti. Ei, mes žinome, naujas mazgas turi ateiti iš karto po C, tad nustatyti c kitą žymeklį atkreipti į new_node. Viskas gerai, atrodo gerai, mes tiesiog turime baigti iki dabar naujas mazgas kitą žymiklio tašką D, Bet palaukite, kaip mes galime padaryti, kad? Vienintelis dalykas, kuris gali mums pasakyti, kur D buvo, buvo kitas rodyklė anksčiau saugomi C, bet mes tiesiog perrašė kad žymeklį , kad rodytų į naujas mazgas, todėl mes nebeturi jokių clue kur D yra atmintyje, ir mes praradome likusią sąrašo. Ne gerai. Taigi, kaip tai padaryti teisingai? Pirma, nurodo naujas mazgas kitą žymeklį į D. Dabar, tiek naujas mazgas ir C Çstaigose yra nukreipta į tą patį mazgą, D, bet tai gerai. Dabar galime nurodyti c kitą žymeklį ties naujas mazgas. Taigi, mes padarėme tai, neprarandant jokių duomenų. Kodu, C yra dabartinis mazgas Sankryþos rodyklė skaitytuvas yra nukreipta į ir D yra atstovaujama dabartinio mazgo kitą lauką atkreipė dėmesį į mazgą, ar vikšrinė → kitą. Taigi, mes pirmą kartą nustatytas naujas mazgas kitą žymeklį atkreipti į vikšrinis → kitą, taip pat, kaip mes sakėme, new_node Kitas rodyklė nurodyti D iliustracijoje. Tada, mes galime nustatyti dabartinės mazgo kitą žymeklį mūsų naujas mazgas, lygiai taip pat mes turėjome laukti, C punkte new_node brėžinyje. Dabar viskas, kad ir mes neprarado sekti visus duomenis, ir mes galėjome tiesiog laikytis mūsų naują mazgas sąrašo viduryje be visa tai atstatyti ar net perkelti jokių elementų kaip mes turėjo su fiksuoto ilgio masyvas. Taigi, susijusi sąrašai yra pagrindinis, bet svarbus, dinamiška duomenų struktūra kurie turi ir privalumų, ir trūkumų , palyginti su masyvų ir kitų duomenų struktūros, ir kaip dažnai informatikos atveju, svarbu žinoti, kada naudoti kiekvieną įrankį, todėl galite pasirinkti tinkamą įrankį tinkamą darbą. Daugiau praktikos, pabandykite rašyti funkcijas ištrinti mazgų iš susietą sąrašą - nepamirškite būkite atsargūs, apie ta tvarka, kuria jums pertvarkyti kitas jūsų patarimų, siekiant užtikrinti, kad jūs neturite prarasti savo sąrašo riekė - ar funkcija suskaičiuoti mazgų susietą sąrašą, arba įdomus vienas, pakeisti visi susietą sąrašą mazgų tvarką. My name is Jackson Steinkamp, ​​tai CS50.