[Powered by Google Translate] [第6週]
[戴維·J·馬蘭] [哈佛大學]
這是CS50。[CS50.TV]
>> 這是CS50，這是第6週開始，
這樣一對夫婦的新工具現在可供您利用，
其中第一個被稱為CS50風格。
奇怪的是，如果你是像我這樣的教學研究員，
你可能已經看到了一個程序，其風格看起來有點像這樣。
也許你開始削減一些角落深夜，否則你會稍後處理，
然後一個TF或CA在辦公時間內。
然後，我們很難讀。
，此代碼在語法上是正確的，它會編譯，它實際上運行。
但它絕對不是一個風格的5。
>> 但是現在，如果我們去到這個目錄
並請注意，我有conditions2.c
我運行這個新的命令，style50，在這個文件conditions2.c，輸入，
注意，它告訴我，它已經程式化。
Gedit的注意到，該文件已經在磁盤上更改，
如果我點擊重新加載，你所有的問題，現在實現自動化。
[掌聲]
這是我們做這個週末的事情之一。
要認識到，它是不完善的，因為有一些代碼，
，那根本不會是完美的樣式，
但現在意識到這是一個工具，你可以利用
如果僅僅是為了收拾一些更errantly放在花括號等。
>> 但更引人注目的是CS50檢查。
CS50檢查，你其實可以執行相同的正確性測試
對自己的代碼，教學研究員能。
這是一個命令行實用程序，現在在家電
只要你做按update50
pset的4種規格，並使用它基本上是這樣的。
運行該命令check50。
然後，你將在一個命令行參數，或更普遍地被稱為一個開關或標誌。
一般情況下，有連字符的事情，被稱為一個開關
一個命令行程序，-c指定
你要運行的檢查。
>> 要運行的測試，你唯一標識此字符串，
2012/pset4/resize。
換句話說，這只是一個任意的，但唯一的字符串
我們用來唯一識別的pset 4的正確性測試。
然後指定一個空間分隔的列表中的文件要上傳
CS50檢查分析。
舉例來說，如果我進入我的解決方案為resize.c這裡
讓我打開了一個更大的終端窗口
和我繼續運行讓我們check50-C 2012/pset4/resize說的，
然後我繼續前進，指定的文件名，
resize.c，然後按Enter鍵，它會壓縮，
它上傳時，它會檢查，我只是一大堆的測試失敗。
在左上角的一個紅說，resize.c和B​​MP存在。
這是測試。這是我們的問題。
它的不開心，因為得到的答案是假的。
白色它下面的文本說，預計bmp.h存在的，而這僅僅是我的錯。
我忘了把它上傳，所以我需要這兩個文件上傳，
resize.c和bmp.h.
但現在發現所有其他測試是黃色的，因為他們還沒有遇到，
等的笑臉是垂直的，因為他既不快樂也不悲傷，
但我們必須糾正這個問題，在紅色之前的其他檢查運行。
>> 讓我來解決這個問題。
讓我放大並重新運行此，這一次bmp.h
在命令行上，輸入，現在如果一切順利的話，
要檢查，然後返回一個結果，屏住呼吸，
所有的綠色，這意味著我做的真的很好的pset 4。
你可以看到和推斷的描述性文字在這裡
它到底是什麼，我們測試。
我們測試了第一個不存在的文件嗎？
然後，我們測試的不resize.c編譯嗎？
然後，我們測試它不能調整一個1x1像素的BMP，調整大小的因素，當n為1。
現在，如果你不知道n是什麼，你會當你潛入的pset 4，
但是，僅僅是進行仔細的檢查，以確保你不調整大小
圖像，如果在所有的大小調整係數為1。
如果相反，它會調整到2x2正確的1x1像素的1x1像素的BMP
當n是2，則同樣地，礦形成相應。
>> 總之，這是，一，採取交叉手指
的等式就在你提交你的pset。
你會確切地知道你的TF很快就會知道
當你去提交一些這些問題集，
也是教學的動機是真的把
這樣的機會在你面前，當你知道一個先驗
有代碼中的錯誤，並沒有被通過的測試，
你可以把前面的更有效的時間來解決這些問題
而不是失分，從你的TF，得到的反饋
，然後走了，“啊，”我應該已經猜到了。
現在，至少有一個工具，以幫助您找到。
這不是要指出其中的錯誤，但它會告訴你
什麼是它的症狀。
>> 現在，實現不一定詳盡的測試。
只是因為你得到滿屏幕的綠色笑臉
並不意味著你的代碼是完美的，但它確實意味著
已通過一定的測試規範所規定的。
有時候，我們將不會公佈檢查。
比如，偵探小說，一個方面的pset 4，
是一種令人失望的，如果我們給你
的答案，因為它是什麼，而且也透露了一些方法來
誰的人是在這紅色的噪音。
該規範將在未來的指定pset的5起
什麼檢查為你存在。
你會發現底部有這個白色的URL。
就目前而言，這僅僅是診斷輸出。
如果您訪問該URL時，你會得到一大堆瘋狂的，神秘的消息
，歡迎您翻閱，但它主要是為工作人員
這樣我們就可以診斷和調試check50本身的錯誤。
>> 沒有廢話不多說，讓我們繼續前進，到我們離開的地方。
CS50庫我們想當然的幾個星期，
但上週，我們開始脫皮層之一。
我們開始擱置贊成什麼，而不是字符串嗎？
[學生]字符。
CHAR *，這一直是一個char *，
但現在我們不必假裝它是一個真正的數據類型的字符串。
相反，它一直為char *各種各樣的代名詞，
字符串是一個字符序列，
那麼，為什麼它的意義表示為char *的字符串？
什麼是一個char *的背景下，這個概念的一個字符串表示？
是的。>> [學生]：第一個字符。
好，第一個字符，但不完全的第一個字符。
[學生]。
好，第一個字符的地址。
這是需要在計算機的內存中表示字符串
只是其第一個字節的唯一地址。
你甚至不知道它有多長
因為你的身影，動態嗎？
[學生]：字符串長度。
您可以調用字符串的長度，優秀的，但如何字符串的長度？
它有什麼作用呢？是啊。
[學生]：保持下去，直到你得到的空字符。
是的，沒錯，它只是遍歷一個for循環，while循環，
表示無論從*到結束，並結束
\ 0，所謂的空字符，NUL，
不要混淆為null，這是一個指針，
會在談話中再次。
>> 我們剝開一層調用getInt，然後在GetString的，我們接過來一看，
和調用這些功能，還是真的，
GetString時，使用一定的函數
實際解析，是讀或分析用戶的輸入。
那是什麼新功能？
scanf或sscanf的。它實際上是在幾個不同的口味。
的scanf，sscanf的，有fscanf。
現在，雖然，讓我們專注於最容易說明的，
讓我去進取，不斷開拓的家電
這樣的文件，scanf1.c。
這是一個超級簡單的程序，
但是，做一些事情，我們從來沒有做過
沒有幫助的CS50庫。
這從用戶得到一個int。它是如何工作的呢？
那麼，在那裡的第16行中，
注意到，我們聲明一個int稱為x，在這一點上的故事，
x的值是什麼？
[聽不見的學生反應]
大衛M.]右，誰知道，一些垃圾的價值可能在17，我們只是告訴用戶
給我一個號碼，請步和第18步是它得到有趣的。
scanf函數似乎借用一個想法從printf的，因為它在引號中使用這些格式代碼。
％d是一個十進制數。
但是，為什麼我通過在＆X是x？
前者是正確的。是啊。
[聽不見的學生反應]
沒錯，如果這項計劃的目標，如的函數調用getInt本身，
是一個int的用戶，我可以通過功能
所有的變量，但我想，如果我不通過引用傳遞
或地址或指針，所有的目的的代名詞，
那麼這個函數有沒有能力改變這個變量的內容。
這將通過在副本一樣的馬車版本的Swap
我們已經談到了幾次。
>> 但是，這樣＆X，我從字面上傳遞什麼？
[學生]的地址。>> x的地址。
這就像scanf函數調用的函數繪製地圖，並在這裡說，
這些都是在計算機的內存塊的方向
，你可以去存儲一些整數中。
為了sscanf的，現在做的，
什麼樣的運營商，什麼樣的語法是要使用
即使我們不能看到它，因為別人寫了這個功能嗎？
換句話說 - 那是什麼？
[學生]：X讀。
還有的將是一些閱讀，但只有考慮到這裡的x。
，如果scanf函數是通過x的地址，
語法，什麼樣的運營商是必然存在的地方
內部，使scanf函數scanf函數的實現
其實可以寫一個2號線到該地址嗎？
是啊，所以*。
回想一下，*是我們的反引用運算符，這實際上意味著去那裡。
>> 一旦你已經交給一個地址，是這裡的情況，
scanf的可能是，如果我們環顧四周，它的源代碼
* x或相當於真正去到該地址，並把一定的價值。
現在，scanf是如何從鍵盤輸入的，
我們會揮動我們手中的今天。
只是假設操作系統允許sscanf的談
用戶的鍵盤，但在這一點上，現在在第19行中，
當我們簡單地打印出x，它似乎是
scanf函數把一個int x中。
這正是scanf是如何工作的，記得上週
這也正是GetString和調用getInt和其他家庭的功能
最終的作品，儘管略有差異，如sscanf的，
這意味著一個字符串，而不是掃描的鍵盤。
但是，讓我們來看看在這一點差異。
在scanf2，其實我搞砸了。
什麼是錯的，我會隱藏的評論來解釋盡可能多的
這個程序有什麼不妥，第2版？
技術可能。
它看起來不錯。
它很好地縮進，但
好了，怎麼樣讓我們修剪下來，以更短的問題嗎？
第16行。第16行做精確，但技術的英語是什麼？
開始有點尷尬。是的，邁克爾。
[學生]：它指向一個字符串的第一個字母。
>> 好了，很近的。讓我有一點點進行調整。
指向一個字符串的第一個字母，你聲明一個變量叫做緩衝
都將指向一個字符串的首地址，
或者更確切地說，將指向更具體的一個字符。
請注意，它實際上沒有指向任何地方，因為沒有任何賦值操作符。
有沒有等號，所以我們正在做的是所謂的緩衝區分配變量。
它正好是32位的，因為它是一個指針，
和緩衝區的內容想必最終
將包含一個字符的地址，但現在，緩衝包含什麼？
只是一些假的，誰知道，一些垃圾的價值，
因為我們並沒有顯式初始化，所以，我們不應該做任何假設。
好了，現在17行，什麼17行辦呢？
也許這將溫暖起來。
它打印一個字符串，對不對？
它打印出字符串請。
>> 第18行是一種熟悉的，現在在我們剛剛看到的方差
但具有不同的格式代碼，所以在第18行中，
我們在這裡告訴scanf函數是一個內存塊的地址。
我希望你能響在一個字符串中，暗示的％s的，
但問題是，我們並沒有在這裡做了幾件事情。
的問題之一是什麼呢？
[學生]：它試圖取消引用一個空指針。
好，空，否則未知的指針。
你交給scanf函數的地址，但你剛才說剛才
該地址是一些垃圾的價值，因為我們沒有實際分配任何東西，
所以你告訴scanf函數有效地去把一個字符串，
但我們不知道這裡還
所以我們並沒有實際分配的內存的緩衝區。
此外，你甚至也沒有告訴scanf函數嗎？
假設這是一個內存塊，它是不是垃圾的價值，
但你還是沒有告訴scanf的一些重要的東西。
[學生]：它實際上是符號。
與符號，所以在這種情況下，它沒關係。
因為緩衝區已經被聲明為一個指針
*的語法，我們並不需要使用符號
，因為它是一個地址，但我想我聽到了這裡。
[學生]：它有多大？
好，我們沒有告訴scanf函數有多大，這個緩衝區，
這意味著即使緩衝區的指針，
我們說scanf函數，把一個字符串在這裡，
但在這裡，可能是2個字節，也可能是10個字節​​，它可能是一個兆字節。
scanf函數不知道，因為這是一個內存塊
據推測，它不是一個字符串還。
這只是一個字符串，一旦你寫個字符，\ 0到該內存塊。
現在，它只是一些的內存塊。
scanf函數不知道什麼時候停止寫入到該地址。
>> 如果你還記得我隨意在鍵盤上鍵入一些例子，在過去的
嘗試緩衝區溢出，正是和我們聊上週五。
如果攻擊者以某種方式注入到你的程序中一個更大的字
或句子或短語，那麼你，希望你可以溢出
一個內存塊，它可以有不良後果，
如在整個程序本身。
我們需要以某種方式解決這個問題。
讓我縮小，進入第3版的這個方案。
這是一個稍微好一點。
在這個版本中，發現其中的差別。
在第16行，我再次聲明一個變量叫做緩衝，
但究竟是什麼呢？
這是一個數組的16個字符。
這是一件好事，因為這意味著我現在可以告訴scanf函數
這裡是一個實際的內存塊。
現在為指針的數組，你幾乎可以認為，
即使他們不是實際上是等效的。
他們會在不同的上下文中有不同的表現。
但它肯定是緩衝區被引用的情況下，
16個連續的字符，因為這是一個數組是
和現在已經有好幾個星期。
>> 在這裡，我說的，scanf是這裡的一大塊的內存。
這一次，它實際上是一個內存塊，
但為什麼這個程序仍然可利用的呢？
什麼仍然是錯的？
我說給我16個字節，但是，
[學生]：如果輸入超過16？
沒錯，如果用戶鍵入17個字符或1700個字符是什麼？
事實上，讓我們看看如果我們不能現在絆倒這個錯誤。
這是更好，但並不完美。
讓，我繼續運行編譯這個程序，使scanf3的。
讓我跑scanf3，字符串，請：您好，我們似乎會好起來的。
讓我嘗試稍長，你好。
好吧，讓我們不打招呼，你今天怎麼，Enter鍵。
在這裡獲得一種幸運，讓我們說，你好，你怎麼樣。
該死的。
好了，我們是幸運的。讓我們來看看，如果我們能夠解決這個問題。
不，它不會讓我抄。
讓我們再試一次。
所有權利。
我們會看到，我可以假裝多久焦點，而這樣做。
該死的。這是相當合適的，其實。
我們走吧。
點而成。
>> ，尷尬的，但它也是，它也是引起極大的混亂的來源之一
編寫程序時有錯誤的，因為他們表現自己
有時在一段時間內只有一次。
現實的情況是，即使你的代碼被徹底打破，
它可能只被徹底打破了曾經在一段時間內
因為有時候，基本上會發生什麼是操作系統分配
一點點更多的內存比你實際需要的不管是什麼原因，
所以沒有其他人使用的內存塊的16個字符，
所以，如果你去17，18，19，不論如何，這不是什麼大不了的。
現在，計算機，即使在這一點上，不崩潰
其他的東西，可能最終使用的字節數17或18或19，
在這一點，你把你的數據有，但過長，
要覆蓋潛在的一些其他功能。
它不一定是要保持不變，
但不一定會導致段故障。
但是，在這種情況下，我終於提供了足夠的字符
，我基本上是超出了我的內存段，咣當，
操作系統的說：“對不起，這是沒有好，分割故障。”
>> 讓我們來看看，如果現在仍然在我的目錄
請注意，我這裡有這個文件，核心。
請注意，這是再次呼籲一個核心轉儲。
它本質上是一個文件，其中包含你的程序的內存中的內容
在點，它墜毀，
只是為了嘗試一個簡單的例子：在這裡讓我去
和運行gdb上scanf3的，然後指定了第三個參數，稱為核心，
並注意在這裡，如果我列出的代碼，
像往常一樣，我們就可以用gdb開始步行通過這個節目，
我可以運行它，並盡快為我打的步驟，在gdb的命令
只要我打了潛在的車線後鍵入一個巨大的字符串，
我將能夠識別在這裡。
更多關於這一點，雖然，在部分核心轉儲
等，讓您可以閒逛內將核心轉儲
看到在哪一行的計劃失敗。
然後在指針和地址的任何問題？
因為今天開始，我們要開始考慮是理所當然的，這些東西存在
我們知道究竟是什麼。
是。
>> [學生]：為什麼你沒有把符號的部分
這個問題問得好。
為什麼我沒有把一個符號的字符數組，因為我以前的
我們的例子嗎？
簡短的回答是數組是有點特別。
你幾乎可以認為一個緩衝區實際上是一個地址，
它只是發生的情況下，方括號表示法
是一個方便的，這樣我們就可以進入支架，支架1，
托架2，而無需使用*符號。
這是一個有點善意的謊言，因為數組和指針
，其實是有點不同，但他們往往但並不總是可以互換使用。
總之，當一個函數需要一個指針，指向一個內存塊，
您可以通過malloc返回的地址，
，我們將看到的malloc再過不了多久，你可以通過它的名稱的數組。
你不必做符號的數組，因為他們已經
基本上和地址。
這是一個例外。
讓他們特別的方括號。
>> 你可以把一個符號旁邊的緩衝區？
不能在這種情況下。
這是行不通的，因為這個角落的情況下，
數組是不太實際的地址。
但是，我們也許會回來，不久與其他的例子。
讓我們嘗試在這裡解決的一個問題。
我們有一個數據結構，我們已經使用了一段時間被稱為數組。
典型的例子，這就是我們剛。
但數組有一定的積極以及不利的缺點。
數組是不錯的，為什麼呢？
什麼是一件事，你喜歡你喜歡的陣列有關數組的範圍內嗎？
方便他們什麼？引人注目的是什麼？
為什麼我們向他們介紹擺在首位？
是啊。
[學生]：他們可以存儲大量的數據，你不必使用整個的事情。
您可以使用一節。
好，一個陣列，可以存儲大量的數據，
你不一定必須使用它的所有，所以你可以overallocate，
這可能是方便的，如果你事先不知道有多少的期望。
>> GetString的是一個完美的例子。
GetString時，我們寫的，不知道多少個字符，
所以事實上，我們可以分配的連續內存塊還是不錯的。
數組也解決一個問題，我們現在看到幾個星期前
您的代碼開始下放一些非常糟糕的設計。
回想一下，我創建了一個叫大衛的學生結構，
然後這實際上是一種替代方法，雖然
有一個名為name的變量與另一個變量，我認為，房子，
和另一個變量稱為ID，因為在這個故事中，我想介紹一些其他
像Rob到程序中，所以後來我決定等待一分鐘，
我要重命名這些變量。
讓我們把我的NAME1，ID1，house1。
讓我們把搶奪的名稱2，house2，ID2。
但是，然後等待一分鐘，湯米？
然後，我們有三個變量。
我們引進了別人，四組變量。
世界開始變得混亂非常迅速，
所以我們引入了結構，什麼是引人注目的一個結構？
什麼是一個C結構讓你這樣做嗎？
這是今天真的很尷尬。
什麼？>> [聽不見的學生反應]
是啊，特別是上，typedef可以讓你創建一個新的數據類型，
結構，struct關鍵字，讓你封裝
概念上相關的數據塊
此後他們類似的學生。
>> 這是很好的，因為現在我們可以模擬
更排序的概念相一致的概念，一個學生在一個變量
而不是任意具有一個為一個字符串，一個用於一個ID，等等。
數組是不錯的，因為他們讓我們開始清理我們的代碼。
但現在是一個缺點的數組？
你能不能做？是啊。
[學生]：你要知道它有多大。
你要知道它有多大，所以它是一種痛苦。
那些具有編程經驗知道，在很多語言中，
如Java，你可以問一個內存塊，特別是一個數組，
究竟有多大，其長，財產，可以這麼說，這是真的很方便。
在C語言中，你甚至可以不調用strlen一般的數組
由於strlen，因為這個詞所暗示的，是唯一的字符串，
你可以計算出字符串的長度，因為這個人的慣例
有一個\ 0，而是一個數組，更一般地，僅僅是一塊內存。
如果它是一個整型數組，不會有一些特殊的字符
在結束等著你。
你要記住一個數組的長度。
數組的另一個缺點抬頭的GetString本身。
數組的另一個缺點什麼？
主席先生，只有你和我。
[聽不見的學生反應] >>這是什麼？
它的聲明在堆棧中。
好了，在堆棧上聲明。你為什麼不這樣呢？
[學生]：因為它得到重用。
它得到重用。
好吧，如果你使用一個數組分配內存，
例如，你不能返回它，因為它是在棧上。
好吧，這是一個缺點。
怎麼樣的數組？
一旦你分配它，你種旋，如果你需要更多的空間
比陣列。
>> 然後，我們介紹，召回時，malloc，這給了我們動態分配內存的能力。
但是，如果我們嘗試了完全不同的世界？
如果我們想解決這些問題，一對夫婦的
我們，而不是我的筆已經睡著了，在這裡，
如果我們不是想實質上是創建了世界上不再像嗎？
這是一個數組，當然，這種惡化，一旦我們打到最後的數組，
我現在不再有另一個整數或其它字符的空間。
如果我們什麼樣的先發製人說好了，為什麼我們不能放鬆
這個要求是，所有這些內存塊是連續的背靠背，
為什麼不，當我需要一個int或一個字符，
只要給我空間，其中之一嗎？
當我需要，給我另一個空間，
當我需要，給我一個空間。
優勢是，如果別人
在這裡，佔用內存沒什麼大不了的。
我會承擔這額外的內存塊，那麼這個人。
>> 現在，唯一的缺點是，幾乎感覺就像我有
一大堆不同的變量。
這感覺就像是5個不同的變量潛在的。
但是，如果我們偷的想法字符串
據此，我們以某種方式連接這些東西放在一起從理論上講，和什麼如果我這樣做嗎？
這是我很差繪製的箭頭。
但是，假如這些內存塊
指出的，這傢伙，誰沒有兄弟姐妹在他的右邊，
有沒有這樣的箭頭。
其實，這是什麼所謂的鏈接列表。
這是一個新的數據結構，使我們能夠分配的內存塊，
然後又一次，另一個，然後再在任何時候，我們要
在一個程序，我們還記得，他們都以某種方式相關的
從字面上鏈接在一起，我們這樣做，形象地在這裡有一個箭頭。
但是，在代碼中，會是什麼機制，通過它，你可以以某種方式連接，
幾乎一樣從頭開始，另一塊塊？
我們可以用一個指針，對不對？
因為真正的箭頭，從左上角的正方形，
這傢伙在這裡，這其中，包含在這個廣場
不只是一些整數，不只是一些字符，但如果我真的分配
一點點額外的空間，所以，現在，
我的每一個內存塊，即使這要花費我，
其中之一的內存塊，現在看起來多了幾分矩形
被用於一個數字，如數字1，
如果這個傢伙，然後存儲數字2，
這其他的內存塊，用於箭頭，
或者更具體而言，一個指針。
並想我存儲在這裡，我使用它來指向那個傢伙，
現在這傢伙，讓我們假設我只需要三個這樣的內存塊。
我會畫一條線，表明空。
有沒有額外的字符。
>> 事實上，這是我們如何去執行
而這就是所謂的一個鍊錶。
鍊錶是一種新的數據結構，它是一個敲門磚
票友數據結構著手解決問題
沿線Facebook的類型的問題，谷歌型的問題
你有巨大的數據集，它不再削減
連續存儲一切，並使用類似線性搜索
甚至一些像二進制搜索。
你想更好的運行時間。
事實上，人們的聖杯，我們將討論在本週晚些時候或明年
是一種算法，其運行時間是恆定的。
換句話說，它總是以相同的時間量無論
有多大的投入，這確實是引人注目的，
甚至更多的東西比數。
這是什麼在屏幕上呢？
每個矩形正是我剛才畫的手。
但事情的方式在左邊是一個特殊的變量。
這將是一個單一的指針，因為有一個問題
一個鍊錶，因為這些東西被稱為，
是，你必須掛到鍊錶的一端。
>> 就像一個字符串，你必須知道的第一個字符的地址。
同樣的處理鍊錶。
你必須知道的第一個內存塊的地址
因為從那裡，你可以達到每一個。
不利的一面。
我們付出什麼樣的價格，這種多功能的具有動態
相當大的數據結構，如果我們需要更多的內存，做工精細，
只是分配一個塊，並畫一個指針
舊到新的尾的列表嗎？
是啊。
[學生]：這需要約兩倍的空間。
它需要兩倍的空間，所以這絕對是一個缺點，我們已經看到了這
時間，空間和靈活性之間的權衡前
現在，我們需要的不是這些數值分別為32位。
我們真正需要的數字64，32和32，用於將指針。
但是，嘿，我有2 GB的RAM。
添加另外32位在這裡和這裡似乎並不認為大不了的。
但對於大型數據集，它肯定加起來到字面上的兩倍多。
的另一個缺點什麼，或什麼功能，我們放棄了，
如果我們是代表一個鍊錶，而不是一個數組列表的東西，？
[學生]：您可以向後遍歷。
您可以向後遍歷，所以你種擰如果你走
從左至右使用for循環或while循環
然後你會意識到，“哦，我想回到開始的名單。”
你不能因為這些指針只由左到右的箭頭表示。
>> 現在，你可以記住列表的開始與另一個變量，
但要記住，這是一個複雜的。
一個數組，不管你走多遠，你總是可以做減，減，減，減
回到來處。
另一個缺點是什麼？是啊。
[聽不見的學生問題]
，所以你可以你實際上只是提出了一個雙向鍊錶數據結構，
而事實上，你會增加這些矩形的另一個指針
“其他方向，上攻
現在你就可以遍歷來回，
的缺點是，現在你正在使用三次盡可能多的內存，我們使用
並且還加入複雜的代碼，你寫得到它的權利。
但這些都可能是非常合理的折衷，，如果反轉更重要的是。
是啊。
[學生]：你也不能有一個2D鏈接列表。
好，你可以不真的有一個二維鍊錶。
你可以。這不是那麼容易達到的陣列。
與數組一樣，你做開放式的支架，封閉的支架，打開支架，封閉支架，
，你會得到一些的二維結構。
你可以實現一個2維鍊錶
如果你這樣做附加你提出的第三個指針，這些東西，
如果你認為你的另一個列表3D風格
從屏幕到我們所有人來說，這僅僅是某種形式的另一個產業鏈。
我們能做到這一點，但它不是簡單，只要鍵入開括號，方括號。是啊。
[聽不見的學生問題]
好，所以這是一個真正的踢球者。
>> 這些已經消瘦了，我們喜歡哦，二進制搜索算法，
您可以搜索陣列上的數字板
或電話簿，以便更迅速，如果您使用分而治之
二進制搜索算法，，但二進制搜索需要兩個假設。
其中，該數據被排序。
現在，我們可以推測這個排序，
所以也許這不是一個問題，但還承擔二進制搜索
你有隨機存取的號碼列表，
陣列允許您進行隨機存取，隨機存取，
我的意思是，如果你是一個數組，你需要多少時間
支架0？
一人操作，你只需要使用[0]和你說得對。
沒有考慮到位置10多少步？
一步，你只是去[10]你的存在。
相比之下，你怎麼在一個鍊錶到第10的整數？
因為你只記得，你必須從頭開始
一個鍊錶的開始，就像一個字符串被記住
它的第一個字符的地址，並發現第10整數
或10字符串中的字符，你必須搜索整個該死的東西。
>> 同樣，我們還沒有解決所有的問題。
我們正在推出新的，但它實際上取決於你想要什麼設計。
在實施方面，我們可以借用一個想法，學生結構。
它的語法很相似，但現在的想法是多了幾分抽象
比房子，名稱和ID。
不過，我建議，我們可以有一個數據結構的C
被稱為節點，在幻燈片上顯示的最後一個字，
裡面一個節點，一個節點是在計算機科學只是一個普通的容器。
它通常畫成一個圓或正方形或長方形，因為我們已經做了。
這個數據結構中，我們有一個int，N，
所以這是我想存儲的號碼。
但是，這是什麼第二線，結構節點下的嗎？
為什麼這是正確的，這個東西發揮什麼樣的作用，
即使這是一個有點神秘的第一眼？
是啊。
[聽不見的學生反應]
沒錯，*排序的戰利品，這是某種類型的指針。
這個指針的名字是任意下，
但我們可以把它叫做我們想要的東西，但什麼該指針指向？
[學生]：另一個節點。>>沒錯，它指向到另外一個這樣的節點。
>> 現在，這是排序的好奇心，C.
回想一下，C被讀取由編譯器從上到下，從左到右，
這意味著，如果 - 這是一個有點不同，從我們所做的與學生。
當我們定義一個學生，我們實際上沒有一個字。
剛才說的typedef。
然後，我們必須int的ID，字符串名稱，字符串的房子，
然後學生在底部的結構。
此聲明是一個有點不同，因為，
再次，C編譯器是一個有點啞。
這只是要讀從上到下，
因此，如果到達2號線
下一個被聲明，它認為，哦，這裡有一個變量稱為下。
這是一個指針，指向一個結構節點。
編譯器就是要實現一個結構節點是什麼？
我從來沒有聽說過這件事之前，
因為這個詞節點，否則可能不會出現
直到底部，所以有這樣的冗餘。
你說結構節點，然後你就可以縮短以後
於typedef在這裡，這是因為
我們所引用的結構本身的內部結構。
這是一個疑難雜症有。
>> 一些有趣的問題出現。
我們已經有了一個數字列表。我們怎麼插入？
我們如何搜索呢？我們如何刪除它？
尤其是現在，我們必須管理所有這些指針。
你以為指針有點令人費解
當你有一個，他們只是想讀取一個int。
現在我們就來操縱整個列表的價值。
為什麼我們不把我們的5分鐘的休息時間，在這裡，然後我們會帶
一些人在舞台上這樣做。
>> C是更多的樂趣時，它的行動了。
哪些人會從字面上是第一嗎？
好了，就行了。你是第一個。
誰願意為9？好吧，9。
9怎麼樣？ 17？
這裡一個小團體。 22和26，前排。
然後怎麼樣的人在那裡被指出。
你有34個。好吧，34就行了。
首先是在那裡。好了，你們四個。
我們誰也說9？
誰是我們的9？
誰真正想要的是9？好吧，來吧，是9。
在這裡，我們走了。
34，我們將滿足你在那裡。
第一部分是使自己看起來像他一樣。
26，22，17，良好的。
如果你能站到一邊，因為我們要malloc你在某一時刻。
>> 好，好。
好，很好，所以讓我們在這裡問幾個問題。
實際上，什麼是你的名字嗎？“梅艷芳。
梅艷芳，沒關係，在這裡。
梅艷芳樣的幫助我們解決了一個相當簡單的問題，第一，
你是怎麼做的，而不是一個值是否在列表中呢？
現在，請注意，第一，這裡所代表的盧卡斯，
是有點不同的，所以他的一張紙是故意側身
因為它不是相當高，不佔用多少位，
即使在技術上他有相同尺寸的紙張，只是旋轉。
但他是一個有點不同，他只有32位的指針，
所有這些傢伙都是64位，其中一半是多少，其中一半是指針。
但指針沒有描述的，所以如果你們能有點笨拙
用左手指向旁邊的人給你。
你是34號。你叫什麼名字？
阿里。
阿里，所以實際上，保存的文件在你的右手，左手向下的直線。
表示空的左側。
>> 現在我們的人的照片是非常一致的。
這實際上是指針的工作方式。
如果你能一點點堆砌方式，所以我不是在用自己的方式。
梅艷芳在這裡，找到我的22號，
但假設一個約束的不是人拿著紙片，
但是這是一個列表，你只需要盧卡斯開始
因為他是名符其實的第一個指針。
假設你自己是一個指針，所以你也有能力指向的東西。
你為什麼不首先指向的正是盧卡斯指著嗎？
好，讓我在這裡制定了這一點。
為了討論的方便，讓我拉了一個空白頁。
你怎麼拼寫你的名字嗎？“梅艷芳。
好了，梅艷芳。
比方說節點*阿尼塔·盧卡斯。
好了，我們不應該給你打電話盧卡斯。我們應該先打電話給你。
這是為什麼，其實與現實在這裡？
其中，第一個已經存在。
大概是首先被分配在這裡的某個地方。
節點*首先，它被分配的名單不知何故。
我不知道這是怎麼發生的。這發生在上課前開始。
這個鍊錶人類已創建。
在這一點上的故事，這是所有在Facebook上顯然後
在這一點上的故事，梅艷芳已被初始化為等於第一，
這並不意味著在盧卡斯，梅艷芳點。
相反，她指著他指出在
因為相同的地址裡面的Lucas的32位 - 1，2，3 -
現在也Anita的32位 - 1，2，3的內側。
>> 找到22。你將如何去這樣做呢？
那是什麼？>>指向任何。
點什麼，所以，儘管它作為最好的，你可以在這裡行動。
好，好，現在你指著你叫什麼名字22？
“拉蒙，拉蒙。，所以拉蒙同比增長22。
現在，您已經做了檢查。
拉蒙== 22，如果是的話，例如，我們可以返回true。
讓我，而這些人站在這裡，有點笨拙
讓我做的東西像Bool快速找到。
我要繼續前進，並說（節點列表，詮釋n）。
跟你說，我馬上就回來。我只需要編寫一些代碼。
現在我要繼續前進，並做到這一點，節點梅艷芳=列表。
我要繼續前進，並指出，雖然（袁詠儀！= NULL）。
>> 這裡的比喻還是有點捉襟見肘，但（袁詠儀！= NULL），我想這樣做嗎？
我需要一些方法的引用
梅艷芳指向的整數。
在過去，當我們有結構，其中節點是
我們使用點符號，我們會這樣說
anita.n，但這裡的問題是，Anita是不是結構本身。
她是什麼人？
她是一個指針，所以真的，如果我們想用這點表示法
這是怎麼回事看故意有點神秘
我們必須做這樣的事情去任何Anita的左手指向
然後得到該領域稱為n。
Anita是一個指針，但*梅艷芳是什麼？
你覺得什麼，當你去Anita是指什麼？
一個結構，一個節點，一個節點，召回，有一個字段稱為n
因為它，記得，這2場，下和n，
我們剛才也看到了這裡。
>> 為了真正模仿的代碼，
我們可以這樣做，並說，如果（（*梅艷芳）N = N），我在尋找的n。
請注意，該功能是通過我關心的數量。
然後我就可以繼續做類似返回true。
否則，如果不是這樣的情況下，我想這樣做嗎？
我該如何翻譯的代碼有什麼梅艷芳這樣做直觀地走在列表中呢？
我應該怎麼做模擬梅艷芳的左側，採取這樣的步驟，一步到左邊？
[聽不見的學生回應] >>那是什麼？
[聽不見的學生反應]
好，不是一個壞主意，但在過去，當我們已經做到了這一點，我們已經做了梅艷芳+ +
因為這會增加數字1〜梅艷芳，
這通常指向旁邊的人，像拉蒙
旁邊的人，他或他旁邊的人的路線。
但是這還不是相當不錯的，在這裡，因為這是什麼東西在內存中的樣子嗎？
不是這樣的。我們必須禁用。
它看起來像這樣在內存中，即使我已經開了1個和2個和3靠近彼此，
如果我們真的模擬這個可以你的傢伙，而仍指向相同的人，
你們中的一些採取隨機退後一步，一些你一個隨機的一步嗎？
>> 這個爛攤子仍是一個鍊錶，
但這些人可能是在內存中的任何地方，
阿尼塔+ +沒有去上班，為什麼呢？
什麼位置梅艷芳+ +？
誰知道。
這是一些其他的價值，只是恰巧被插
在所有的這些節點的機會，因為我們不使用一個數組。
我們分配每個節點。
好吧，如果你們可以清理自己回來了。
最後，我提議，而不是梅艷芳+ +，而不是做梅艷芳得到
好，為什麼我們不走任何Anita是指向，然後做下？
換句話說，我們去拉蒙，他的22號，
然後，接下來就是雖然梅艷芳模仿他的左手指針。
但她不會走的更遠，因為我們比拉蒙發現有22。
但是，這將是這個想法。現在，這是一個神爛攤子。
說實話，沒有人會永遠記住這個語法，幸運的是，
它實際上是有點故意的，哦，你沒有實際看到我寫的是什麼。
如果可以的話，這將是更具吸引力的。瞧！
>> 在幕後，我解決這樣的問題。
阿妮塔，採取這一步驟的左側，
首先，我們去的地址，Anita是指向
和在那裡她會發現不只有N，我們只是檢查比較的緣故，
但你也將尋找下一個 - 在這種情況下，
拉曼左手指著在列表中的下一個節點。
但是，這是我前面提到的神的爛攤子，
但事實證明，輸出C讓我們簡化了這一點。
而不是寫（梅艷芳），我們可以改為只寫梅艷芳 - > N，
和它的功能完全一樣的東西，但它是一個更直觀的，
這是一個很大的圖片更符合我們一直畫
這一切的時候使用箭頭。
>> 最後，在課程結束後，我們需要做的嗎？
還有一個剩餘的代碼行。
回報是什麼？
假的，因為如果我們通過整個循環
Anita是，事實上，空，這意味著她千里迢迢到列表末尾
她指著你叫什麼名字呢？
阿里。>>阿里的左手，這是空的。
現在，Anita是空的，我意識到你只是站在這裡，笨拙的地獄
因為我要去獨白，
但我們會涉及到你在短短的時刻。
Anita是空的故事，在這一點上，因此while循環結束，
我們必須返回false，因為如果她得到了Ari的空指針的方式來
再有就是沒有，她試圖在列表中的號碼。
我們可以清潔過，但是這是一個很好的實現，那麼
遍歷函數，一個鏈接列表的功能。
它仍然是線性搜索，但它不是簡單+ +指針
+ +變量i，因為現在我們不能猜
這些節點，其中每個都在存儲器中。
我們有字面上跟隨麵包屑的踪跡，或者更具體地說，
指針，從一個節點到另一個。
>> 現在，讓我們嘗試另一種。安妮塔，你要回來嗎？
我們為什麼不繼續分配從觀眾的另外一個人嗎？
malloc的，你叫什麼名字？“麗貝卡。
麗貝卡。 Rebecca一直malloced，從觀眾，
她現在存儲55號。
現在在手的目標是梅艷芳插入
麗貝卡到鍊錶，在合適的地方。
到這兒來了一會兒。
我已經做了這樣的事情。
我已經做了節點*。你叫什麼名字呢？
瑞貝卡，瑞貝卡。>>還好。
麗貝卡得到的malloc（如sizeof（節點））。
就像我們在過去的分配學生和諸如此類的事情，比如，
我們需要的大小的節點，所以現在瑞貝卡
是指什麼？
麗貝卡她的內部具有兩個字段，其中之一是55。
讓我們做什麼，麗貝卡 - > = 55。
但後​​來麗貝卡 - >未來應像現在，她的手是怎麼樣的，誰知道？
它指向一些垃圾的價值，那麼，為什麼不為好措施
我們至少要做到這一點，使左手在她的身邊。
現在，梅艷芳，把它從這裡開始。
你有瑞貝卡已被分配。
繼續前進，發現我們應該把麗貝卡。
好，非常好。
好了，好了，現在我們需要你提供一點方向，
所以你已經達到了阿里。
他的左手是空的，但麗貝卡顯然屬於正確的，
讓我們怎麼改變這個鍊錶
為了插入到適當的位置麗貝卡？
如果你可以從字面上將根據需要周圍人的左手，
我們會解決這個問題的方式。
好，好，同時，麗貝卡的左手在她的身邊。
>> 這是太容易了。
讓我們嘗試分配的 - 我們做得差不多了，20。
好了，就行了。
20已分配的，所以讓我去，說在這裡再次
我們剛剛做了的節點*薩德。
我們擁有的malloc（如sizeof（節點））。
然後，我們做完全相同的語法，因為我們做了前20，
我會盡下= NULL，現在是Anita的
插入到鍊錶中，如果你能玩，相同的作用。
執行。
好，好。
現在仔細想想，然後再開始移動周圍的左手。
您的今天得到了最尷尬的角色。
誰的手應先移走？
好了，等等，我聽到一些​​不。
如果有些人會禮貌地幫助解決一個尷尬的境地。
誰的左手也許應該首先更新嗎？是啊。
[學生]薩阿德。
好了，薩阿德的，為什麼有關係嗎？
[聽不見的學生反應]
好，因為如果我們把你叫什麼名字？>>馬歇爾。
馬歇爾，如果我們先動了手，空，
現在，我們已經從字面上孤立在此列表中的四個人
因為他是唯一指向拉蒙和每個人的左，
所以更新該指針是壞的。
我們的撤消。
好，現在繼續前進，將適當的左手指向拉蒙。
這感覺有點多餘。
現在有兩個人指著拉蒙，但
因為現在我們怎麼更新列表？
另一方面，移動嗎？
好極了，現在我們失去了任何記憶了嗎？
沒有那麼好，讓我們來看看，如果我們不能打破這一次。
>> Mallocing最後一次，5號。
在後面，一路下來吧。
這是非常令人興奮的。
[掌聲]
你叫什麼名字？“羅恩。
羅恩，好吧，你是malloced 5號。
我們剛剛執行的代碼幾乎相同，這些
只用一個不同的名字。
優秀。
現在，梅艷芳，運氣好的話插入到列表中的5號。
好，？
好極了，所以這是真正的三個案件總數的三分之一。
我們第一次有人結束時，麗貝卡。
然後，我們在中間的人。
現在我們在開始時，並且在該示例中，已經有人
我們現在有更新盧卡斯的第一次
因為現在在列表中的第一個元素指向一個新的節點，
誰，依次指向在節點號9。
>> 這是一個巨大的尷尬的示範，我敢肯定，
所以這些傢伙又大又圓的掌聲，如果你能。
很好地完成。
這就是全部。作為一個小的內存，您可以保留您的紙片。
事實證明，這樣做的代碼
是不是很簡單，只是動動手左右
和指向指針的不同的東西。
但意識到，當它來的時候實現的東西，如
一個鍊錶或它的一個變種，如果你專注於真正
這些基本因素，一口大小的問題，我必須弄清楚，
是這只手，這手，否則，什麼是一個相當複雜的程序
可以，其實這樣相當簡單的積木。
>> 讓我們把事情仍然在一個更複雜的方向。
我們現在有鍊錶的概念。
我們也有感謝的建議有一個雙向鍊錶，
這看起來幾乎是一樣的，但現在我們有兩個內部指針的結構
，而不是一個，我們也許可以調用這些指針的前面和後面的
或左或右，但我們做的，其實，需要其中的兩個。
代碼將是更複雜一點。
梅艷芳將不得不做更多的工作在這裡的舞台上。
但是，我們可以肯定實現該種結構。
但是，在運行時間方面，將運行時間
梅艷芳一個鍊錶中找到一個數n？
還是大O n的，所以它是沒有更好的線性搜索。
不過，我們不能做二進制搜索。
為什麼會這樣呢？你不能跳來跳去。
儘管我們很明顯的看到在舞台上的所有人類，
和Anita目測它說，“這裡是中間的列表中。”
她不知道，如果她的計算機程序
因為她唯一鎖存到的情況下開始
盧卡斯，誰是第一個指針。
她一定要遵循這些鏈接，
數她，直到她找到大致的中間，
即使如此，她不知道，當她到達中間
除非她去所有的方式結束弄清楚有多少，
然後回溯，而且也將是很難的，除非你有
某種形式的雙向鍊錶。
>> 解決一些問題，但介紹他人。
約一個完全不同的數據結構呢？
這是一個照片的托盤Mather中樓，
在這種情況下，我們有一個數據結構，我們也種已經在談論。
我們談論中的堆棧內存的情況下，
而這樣的刻意命名，是因為堆棧在內存方面
實際上是一個數據結構，有越來越多的東西，在它的上面分層。
但有趣的事情堆棧，因為在現實的情況下，
是，它是一種特殊的數據結構。
它是一個數據結構，從而使第一元件
是的最後一個元素。
如果你是第一個托盤入堆棧，
你要不幸的是，最後一個托盤從堆棧中，
而這並不一定是件好事。
相反，你可以考慮一下周圍的其他方法，
最後是第一個出來的。
>> 現在，你的任何方案，浮現在腦海中有一個堆棧
數據結構，具有該屬性
中的最後一個，第一個出來的，實際上是吸引力？
這是一件好事嗎？這是一件壞事嗎？
這絕對是一件壞事，如果托盤不盡相同
他們都是不同的顏色或諸如此類的東西，
你想要的顏色是所有的方式在底部。
當然，你不能，不花大力氣。
你必須從頂部開始，一路下滑。
同樣，如果你​​是其中之一，這些風扇男孩
試圖讓iPhone和排隊等待了一夜的人
在這樣的地方嗎？
那豈不是很好，如果蘋果專賣店
一個堆棧的數據結構嗎？
耶？不僅如此嗎？
這只是良好的人顯示在最後一分鐘
，然後被拔了隊列。
而事實上，這樣的傾向的事實，我說隊列
實際上是一致的，我們所說的這種數據結構，
在現實中的順序很重要，
你想中的第一個，是第一個
如果僅僅是為了人類的公平。
一般情況下，我們將調用一個隊列的數據結構。
>> 事實證明，除了鍊錶，我們就可以開始使用這些相同的基本思路
開始創建新的，不同類型的解決方案的問題。
例如，在堆棧的箱子中，我們可以表示一個堆棧
使用的數據結構是這樣的，我會提出。
在這種情況下，我宣布一個結構，我已經說過了這種結構的內部
是一個數字數組變量的大小，
我會打電話給這件事情一個堆棧。
現在，為什麼會發生這種實際工作？
在堆棧的情況下，我可以得出這樣有效地在屏幕上為一個數組。
這裡是我的籌碼。這是我的號碼。
我們將吸引他們，因為這，這，這，這，這。
然後，我這裡有一些其他的數據成員，
被稱為大小，所以這是大小，這是數字，
集體，在這裡代表整個iPad的一個堆棧結構。
現在，默認情況下，大小大概已經有被初始化為0，
裡面有什麼數字陣列最初
當我第一次分配的數組？
垃圾。誰知道？它實際上並不重要。
它並不重要，如果這是1，2，3，4，5，完全隨機
我的結構中存儲的運氣不好，因為只要我知道的堆棧大小
為0，則我知道編程方式，不看任何數組中的元素。
不要緊，那裡有什麼。
不要看他們，將一個大小為0的含義。
>> 但是，假設現在我先走，然後插入到堆棧中的東西。
我想插入數字5，所以我把這裡的5號，
，然後我放下嗎？
現在我想放下的大小，
現在的堆棧大小為1。
如果我繼續前進，插入數字，讓我們說，7下嗎？
，然後被更新為2，然後我們會做9，
然後這被更新為3。
但有趣的功能，現在該堆棧的是，
如果我想彈出，我應該刪除哪一個元素
的堆棧的東西，可以這麼說嗎？
9將是去的第一件事情。
應該如何改變圖片，如果我想從棧中彈出一個元素，
很像一個托盤Mather中？
是的。>> [學生]：設置大小為2。
沒錯，我做的是設置大小為2，和與陣列我該怎麼辦？
我沒有做任何事情。
我可以，只是肛門，把一個0或-1的東西來表示
這是不是一個合法的值，但它並不重要，因為
我可以記錄以外的數組本身它有多長
所以，我知道，只有在此數組中的前兩個元素。
現在，如果我去了，8號添加到這個數組中，如何改變圖片嗎？
這將成為8，而且這變成3。
我在這裡省幾個小錢。
現在，我們有5個，7，8，和我們回來了大小為3。
這是非常簡單的實現，
但我們什麼時候這樣的設計決策感到後悔嗎？
什麼時候的事情開始去非常，非常錯誤嗎？是啊。
[聽不見的學生反應]
當你想回去拿你的第一個元素進去，
>> 原來，在這裡即使堆棧引擎蓋下的是一個數組，
這些數據結構，我們已經開始談論一般也被稱為
抽象的數據結構，他們是如何實現的
完全是除了點。
就像一個堆棧的數據結構應該是添加支持
操作上推，一個托盤推入堆棧，
和流行音樂，從堆棧中刪除一個元素，那就是它。
如果你是下載別人的代碼已經實施
這個東西叫做堆棧，這個人會寫
只有兩個函數，你push和pop，在生活中，其唯一目的
將這樣做。
你或他或她是誰實施該計劃
本來完全是一個決定如何實現
引擎蓋下方的壓入和彈出的語義
入棧和出棧的功能。
我已經在這裡做了一個有點短視的決定
通過實施這個簡單的數據結構，為什麼我的籌碼呢？
當這個數據結構的突破？
在什麼情況下我必須返回一個錯誤，當用戶調用push，例如？
[學生]：如果沒有更多的空間。
沒錯，如果沒有更多的空間，如果我超過容量，
這是全部大寫的，因為它表明它是某種全局常量。
好吧，那麼我只是將不得不說，“對不起，我不能把另一個值
到堆棧上，“就像在奧美。
>> 在某些時候，他們會打那個小櫃的頂部。
在堆棧中沒有更多的空間或能力，在這一點有某種錯誤。
他們必須把元素的其他地方，其他地方的盤，
或無處。
現在，我們的隊列，可以實現略有不同。
隊列是有一點不同，引擎蓋下的，它可以實現
作為一個數組，但為什麼，在這種情況下，我建議
也有一個頭元素的列表頭，
前面的列表，線的第一人，在蘋果商店，除了大小？
為什麼我需要一個額外的數據嗎？
回想一下號碼是什麼
如果我畫如下。
現在假設這是一個隊列，而不是一個棧，
是一樣的蘋果專賣店排隊的差異是公平的。
在列表中的開始，在這種情況下，5號線中的第一個人
他或她將要被讓進店的第一。
讓我們做到這一點。
假設，這是我的隊列的狀態，在這一刻的時候，和現在的蘋果專賣店
打開的第一人，5號，是導致進店。
如何更改我的圖片，我去排隊第一人
在前面的行？
那是什麼？>> [學生]：更改隊列。
改變頭，所以就消失了。
在現實中，它彷彿如何做到這一點？
在現實中，雖然這傢伙消失。
7號做什麼實際的店嗎？
他們將向前邁出一大步。
>> 但我們體會到，當涉及到陣列
移動周圍的事物嗎？
這是一種浪費你的時間了，對不對？
為什麼你要那麼肛門有第一人
行開始的，在物理上的內存塊的開始？
這是完全不必要的。為什麼呢？
我只記得什麼呢？>> [聽不見的學生反應]
沒錯，我只記得這個額外的數據成員頭
現在的列表頭的不再是0，它是剛才。
現在，它實際上是數字1。就這樣，我得到了輕微的優化。
只是因為我去排隊的人從行的行開始在蘋果專賣店
但這並不意味著每個人都有轉移，召回是線性的操作。
相反，我可以只花費固定的時間
然後實現更快的響應。
但我付出的價格是獲得額外的性能
而不是轉移大家的嗎？
是啊。>> [聽不見的學生反應]
可以添加更多的人，好了，這個問題是正交
的事實，我們周圍的人不轉移。
它仍然是一個數組，所以我們是否轉移大家或不
哦，我明白你的意思，好吧。
其實，我同意你在說什麼的，因為它幾乎就像
現在，我們永遠不會使用這個數組開始了
因為，如果我刪除，然後刪除7。
但我只把人民的權利。
>> 我感覺就像是在浪費空間，最後，我的隊列分解成什麼都沒有，
因此，我們可能只是人們概括的，
我們可以認為這個數組真的為某種圓形結構，
但我們用C做什麼運營商在那種環繞嗎？
[聽不見的學生回應] >>模運算符。
這將是一個有點惱人認為，你是怎麼做到的環繞，
，但我們可以做到這一點，我們就可以開始把人民的利益，在曾經被認為是該行的前面，
但我們只記得誰是實際的行頭其實是與這頭變量。
什麼，如果不是，最終，我們的目標是，
看數字，我們在這裡所做過的舞台上與梅艷芳，
但我們希望所有這些世界最好的嗎？
我們希望有更多的複雜性比數組
因為我們希望能夠動態增長的數據結構。
但是，我們不希望擁有的東西，我們指出
在第一堂課是不是一個最佳的算法，
線性搜索。
事實證明，就可以了，事實上，實現
或至少​​接近恆定的時間，有人喜歡梅艷芳，
她的數據結構配置，如果她是一個鍊錶，
不是一個堆棧，而不是一個隊列中，可以，在事實上，
拿出一個數據結構，允許她看的東西，
什字，不只是數字，我們會打電話給固定的時間。
>> 而事實上，展望未來，在這個類中的一個pset時幾乎總是
一個拼寫檢查的實施，據此，
我們給你再次約15萬英文單詞，我們的目標是
加載到內存中，並迅速成為能夠回答問題的形式
這個詞是拼寫是否正確？
那真是糟透了，如果你不得不遍歷所有15萬字來回答這個問題。
但是，事實上，我們會看到，我們可以在非常非常快的時間內做到這一點。
這將涉及執行一些所謂的哈希表，
即使乍看之下這件事情被稱為哈希表是怎麼回事
讓我們實現這些超快速的響應時間，
事實證明，其實也有一個問題。
當談到時間來執行這件事情，再次，我老毛病又犯了。
我是唯一一個在這裡。
當談到時間落實這件事情被稱為哈希表，
我們將不得不做出決定。
這件事情應該多大究竟是什麼？
當我們開始這個哈希表中插入數字，
我們如何將它們存儲在這樣一種方式
，我們可以得到他們回來了，很快我們得到了他們？
但是，我們會看到不久這個問題的
當每個人的生日是在課堂上是相當有密切關係。
事實證明，在這個房間裡，我們已經有了幾百人，
這樣的可能性，我們兩個人有相同的生日可能是相當高的。
如果只有40，我們在這個房間裡嗎？
什麼是賠率的兩個人具有相同的生日嗎？
[學生]超過50％。
是啊，超過50％。事實上，我什至帶來了一個圖表。
事實證明，這是真的只是一個預演
如果只有58我們在這個房間裡，我們的概率為2
具有相同的生日是巨大的，幾乎100％，
而這會為我們造成的傷害一大堆週三。
>> 隨著中說，讓我們休會這裡。上週三，我們會看到你。
[掌聲]
[CS50.TV]