[Powered by Google Translate] [Seksyen 6] [Lebih Selesa]
[Rob Bowden] [Universiti Harvard]
[Ini adalah CS50.] [CS50.TV]
>> Kita boleh pergi ke seksyen kami soalan.
Saya menghantar URL untuk ruang sebelum.
Permulaan seksyen soalan berkata-
nampaknya saya tidak sepenuhnya unsick adalah satu soalan yang sangat mudah
hanya apa yang valgrind?
Apakah valgrind lakukan?
Sesiapa yang mahu untuk mengatakan apa valgrind tidak?
[Pelajar] Pemeriksaan memori kebocoran.
Ya, valgrind pemeriksa memori am.
Ia, pada akhirnya, memberitahu anda jika anda mempunyai sebarang kebocoran memori,
yang kebanyakannya apa yang kita sedang menggunakan ia untuk kerana jika anda mahu
berbuat baik dalam set masalah atau jika anda mahu
mendapatkan di papan besar, anda perlu mempunyai apa jua pun tiada kebocoran memori,
dan dalam kes anda mempunyai kebocoran memori yang anda tidak dapat mencari,
juga ingat bahawa apabila anda membuka fail
dan jika anda tidak menutupnya, itulah kebocoran memori.
>> Ramai orang mencari beberapa nod bahawa mereka sedang tidak membebaskan
apabila benar-benar, mereka tidak menutup kamus dalam langkah yang pertama.
Ia juga memberitahu anda jika anda mempunyai apa-apa yang tidak sah membaca atau menulis,
yang bermaksud jika anda cuba dan menetapkan nilai
yang luar akhir timbunan dan ia tidak berlaku kepada kesalahan seg
tetapi valgrind tangkapan, kerana anda harus sebenarnya tidak akan menulis di sana,
dan sebagainya anda pasti tidak perlu mempunyai apa-apa daripada mereka sama ada.
Bagaimana anda menggunakan valgrind?
>> Ia satu soalan umum
jenis berjalan dan melihat output.
Output luar biasa banyak kali.
Ada juga kesilapan yang menyeronokkan di mana jika anda mempunyai beberapa perkara yang betul-betul salah
berlaku dalam gelung, maka ia akhirnya akan berkata, "Terlalu banyak kesilapan.
Saya akan berhenti mengira sekarang. "
Ia pada dasarnya output teks yang anda perlu untuk menghuraikan.
Pada akhirnya, ia akan memberitahu anda sebarang kebocoran memori yang anda mempunyai,
berapa banyak blok, yang boleh berguna kerana
jika ia satu blok unfreed, maka ia biasanya lebih mudah untuk mencari
daripada 1,000 blok unfreed.
1000 blok unfreed mungkin bermakna anda tidak membebaskan
senarai dikaitkan anda sesuai atau sesuatu.
Itu valgrind.
>> Sekarang kita mempunyai seksyen kami soalan,
yang anda tidak perlu memuat turun.
Anda boleh klik pada nama saya dan menarik mereka dalam ruang.
Sekarang klik pada saya.
Semakan 1 akan menjadi timbunan, yang kita lakukan 1.
Semakan 2 akan beratur, dan Semakan 3 akan menjadi senarai secara tunggal dikaitkan.
Bermula dengan timbunan kami.
Seperti yang dikatakan di sini, timbunan adalah salah satu yang paling asas,
struktur data asas sains komputer.
Contoh yang sangat prototypical
timbunan dulang di dewan makan.
Ia pada asasnya apabila anda sedang diperkenalkan kepada timbunan,
seseorang akan berkata, "Oh, seperti timbunan dulang."
Anda timbunan dulang.
Kemudian apabila anda pergi ke tarik dulang,
dulang pertama yang mendapat ditarik adalah yang terakhir yang telah meletakkan pada timbunan.
Timbunan juga-seperti ia mengatakan di sini
kita mempunyai segmen memori dipanggil timbunan.
Dan mengapa ia dipanggil timbunan?
>> Kerana seperti struktur data stack,
ia menolak dan timbul bingkai timbunan pada timbunan,
mana bingkai tindanan adalah seperti panggilan tertentu bagi suatu fungsi.
Dan seperti timbunan, anda akan sentiasa perlu untuk kembali
dari panggilan fungsi sebelum anda boleh mendapatkan turun ke dalam bingkai tindanan yang lebih rendah lagi.
Anda tidak boleh mempunyai panggilan utama foo panggilan bar dan bar kembali untuk terus utama.
Ia sentiasa mendapat ikut susunan betul menolak dan pop.
Dua operasi, seperti saya katakan, adalah menolak dan pop.
Mereka adalah istilah sejagat.
Anda perlu tahu menolak dan pop dari segi susunan tidak kira apa.
Kita akan melihat beratur adalah jenis yang berbeza.
Ia tidak benar-benar mempunyai satu istilah yang universal, tetapi menolak dan pop sejagat bagi susunan.
Tekan hanya meletakkan pada timbunan.
Pop adalah mengambil kira timbunan.
Dan kita lihat di sini kita mempunyai timbunan struct typedef kami,
jadi kita mempunyai char ** rentetan.
Jangan takut oleh mana-mana **.
Ini akan berakhir sehingga menjadi pelbagai rentetan
atau pelbagai petunjuk untuk watak-watak, di mana
petunjuk untuk watak cenderung untuk menjadi rentetan.
Ia tidak perlu untuk menjadi rentetan, tetapi di sini, mereka akan menjadi rentetan.
>> Kami mempunyai pelbagai rentetan.
Kami mempunyai saiz, yang mewakili berapa banyak elemen yang kini pada timbunan,
dan kemudian kita mempunyai keupayaan, yang adalah berapa banyak unsur-unsur yang boleh pada timbunan.
Kapasiti harus bermula sebagai sesuatu yang lebih besar daripada 1,
tetapi saiz akan bermula sebagai 0.
Sekarang, terdapat pada asasnya tiga cara yang berbeza yang anda boleh berfikir timbunan.
Nah, terdapat mungkin lebih, tetapi dua cara utama
anda boleh melaksanakan ia menggunakan array, atau anda boleh melaksanakan ia menggunakan senarai yang dipautkan.
Berkaitan senarai adalah jenis remeh membuat susunan dari.
Ia adalah sangat mudah untuk membuat timbunan menggunakan senarai berkaitan,
jadi di sini, kita akan membuat timbunan menggunakan tatasusunan,
dan kemudian menggunakan tatasusunan, terdapat juga dua cara anda boleh berfikir tentang hal itu.
Sebelum ini, apabila saya berkata kita mempunyai kapasiti untuk timbunan,
supaya kita boleh memuatkan elemen pada timbunan.
>> Satu cara ia boleh berlaku dengan seberapa segera seperti yang anda memukul 10 unsur, maka anda selesai.
Anda mungkin tahu bahawa terdapat atas terikat 10 perkara di dunia
bahawa anda tidak akan mempunyai lebih daripada 10 perkara pada timbunan anda,
di mana anda boleh mempunyai atas terikat kepada saiz timbunan anda.
Atau anda boleh mempunyai timbunan anda akan terbatas,
tetapi jika anda melakukan pelbagai, ini bermakna bahawa setiap kali tunggal anda mencecah 10 elemen,
maka anda akan mempunyai berkembang kepada 20 elemen, dan apabila anda mencecah 20 elemen,
anda akan mempunyai untuk mengembangkan pelbagai anda hingga 30 elemen atau 40 unsur.
Anda akan perlu untuk meningkatkan keupayaan, yang adalah apa yang kita akan lakukan di sini.
Setiap kali tunggal kita mencapai saiz maksimum timbunan kita,
apabila kita menolak sesuatu yang lain pada, kita akan perlu untuk meningkatkan kapasiti.
Di sini, kita telah menolak diisytiharkan sebagai menolak bool (char * str).
Str * Char adalah rentetan bahawa kita menolak ke dalam tindanan,
dan bool hanya mengatakan sama ada kita berjaya atau gagal.
>> Bagaimana kita boleh gagal?
Apakah keadaan sahaja yang boleh anda fikirkan
di mana kita akan perlu kembali palsu?
Yeah.
[Pelajar] Jika ia penuh dan kami menggunakan pelaksanaan disempadani.
Ya, jadi bagaimana kita menentukan dia menjawab
jika ia penuh dan kita menggunakan pelaksanaan yang terbatas.
Kemudian kita pasti akan kembali palsu.
Secepat kita mencapai 10 perkara dalam array, kita tidak boleh memuatkan 11, jadi kita kembali palsu.
Bagaimana jika ia tidak terbatas? Yeah.
Jika anda tidak boleh mengembangkan pelbagai untuk sebab-sebab tertentu.
Ya, jadi ingatan adalah sumber yang terhad,
dan akhirnya, jika kita terus menolak perkara-perkara ke dalam tindanan berulang-ulang kali,
kita akan cuba dan memperuntukkan pelbagai yang lebih besar patut
kapasiti yang lebih besar, dan malloc atau apa sahaja yang kita gunakan akan kembali palsu.
Nah, malloc akan kembali null.
>> Ingat, setiap kali tunggal anda pernah memanggil malloc, anda perlu menyemak untuk melihat jika ia
mengembalikan null atau lain yang potongan betulnya.
Sejak kita mahu untuk mempunyai timbunan yang amat besar,
kes sahaja kita pergi akan kembali palsu adalah jika kita cuba
meningkatkan kapasiti dan malloc atau apa-apa pulangan palsu.
Kemudian pop mengambil tiada hujah,
dan ia kembali rentetan yang di atas tindanan.
Apa sahaja yang paling baru-baru ini ditolak pada timbunan adalah apa pop kembali,
dan ia juga membuang ia dari timbunan.
Dan notis bahawa ia kembali batal jika terdapat apa-apa pada timbunan.
Ia sentiasa mungkin bahawa timbunan kosong.
Di Jawa, jika anda digunakan untuk itu, atau bahasa-bahasa lain,
cuba untuk pop dari timbunan kosong mungkin menyebabkan pengecualian atau sesuatu.
>> Tetapi dalam C, null adalah jenis banyak kes-kes bagaimana kita menangani masalah-masalah ini.
Kembali null ialah bagaimana kita pergi untuk menandakan bahawa tindanan adalah kosong.
Kami telah menyediakan kod yang akan menguji kefungsian timbunan anda,
melaksanakan menolak dan pop.
Ini tidak akan banyak kod.
Saya akan-sebenarnya, sebelum kita berbuat demikian, bayangan, bayangan-
jika anda tidak pernah melihat ia, malloc bukan adalah fungsi sahaja
yang memperuntukkan memori pada timbunan untuk anda.
Terdapat keluarga fungsinya alloc.
Yang pertama adalah malloc, yang anda digunakan untuk.
Kemudian ada calloc, yang melakukan perkara yang sama seperti malloc,
tetapi ia akan sifar segala-galanya untuk anda.
Jika anda pernah mahu untuk menetapkan segala-galanya untuk menyeimbangkan selepas mallocing sesuatu
anda sepatutnya hanya digunakan calloc di tempat pertama bukannya menulis
untuk gelung untuk sifar daripada keseluruhan blok ingatan.
>> Realloc adalah seperti malloc dan mempunyai banyak kes-kes khas,
tetapi pada dasarnya apa realloc
ia mengambil penunjuk yang telah diagihkan.
Realloc adalah fungsi yang anda mahu untuk membayar perhatian ke sini.
Ia mengambil penunjuk yang sudah pulang dari malloc.
Katakan anda meminta dari malloc penunjuk 10 bait.
Kemudian anda sedar anda mahu 20 bytes,
jadi anda memanggil realloc pada penunjuk bahawa dengan 20 bait,
dan realloc secara automatik akan menyalin atas segala-galanya untuk anda.
Jika anda hanya dipanggil malloc lagi, seperti saya mempunyai 10 bait.
Sekarang saya perlu blok sebanyak 20 bait,
jadi jika saya malloc 20 bytes, maka saya mempunyai manual menyalin lebih 10 bait dari perkara yang pertama
ke perkara yang kedua dan kemudian perkara pertama percuma.
Realloc akan mengendalikan untuk anda.
>> Notis tandatangan itu akan menjadi * tidak sah,
yang hanya kembali penunjuk kepada blok memori,
maka tidak sah * ptr.
Anda boleh berfikir * terbatal sebagai penunjuk generik.
Secara umumnya, anda tidak pernah berurusan dengan * tidak sah,
tetapi malloc kembali * terbatal, dan kemudian ia hanya digunakan seperti
ini sebenarnya akan menjadi * char.
* Kekosongan sebelumnya yang telah dikembalikan oleh malloc
kini akan akan diluluskan untuk realloc, dan kemudian saiz
adalah nombor baru bait yang anda ingin memperuntukkan, jadi kapasiti baru anda.
Saya akan memberikan anda beberapa minit, dan melakukannya dalam ruang kita.
Mula dengan Ulangkaji 1.
Saya akan berhenti anda selepas diharapkan tentang masa yang cukup untuk melaksanakan menolak,
dan kemudian saya akan memberikan anda lain rehat untuk berbuat pop.
Tetapi ia benar-benar tidak adalah bahawa kod banyak pada semua.
Kod yang paling mungkin barangan berkembang, memperluaskan kapasiti.
Okay, tiada tekanan untuk sepenuhnya dilakukan,
tetapi selagi anda berasa seperti anda berada di landasan yang betul, yang baik.
>> Adakah sesiapa yang mempunyai apa-apa kod yang mereka berasa selesa dengan saya menarik?
Ya, saya akan, tetapi tidak sesiapa yang mempunyai apa-apa kod saya boleh tarik sehingga?
Baiklah, anda boleh mula, menyimpan, apa sahaja ia adalah?
Saya sentiasa lupa langkah itu.
Okay, mencari di tolak,
adakah anda mahu untuk menjelaskan kod anda?
[Pelajar] Pertama sekali, saya meningkatkan saiz.
Saya rasa mungkin saya patut mempunyai bahawa-anyway, saya meningkat saiz,
dan saya melihat jika ia adalah kurang daripada kapasiti.
Dan jika ia kurang daripada kapasiti, saya menambah kepada pelbagai bahawa kita sudah mempunyai.
Dan jika ia tidak, saya menggandakan kapasiti oleh 2,
dan saya mengagihkan semula array rentetan sesuatu dengan saiz kapasiti yang lebih besar sekarang.
Dan kemudian jika itu gagal, saya memberitahu pengguna dan kembali palsu,
dan jika ia baik, maka saya meletakkan tali di tempat baru.
>> [Rob B.] Juga melihat bahawa kita digunakan pengendali nice bitwise sini
membiak dengan 2.
Ingat, peralihan kiri sentiasa akan didarab dengan 2.
Anjakan yang betul dibahagikan dengan 2 selagi anda ingat bahawa ia bermakna
dibahagikan dengan 2 seperti dalam integer dibahagikan dengan 2.
Ia mungkin menyingkatkan sebanyak 1 di sini atau di sana.
Tetapi peralihan yang ditinggalkan oleh 1 sentiasa akan didarab dengan 2,
melainkan jika anda limpahan batas integer, dan kemudian ia tidak akan menjadi.
Satu komen sampingan.
Saya suka untuk melakukan ini tidak akan mengubah kod apa jua cara sekalipun,
tetapi saya suka untuk melakukan sesuatu seperti ini.
Ia sebenarnya akan membuat ia sedikit lagi.
Mungkin ini bukan kes yang sempurna untuk menunjukkan ini,
tetapi saya suka untuk segmen ia ke dalam blok-blok-
okay, jika ini jika berlaku, maka saya akan melakukan sesuatu,
dan kemudian fungsi dilakukan.
Saya tidak perlu kemudian tatal ke mata saya sepanjang jalan ke fungsi
untuk melihat apa yang berlaku selepas yang lain.
Ia adalah jika ini jika berlaku, maka saya hanya kembali.
Ia juga mempunyai manfaat yang bagus ditambah segala-galanya luar ini
kini beralih kiri sekali.
Saya tidak perlu lagi ke jika anda pernah berhampiran sungguh barisan panjang,
maka orang-orang 4 bait boleh membantu, dan juga sesuatu yang lebih kiri,
kurang terharu anda rasa jika suka-okay, saya perlu ingat
Saya kini dalam gelung sementara di dalam di dalam sebuah lain untuk gelung.
Mana-mana anda boleh melakukan penyata ini dengan serta-merta, saya semacam.
Ia adalah benar-benar pilihan dan tidak dijangka dalam apa jua cara.
>> [Pelajar] Sekiranya terdapat saiz - dalam keadaan gagal?
Keadaan gagal di sini kita gagal kepada realloc, begitu ya.
Perhatikan bagaimana dalam keadaan gagal, mungkin,
melainkan jika kita barangan percuma kemudian, kita sentiasa akan gagal
tidak kira berapa kali kita cuba untuk menolak sesuatu.
Jika kita terus menolak, kami menyimpan saiz incrementing,
walaupun kita tidak meletakkan apa-apa ke dalam tindanan.
Biasanya kita tidak kenaikan saiz sehingga
selepas kita telah berjaya meletakkan ia pada timbunan.
Kami akan melakukannya, katakan, sama ada di sini dan di sini.
Dan kemudian bukannya mengatakan s.size kapasiti ≤, ia adalah kurang daripada kapasiti,
hanya kerana kita berpindah di mana segala-galanya adalah.
>> Dan ingat, satu-satunya tempat yang kita mungkin dapat kembali palsu
di sini, di mana realloc kembali batal,
dan jika anda berlaku untuk ingat ralat piawai,
mungkin anda boleh mempertimbangkan ini kes di mana anda mahu mencetak ralat piawai,
stderr begitu fprintf bukan hanya mencetak terus keluar standard.
Sekali lagi, yang bukan jangkaan, tetapi jika ia adalah satu kesilapan,
menaip printf, maka anda mungkin mahu untuk membuat ia mencetak ralat piawai bukannya keluar standard.
>> Sesiapa yang mempunyai apa-apa lagi yang perlu diambil perhatian? Ya.
[Pelajar] Bolehkah anda pergi ke [didengar]?
[Rob B.] Ya, binariness sebenar atau hanya apa yang ia?
[Pelajar] Jadi anda membiak dengan 2?
[Rob B.] Ya, pada asasnya.
Di negeri binari, kita sentiasa mempunyai set kami digit.
Peralihan kiri ini dengan 1 pada dasarnya memasukkan ia di sini di sebelah kanan.
Kembali ke ini, hanya mengingati bahawa segala-galanya dalam perduaan
adalah kuasa 2, jadi ini mewakili 2 0,,
ini 2 untuk 1, 2 ke 2.
Dengan memasukkan 0 hingga sebelah kanan sekarang, kita hanya beralih segala-galanya berakhir.
Apa yang digunakan untuk menjadi 2 0, kini 2 ke 1, 2 ke 2.
Sebelah kanan yang kita dimasukkan
semestinya akan menjadi 0,
yang masuk akal.
Jika anda pernah membiak nombor dengan 2, ia tidak akan berakhir ganjil,
jadi 2 ke tempat 0 harus 0,
dan ini adalah apa yang saya separuh memberi amaran tentang sebelum ini jika anda berlaku untuk beralih
luar bilangan bit integer,
kemudian 1 ini akan berakhir sehingga terkeluar.
Itu hanya bimbang jika anda berlaku untuk berurusan dengan kapasiti yang benar-benar besar.
Tetapi pada ketika itu, maka anda berurusan dengan pelbagai berbilion perkara,
yang mungkin tidak dimuatkan ke dalam ingatan anyway.
>> Sekarang kita boleh mendapatkan pop, yang adalah lebih mudah.
Anda boleh melakukannya suka jika anda berlaku untuk pop sekumpulan keseluruhan,
dan kini anda berada pada kapasiti setengah lagi.
Anda boleh realloc untuk mengecilkan jumlah memori yang anda ada,
tetapi anda tidak perlu risau tentang itu, jadi kes realloc hanya akan menjadi
semakin meningkat ingatan, tidak mengecut memori,
yang akan membuat super pop mudah.
Sekarang beratur, yang akan menjadi seperti susunan,
tetapi supaya kamu mengambil perkara keluar diterbalikkan.
Contoh prototypical barisan adalah garis,
jadi saya rasa jika anda adalah Bahasa Inggeris, saya akan berkata
contoh prototypical barisan adalah barisan.
Jadi, seperti garis, jika anda orang yang pertama dalam baris,
anda mengharapkan untuk menjadi orang pertama di luar garisan.
Jika anda orang terakhir dalam talian, anda akan menjadi orang yang terakhir yang diservis.
Kami menyeru bahawa corak FIFO, manakala timbunan adalah corak LIFO.
Mereka perkataan cukup sejagat.
>> Seperti susunan dan tidak seperti tatasusunan, beratur biasanya tidak membenarkan akses kepada unsur-unsur di tengah-tengah.
Di sini, timbunan, kita perlu menolak dan pop.
Di sini, kita berlaku telah dipanggil mereka enqueue dan dequeue.
Saya juga telah mendengar mereka dipanggil anjakan dan unshift.
Saya pernah mendengar orang mengatakan menolak dan pop juga terpakai untuk beratur.
Saya telah mendengar memasukkan, keluarkan,
supaya menolak dan pop, jika anda bercakap tentang susunan, anda menolak dan pop.
Jika anda bercakap tentang antrian, anda boleh memilih perkataan yang anda mahu gunakan
untuk kemasukan dan penyingkiran, dan tidak ada kata sepakat tentang apa yang ia harus dipanggil.
Tetapi di sini, kita mempunyai enqueue dan dequeue.
Sekarang, struct kelihatan hampir sama kepada struct timbunan.
Tetapi kita perlu menjejaki kepala.
Saya rasa ia mengatakan turun di sini, tetapi mengapa kita perlu kepala?
Prototaip pada dasarnya adalah sama untuk menolak dan pop.
Anda boleh berfikir ia sebagai menolak dan pop.
Satu-satunya perbezaan adalah pop kembali-bukan terakhir, ia kembali pertama.
2, 1, 3, 4, atau sesuatu.
Dan di sini adalah permulaan.
Beratur kami adalah benar-benar penuh, jadi terdapat empat elemen di dalamnya.
Hujung barisan kita kini 2,
dan sekarang kita pergi untuk memasukkan sesuatu yang lain.
>> Apabila kita mahu untuk memasukkan sesuatu yang lain, apa yang kita lakukan untuk versi tindanan
kita dilanjutkan blok ingatan kami.
Apakah masalah dengan ini?
[Pelajar] Anda bergerak 2,.
Apa yang saya katakan sebelum ini tentang akhir barisan,
ini tidak masuk akal bahawa kita mula pada 1,
maka kita mahu untuk dequeue 1, maka dequeue 3, maka dequeue 4,
maka dequeue 2, maka dequeue satu ini.
Kita tidak boleh menggunakan realloc kini,
atau sekurang-kurangnya, anda perlu menggunakan realloc dalam cara yang berbeza.
Tetapi anda mungkin perlu tidak hanya menggunakan realloc.
Anda akan perlu untuk manual menyalin ingatan anda.
>> Terdapat dua fungsi untuk menyalin ingatan.
Ada memcopy dan memmove.
Saya sedang membaca muka surat manusia untuk melihat yang mana satu anda akan mahu menggunakan.
Okay, memcopy, perbezaan adalah
bahawa memcopy dan memmove, salah mengendalikan kes itu betul
mana anda hendak menyalin ke rantau yang berlaku bertindih rantau
anda menyalin dari.
Memcopy tidak mengendalikan ia. Memmove tidak.
Anda boleh berfikir masalah sebagai-
katakan saya mahu menyalin lelaki ini,
keempat-empat lelaki ini lebih.
Pada akhirnya, apa array perlu kelihatan seperti
selepas salinan 2, 1, 2, 1, 3, 4, dan kemudian beberapa barangan pada akhir.
Tetapi ini adalah bergantung kepada perintah di mana kita sebenarnya menyalin,
kerana jika kita tidak mempertimbangkan hakikat bahawa rantau kita menyalin ke dalam
bertindih yang kita sedang menyalin dari,
maka kita mungkin melakukan seperti permulaan di sini, menyalin 2, ke tempat yang kita mahu pergi,
kemudian bergerak petunjuk kita ke hadapan.
>> Sekarang kita akan berada di sini dan di sini, dan kini kita mahu menyalin
lelaki ini ke atas lelaki ini dan bergerak petunjuk kita ke hadapan.
Apa yang kita akan akhirnya mendapat 2, 1, 2, 1, 2, 1
bukannya 2 sesuai, 1, 2, 1, 3, 4 kerana
2, 1 overrode asal 3, 4.
Memmove mengendalikan bahawa betul.
Dalam kes ini, pada dasarnya hanya sentiasa menggunakan memmove
kerana ia mengendalikan ia dengan betul.
Ia biasanya tidak melakukan apa-apa lebih teruk.
Idea ini adalah bukannya bermula dari awal dan menyalin cara ini
seperti kita hanya lakukan di sini, ia bermula dari akhir dan menyalinnya dalam,
dan dalam hal yang demikian, anda tidak boleh mempunyai masalah.
Terdapat prestasi tidak hilang.
Sentiasa gunakan memmove. Jangan bimbang tentang memcopy.
Dan itulah di mana anda akan perlu berasingan memmove
bahagian yang dibalut sekitar barisan anda.
Jangan bimbang jika tidak benar-benar dilakukan.
Ini adalah lebih sukar daripada timbunan, tolak, pop dan.
>> Sesiapa yang mempunyai apa-apa kod yang kita boleh bekerja dengan?
Malah jika benar-benar tidak lengkap?
[Pelajar] Ya, ia adalah benar-benar tidak lengkap, walaupun.
Sepenuhnya lengkap adalah baik selagi kita boleh anda menjimatkan semakan?
Saya lupa bahawa setiap kali tunggal.
Okay, tanpa menghiraukan apa yang berlaku apabila kita perlu mengubah perkara.
Benar-benar mengabaikan saiz semula.
Terangkan kod ini.
Saya memeriksa pertama sekali jika saiz kurang daripada salinan pertama sekali
dan kemudian selepas itu, saya memasukkan saya mengambil kepala + saiz,
dan saya pastikan ia wrap keliling kapasiti array,
dan saya masukkan rentetan baru pada kedudukan itu.
Kemudian saya meningkatkan saiz dan kembali benar.
>> [Rob B.] Ini adalah pasti salah satu daripada kes-kes di mana anda akan mahu menggunakan arena.
Mana-mana jenis kes di mana anda telah melingkari, jika anda berfikir melingkari,
pemikiran segera harus arena.
Sebagai pengoptimuman cepat / membuat kod anda satu baris pendek,
anda dapati bahawa garisan sejurus selepas satu ini
hanya saiz + +, jadi anda bergabung ke dalam barisan ini, saiz + +.
Sekarang turun di sini, kita mempunyai kes
di mana kita tidak mempunyai memori yang cukup,
jadi kita meningkatkan kapasiti kami dengan 2.
Saya rasa anda boleh mempunyai masalah yang sama di sini, tetapi kita boleh mengabaikan ia kini,
di mana jika anda gagal untuk meningkatkan keupayaan anda,
maka anda akan mahu untuk mengurangkan keupayaan anda dengan 2 lagi.
Satu lagi nota ringkas adalah seperti yang anda boleh lakukan + =,
anda juga boleh melakukan << =.
Hampir apa sahaja boleh pergi sebelum sama, + =, | = & =, << =.
Char * baru blok baru kami ingatan.
Oh, di sini.
>> Apa yang orang berfikir tentang jenis blok baru kami ingatan?
[Pelajar] Ia harus ** char.
Memikirkan kembali struct kami di sini,
rentetan adalah apa yang kita pembahagian semula.
Kami membuat keseluruhan penyimpanan dinamik baru bagi unsur-unsur dalam barisan.
Apa yang kita akan akan memberikan kepada rentetan anda adalah apa yang kita sedang mallocing sekarang,
dan sebagainya yang baru akan menjadi ** char.
Ia akan menjadi pelbagai rentetan.
Maka apakah kes di bawah mana kita pergi untuk kembali palsu?
[Pelajar] Sekiranya kita melakukan * char?
[Rob B.] Ya, panggilan yang baik.
[Pelajar] Apa itu?
[Rob B.] Kami ingin melakukan saiz * char kerana kita tidak lagi
ini sebenarnya akan menjadi masalah yang sangat besar kerana sizeof (char) akan menjadi 1.
Sizeof * char akan menjadi 4,
jadi banyak kali apabila anda berurusan dengan ints,
anda cenderung untuk lari dengan ia kerana saiz int dan saiz * int
pada sistem 32-bit akan menjadi perkara yang sama.
Tetapi di sini, sizeof (char) dan sizeof (char *) kini akan menjadi perkara yang sama.
>> Apakah keadaan di mana kita kembali palsu?
[Pelajar] New adalah batal.
Ya, jika baru adalah batal, kita kembali palsu,
dan saya akan menjatuhkan sini-
[Pelajar] [didengar]
[Rob B.] Yeah, ini adalah baik.
Anda boleh sama ada melakukan 2 kali kapasiti atau anjakan kapasiti 1 dan kemudian hanya menetapkan ke bawah sini atau apa sahaja.
Kami akan melakukannya kerana kita terpaksa.
Kapasiti >> = 1.
Dan anda tidak akan perlu bimbang tentang kehilangan tempat 1
kerana anda meninggalkan beralih sebanyak 1, jadi tempat 1 semestinya 0 a,
begitu tepat peralihan sebanyak 1, anda masih akan menjadi halus.
[Pelajar] Adakah anda memerlukan untuk berbuat demikian sebelum kembali?
[Rob B.] Ya, ini menjadikan benar-benar tidak masuk akal.
>> Sekarang andaikan kita akan akhirnya kembali benar hingga akhir.
Cara kita pergi untuk melakukan ini memmoves,
kita perlu berhati-hati dengan bagaimana kita melakukannya.
Adakah sesiapa yang mempunyai apa-apa cadangan untuk bagaimana kita melakukannya?
Berikut adalah permulaan kami.
Tidak dapat tidak, kita mahu untuk memulakan pada awal lagi
perkara salinan dan dari sana, 1, 3, 4, 2.
Bagaimana anda berbuat demikian?
Pertama, saya perlu untuk melihat halaman lelaki untuk memmove lagi.
Memmove, perintah hujah adalah sentiasa penting.
Kami mahu destinasi pertama kami, sumber kedua, ketiga saiz.
Terdapat banyak fungsi yang membalikkan sumber dan destinasi.
Destinasi, sumber cenderung untuk menjadi konsisten agak.
Pindah, apa yang ia kembali?
Ia mengembalikan penunjuk ke destinasi, untuk apa-apa sebab anda mungkin mahu bahawa.
Gambar saya boleh membaca, tetapi kita mahu bergerak ke destinasi kami.
>> Apa destinasi kami akan?
[Pelajar] Baru.
[Rob B.] Ya, dan di mana kita menyalin dari?
Perkara pertama yang kita akan menyalin ini 1, 3, 4.
Apakah ini 1, 3, 4.
Apakah alamat ini 1?
Apakah alamat bahawa 1?
[Pelajar] [didengar]
[Rob B.] Head + alamat elemen pertama.
Bagaimana kita mendapatkan elemen pertama dalam array?
[Pelajar] Queue.
[Rob B.] Ya, q.strings.
Ingat, di sini, kepala kita ialah 1.
Darn. Saya hanya fikir ia adalah ajaib-
Di sini, kepala kita ialah 1. Saya akan menukar warna saya terlalu.
Dan di sini adalah rentetan.
Ini, sama ada kita boleh menulis seperti yang kita lakukan di sini
dengan kepala + q.strings.
Ramai orang juga menulis & q.strings [kepala].
Ini tidak benar-benar apa-apa kurang cekap.
Anda mungkin memikirkan ia sebagai anda dereferencing dan kemudian mendapatkan alamat,
tetapi pengkompil akan menterjemahkan apa yang kita lalui sebelum anyway, q.strings + kepala.
Sama ada cara yang anda mahu berfikir ia.
>> Dan berapa banyak bait yang kita mahu untuk menyalin?
[Pelajar] Kapasiti - kepala.
Kapasiti - kepala.
Dan kemudian anda sentiasa boleh menulis contoh
untuk memikirkan jika itu betul.
[Pelajar] Ia perlu dibahagikan oleh 2 kemudian.
Ya, jadi saya rasa kita boleh menggunakan saiz.
Kita masih mempunyai saiz-
menggunakan saiz, kita mempunyai saiz yang sama dengan 4.
Saiz kami adalah 4. Kepala kita ialah 1.
Kami mahu menyalin 3 elemen ini.
Itulah kewarasan cek saiz yang - kepala betul 3.
Dan kembali di sini, seperti yang kita katakan sebelum ini,
jika kita menggunakan kapasiti, maka kita akan perlu untuk membahagikan dengan 2
kerana kita sudah berkembang keupayaan kita, begitu sebaliknya, kita akan menggunakan saiz.
Bahawa salinan bahagian itu.
Sekarang, kita perlu menyalin bahagian lain, bahagian yang ditinggalkan permulaan.
>> Itu akan untuk memmove ke apa kedudukan?
[Pelajar] Plus saiz - kepala.
Ya, jadi kami telah disalin dalam saiz - bait kepala,
dan sebagainya di mana kita mahu menyalin bait selebihnya baru
dan kemudian tolak saiz-baik, bilangan bait kita sudah disalin masuk
Dan kemudian di mana kita menyalin dari?
[Pelajar] Q.strings [0].
[Rob B.] Ya, q.strings.
Kita boleh sama ada melakukan & q.strings [0].
Ini adalah ketara kurang biasa daripada ini.
Jika ia hanya akan menjadi 0, maka anda akan cenderung untuk melihat q.strings.
Itulah di mana kita sedang menyalin dari.
Berapa banyak bait yang kita telah meninggalkan untuk menyalin? >> [Pelajar] 10.
Betul.
[Pelajar] Adakah kita perlu untuk membiak 5 - 10 kali saiz bait atau sesuatu?
Ya, jadi ini adalah di mana-apa sebenarnya kita menyalin?
[Pelajar] [didengar]
Apakah jenis perkara yang kita menyalin?
[Pelajar] [didengar]
Ya, jadi char * s yang kita menyalin, kita tidak tahu di mana mereka datang dari.
Nah, di mana mereka sedang menunjuk ke, seperti tali, kita akhirnya menolak ke barisan
atau enqueuing ke barisan.
Di mana mereka datang dari, kita tidak mempunyai idea.
Kita hanya perlu menjejaki * s char sendiri.
Kita tidak mahu untuk menyalin saiz - bait kepala.
Kami mahu menyalin saiz - kepala char * s,
jadi kita akan membiak ini oleh sizeof (char *).
Sama ke sini, ketua * sizeof (char *).
>> [Pelajar] Bagaimana pula [didengar]?
Hak ini di sini?
[Pelajar] Tidak, di bawah itu, saiz - kepala.
[Rob B.] Ini hak di sini?
Aritmetik pointer.
Bagaimana aritmetik penunjuk akan bekerja adalah
ia secara automatik mendarab oleh saiz jenis yang kita sedang berurusan dengan.
Sama seperti di sini, baru + (saiz kepala)
adalah betul-betul bersamaan dengan & baru [saiz - kepala]
sehingga kita menjangkakan bahawa untuk bekerja dengan betul,
kerana jika kita sedang berurusan dengan pelbagai int, maka kita tidak melakukan indeks oleh int
atau jika ia adalah saiz 5 dan anda mahu elemen 4, maka kita indeks ke
int array [4].
Anda Don 't-[4] * saiz int.
Yang mengendalikan ia secara automatik, dan kes ini
adalah benar-benar bersamaan, jadi sintaks kurungan
hanya akan ditukar kepada ini secepat anda menyusun.
Itu adalah sesuatu yang anda perlu berhati-hati bahawa
apabila anda menambah saiz - kepala
anda menambah tidak satu bait.
Anda menambah satu char *, yang boleh menjadi salah satu bait atau apa sahaja.
>> Soalan-soalan lain?
Okay, dequeue akan menjadi lebih mudah.
Saya akan memberikan anda beberapa minit untuk melaksanakan.
Oh, dan saya rasa ini adalah situasi yang sama di mana
apa kes enqueue, jika kita sedang enqueuing null,
mungkin kita mahu menghadapinya, mungkin kita tidak lakukan.
Kami tidak akan melakukannya sekali lagi di sini, tetapi sama seperti kes timbunan kami.
Jika kita enqueue null, kita mungkin mahu untuk mengabaikan ia.
Sesiapa yang mempunyai beberapa kod saya boleh tarik sehingga?
[Pelajar] Saya hanya mempunyai dequeue.
Versi 2 adalah bahawa-okay.
Anda ingin menjelaskan?
[Pelajar] Pertama, anda pastikan ada sesuatu dalam barisan
dan bahawa saiz akan diturunkan 1.
Anda perlu untuk berbuat demikian, dan kemudian anda kembali kepala
dan kemudian bergerak kepala sehingga 1.
Okay, jadi terdapat kes sudut yang kita perlu pertimbangkan. Yeah.
[Pelajar] Jika kepala anda adalah pada elemen terakhir,
maka anda tidak mahu kepala untuk menunjukkan luar array.
>> Ya, jadi dengan seberapa segera sebagai ketua hits akhir pelbagai kami,
apabila kita dequeue, kepala kita harus modded kembali kepada 0.
Malangnya, kita tidak boleh berbuat demikian dalam satu langkah.
Saya rasa cara saya mungkin akan menetapkan ia adalah
ini akan menjadi * char, apa yang kita kembali,
apa jua nama pembolehubah anda mahu menjadi.
Kemudian kita mahu MOD ketua oleh keupayaan kita
dan kemudian kembali ret.
Ramai orang di sini, mereka mungkin melakukan
ini adalah kes, karena melihat orang lakukan jika kepala
adalah lebih besar daripada kapasiti, adakah kepala kapasiti.
Dan itu hanya bekerja di sekitar apa arena.
Ketua arena = kapasiti lebih bersih
pembalut sekitar berbanding jika kepala yang lebih besar daripada kepala kapasiti kapasiti.
>> Soalan?
Okay, perkara terakhir yang kita telah meninggalkan adalah senarai berpaut kami.
Anda mungkin digunakan untuk beberapa senarai tingkah laku yang dikaitkan jika anda lakukan
mengaitkan senarai dalam jadual hash anda, jika anda lakukan jadual hash.
Saya amat mengesyorkan melakukan jadual hash.
Anda mungkin telah dilakukan sebuah indone,
tetapi cuba adalah lebih sukar.
Secara teori, mereka berasimptot lebih baik.
Tetapi hanya melihat lembaga besar,
dan cuba tidak pernah melakukan yang lebih baik, dan mereka mengambil lebih banyak memori.
Segala-galanya tentang cuba berakhir menjadi buruk bagi kerja lebih.
Ia adalah apa penyelesaian David Malan sentiasa
adalah dia sentiasa posts penyelesaian indone beliau, dan mari kita lihat di mana beliau kini.
Apa yang dia di bawah, David J?
Dia # 18, supaya tidak terlalu buruk,
dan yang akan menjadi salah satu yang terbaik cuba anda boleh berfikir
atau salah satu yang terbaik cuba indone satu.
Adakah ia tidak walaupun penyelesaian asal beliau?
Saya berasa seperti penyelesaian indone cenderung untuk menjadi lebih dalam julat ini penggunaan RAM.
>> Pergi ke atas sangat, dan penggunaan RAM adalah dalam digit tunggal.
Pergi ke arah bawah, dan kemudian anda mula melihat cuba
di mana anda akan mendapat penggunaan RAM yang benar-benar besar-besaran,
dan cuba adalah lebih sukar.
Tidak sepenuhnya berbaloi tetapi pengalaman pendidikan jika anda lakukan.
Perkara terakhir adalah senarai berkaitan kami,
dan ketiga-tiga perkara, susunan, beratur, dan senarai yang berkaitan,
apa-apa benda masa depan anda pernah lakukan dalam bidang sains komputer
akan menganggap anda mempunyai kebiasaan dengan perkara-perkara ini.
Mereka hanya begitu asas kepada segala-galanya.
>> Berkaitan senarai, dan di sini kita mempunyai senarai yang dikaitkan secara tunggal akan menjadi pelaksanaan kami.
Apa tidak berseorangan dikaitkan bermakna berbanding duanya adalah terpakai dikaitkan? Ya.
[Pelajar] Ia hanya menunjukkan penunjuk seterusnya bukannya kepada petunjuk,
seperti sebelum dan selepas.
Yeah, jadi dalam format gambar, apa yang tidak saya hanya melakukan?
Saya mempunyai dua perkara. Saya mempunyai gambar dan gambar.
Dalam format gambar, secara tunggal kami dikaitkan senarai,
tidak dapat dielakkan, kami mempunyai beberapa jenis penunjuk kepada kepala senarai kami,
dan kemudian dalam senarai kami, kami hanya mempunyai petunjuk,
dan mungkin ini mata untuk menyeimbangkan.
Ia akan menjadi lukisan biasa anda senarai dikaitkan secara tunggal.
Satu senarai duanya adalah terpakai dikaitkan, anda boleh pergi ke belakang.
Jika saya memberikan anda sebarang nod dalam senarai, maka anda semestinya boleh mendapatkan untuk
mana-mana nod lain dalam senarai jika ia adalah senarai duanya adalah terpakai dikaitkan.
Tetapi jika saya mendapat anda nod ketiga dalam senarai dan ia adalah senarai berseorangan dikaitkan,
ada cara anda pernah akan sampai kepada nod pertama dan kedua.
Dan ada manfaat dan Bahaya, dan seseorang individu yang jelas
anda mengambil lebih saiz, dan anda perlu untuk menjejaki di mana perkara-perkara ini menunjuk sekarang.
Tetapi kita hanya mengambil berat tentang berseorangan dikaitkan.
>> Beberapa perkara yang kita akan perlu untuk melaksanakan.
Struct nod typedef anda, int i: struct nod * seterusnya; nod.
Itu typedef harus dibakar ke dalam minda anda.
Kuiz 1 harus suka memberi typedef nod senarai yang dikaitkan,
dan anda akan dapat dengan segera tulisan oragn ayam yang turun
tanpa memikirkan ia.
Saya rasa soalan pasangan, mengapa kita perlu struct sini?
Mengapa tidak boleh kita katakan * nod?
[Pelajar] [didengar]
Yeah.
Satunya perkara yang mentakrifkan nod sebagai perkara
typedef sendiri.
Tetapi seperti titik ini, apabila kita jenis menghuraikan melalui struct nod ini definisi,
kita belum selesai typedef kami lagi, jadi sejak typedef belum selesai,
nod tidak wujud.
Tetapi struct nod tidak, dan nod ini di sini,
ini juga boleh dipanggil apa-apa lagi.
Ini boleh dipanggil n.
Ia boleh dipanggil nod senarai berpaut.
Ia boleh dipanggil apa-apa.
Tetapi ini struct nod perlu dipanggil perkara yang sama sebagai nod struct ini.
Apa yang anda panggil ini juga berada di sini,
dan sebagainya yang juga menjawab titik kedua soalan
itulah sebabnya banyak kali apabila anda melihat structs dan typedefs daripada structs,
anda akan melihat structs tanpa nama di mana anda hanya akan melihat struct typedef,
pelaksanaan struct, kamus, atau apa sahaja.
>> Mengapa di sini adakah kita perlu untuk mengatakan nod?
Mengapa ia tidak boleh menjadi struct tanpa nama?
Ia hampir jawapan yang sama.
[Pelajar] Anda perlu merujuk kepadanya dalam struct.
Ya, dalam struct, anda perlu merujuk kepada struct itu sendiri.
Jika anda tidak memberi struct nama, jika ia adalah satu struct tanpa nama, anda tidak boleh merujuk kepadanya.
Dan lepas tetapi tidak kurangnya ini semua harus agak mudah,
dan mereka harus membantu anda merealisasikan jika anda menulis ini turun
bahawa anda sedang melakukan sesuatu yang salah jika ini pelbagai perkara yang tidak masuk akal.
Lepas tetapi tidak kurangnya, mengapa ini perlu menjadi * struct nod?
Mengapa ia tidak boleh hanya struct nod seterusnya?
[Pelajar] pointer struct seterusnya.
Itu tidak dapat dielakkan apa yang kita mahu.
Mengapa boleh ia tidak pernah menjadi nod struct seterusnya?
Mengapa ia perlu struct nod * seterusnya? Yeah.
[Pelajar] Ia seperti gelung tak terhingga.
Yeah.
[Pelajar] Ia semua akan berada dalam salah satu.
Ya, hanya berfikir bagaimana kita akan melakukan saiz atau sesuatu.
Saiz struct satu adalah pada dasarnya + atau - beberapa corak di sini atau di sana.
Ia pada dasarnya akan menjadi jumlah saiz perkara dalam struct.
Hak ini di sini, tanpa mengubah apa-apa, saiz akan menjadi mudah.
Saiz nod struct akan menjadi saiz i saiz + seterusnya.
Saiz i akan menjadi 4. Saiz depan akan menjadi 4.
Saiz nod struct akan menjadi 8.
Jika kita tidak mempunyai *, memikirkan sizeof,
maka sizeof (i) akan menjadi 4.
Saiz nod struct seterusnya akan menjadi saiz i saiz + nod struct depan
Saiz + i + saiz nod struct depan.
Ia akan menjadi satu rekursi terhingga nod.
Ini adalah mengapa ini adalah bagaimana perkara perlu.
>> Sekali lagi, pasti menghafal itu,
atau sekurang-kurangnya memahami ia cukup bahawa anda boleh dapat
sebab melalui apa yang ia harus kelihatan seperti.
Perkara-perkara yang kita akan mahu untuk melaksanakan.
Jika panjang senarai-
anda boleh menipu dan menyimpan sekitar
panjang global atau sesuatu, tetapi kita tidak akan berbuat demikian.
Kami akan mengira panjang senarai.
Kami telah mengandungi, jadi yang pada asasnya seperti carian,
jadi kita mempunyai senarai yang dikaitkan integer untuk melihat jika integer ini adalah dalam senarai berkaitan.
Prepend akan untuk memasukkan di awal senarai.
Lampiran akan untuk memasukkan pada akhir.
Insert_sorted akan masukkan ke dalam kedudukan yang diisih dalam senarai.
Jenis Insert_sorted mengandaikan bahawa anda tidak pernah digunakan Prepend atau melampirkan dengan cara yang buruk.
>> Insert_sorted apabila anda melaksanakan insert_sorted-
mari kita mengatakan bahawa kita mempunyai senarai kami dikaitkan.
Ini adalah apa yang ia kini kelihatan seperti, 2, 4, 5.
Saya mahu untuk memasukkan 3, jadi selagi senarai itu sendiri sudah disusun,
ia adalah mudah untuk mencari di mana 3 kepunyaan.
Saya bermula pada 2.
Okay, 3 adalah lebih daripada 2, jadi saya mahu terus pergi.
Oh, 4 adalah terlalu besar, jadi saya tahu 3 akan pergi di antara 2 dan 4,
dan saya perlu untuk menetapkan petunjuk dan semua barangan itu.
Tetapi jika kita tidak tegas menggunakan insert_sorted,
suka mari kita hanya mengatakan saya Prepend 6,
maka senarai berpaut saya akan menjadi ini.
Ia kini tidak masuk akal, jadi untuk insert_sorted, anda hanya boleh menganggap
bahawa senarai diisih, walaupun operasi wujud
yang boleh menyebabkan ia tidak diselesaikan, dan itulah ia.
Cari membantu memasukkan begitu mereka adalah perkara-perkara utama yang anda akan perlu untuk melaksanakan.
>> Untuk sekarang, mengambil beberapa minit untuk melakukan panjang dan mengandungi,
dan mereka harus agak cepat.
Hampir masa tutup, jadi sesiapa yang mempunyai apa-apa untuk panjang atau mengandungi?
Mereka akan menjadi hampir sama.
[Pelajar] Length.
Mari kita lihat, semakan.
Okay.
Anda ingin menjelaskan?
[Pelajar] Saya hanya mewujudkan nod penunjuk dan memulakan pertama, yang merupakan pembolehubah global kami,
dan kemudian saya memeriksa untuk melihat jika ia adalah batal jadi saya tidak mendapat suatu kesalahan seg dan kembali 0 jika itu berlaku.
Jika tidak, saya gelung melalui, menjaga trek dalam integer
berapa kali saya telah diakses Elemen seterusnya senarai
dan dalam operasi kenaikan sama juga mengakses bahawa elemen sebenar,
dan kemudian saya terus membuat cek untuk melihat jika ia adalah batal,
dan jika ia batal, maka ia akan gagal dan hanya mengembalikan bilangan elemen yang saya telah diakses.
>> [Rob B.] Adakah sesiapa yang mempunyai apa-apa komen mengenai apa-apa?
Ini kelihatan ketepatan denda bijak.
[Pelajar] Saya tidak fikir anda perlu nod == null.
Ya, jadi jika nod == pulangan 0 batal.
Tetapi jika nod == null maka ini-oh, terdapat adalah isu ketepatan.
Ia hanya anda kembali i, tetapi ia bukan dalam skop sekarang.
Anda hanya perlu int i, jadi i = 0.
Tetapi jika nod adalah batal, maka saya masih akan menjadi 0,
dan kita akan kembali 0, jadi kes ini adalah sama.
Satu lagi perkara yang biasa adalah untuk memastikan perisytiharan itu
dalam nod bagi gelung.
Anda boleh mengatakan-oh, tidak.
Mari menyimpan ia seperti ini.
Saya mungkin akan meletakkan int i = 0 di sini,
maka nod * nod = pertama di sini.
Dan ini mungkin bagaimana menyingkirkan ini sekarang.
Ini mungkin bagaimana saya akan telah menulis.
Anda boleh juga melihat ia seperti ini.
Ini bagi struktur gelung di sini
harus hampir sebagai semula jadi kepada anda sebagai int i = 0
i adalah kurang daripada panjang array i + +.
Jika itulah bagaimana anda melelar melalui array, ini adalah bagaimana anda melelar atas senarai berkaitan.
>> Ini harus menjadi sifat kedua pada satu ketika.
Dengan itu dalam fikiran, ini akan menjadi hampir perkara yang sama.
Anda akan mahu untuk melelar senarai berkaitan.
Jika nod saya tidak mempunyai idea apa nilai dipanggil.
Nod i.
Jika nilai pada nod tersebut = i kembali benar, dan itu sahaja.
Perhatikan bahawa satu-satunya cara kita pernah kembali palsu
adalah jika kita melelar atas senarai keseluruhan dikaitkan dan tidak pernah kembali benar,
supaya apa yang ini tidak.
Sebagai nota sampingan kita mungkin tidak akan mendapatkan untuk menambah atau Prepend.
>> Pantas nota terakhir.
Jika anda melihat kata kunci statik, jadi mari kita mengatakan statik kiraan int = 0,
maka kita lakukan kiraan + +, anda pada asasnya boleh berfikir ia sebagai pembolehubah global,
walaupun saya hanya berkata ini bukanlah bagaimana kita akan melaksanakan panjang.
Saya melakukan ini di sini, dan kemudian mengira + +.
Mana-mana cara kita boleh memasuki nod ke dalam senarai berpaut kami kita incrementing kiraan kita.
Titik ini adalah apa kata kunci statik bermakna.
Jika saya hanya mempunyai kiraan int = 0 yang akan menjadi pembolehubah tetap global lama.
Apa cara kiraan int statik adalah bahawa ia adalah satu pembolehubah global bagi fail ini.
Ia adalah mustahil untuk fail lain,
suka berfikir daripada pset 5, jika anda telah mula.
Anda mempunyai speller.c kedua-dua, dan anda mempunyai dictionary.c,
dan jika anda hanya mengisytiharkan perkara global, maka apa-apa dalam speller.c
boleh diakses dalam dictionary.c dan sebaliknya.
Pembolehubah global boleh diakses oleh mana-mana fail c,
tetapi pembolehubah statik yang hanya boleh diakses dari dalam fail sendiri,
jadi di dalam ejaan pemeriksa atau dalam dictionary.c,
ini adalah jenis bagaimana saya akan mengisytiharkan pembolehubah saya untuk saiz array saya
atau saiz bilangan perkataan dalam kamus saya.
Kerana saya tidak mahu mengisytiharkan pembolehubah global bahawa sesiapa yang telah akses kepada,
Saya benar-benar hanya mengambil berat tentang ia untuk tujuan saya sendiri.
>> Perkara yang baik tentang ini juga barangan perlanggaran nama keseluruhan.
Jika beberapa fail lain cuba untuk menggunakan pembolehubah global dipanggil kiraan, perkara pergi sangat, sangat salah,
jadi ini baik menyimpan barang yang selamat, dan hanya anda boleh mengakses,
dan tidak ada orang lain boleh, dan jika orang lain mengisytiharkan pembolehubah global dipanggil kiraan,
maka ia tidak akan mengganggu dengan pembolehubah statik anda dipanggil kiraan.
Itulah apa yang statik adalah. Ia adalah pembolehubah fail global.
>> Soalan pada apa-apa?
Menetapkan semua. Bye.
[CS50.TV]