[音樂播放] 戴維·J·馬蘭:好吧。 這是CS50。 這是本週五繼續進行,我們 有一些好消息和一些壞消息。 好消息是,CS50 推出這個星期五​​。 如果您想加入我們的行列, 前往這裡平時的網址。 更好的消息,沒有演講 下星期一13日。 略顯不足更好的消息, 測驗零點下週三。 更多細節可 在這個網址找到這裡。 而在接下來的幾天 我們將填補空白 與問候房間 我們將有保留。 更好的消息是,有將 是一個過程性的檢討 會議即將來臨 週一晚上。 敬請關注過程的 網站的定位和細節。 部分,即使它是一個 假期,也將滿足為好。 最好的消息,講課下週五。 因此,這是一個傳統,我們 有,按照教學大綱。 只是 - 這將是驚人的。 你會看到類似的東西 固定時間的數據結構 和哈希表和樹和嘗試。 我們將談論的生日問題。 一大堆的東西 等待下週五。 行。 總之。 所以,記得,我們​​已經 重點是這幅畫的是什麼 我們內部的計算機內存。 這樣存儲器或RAM是其中的程序 你正在運行他們,而存在的。 如果你雙擊一個 圖標來運行一些程序 或雙擊 圖標打開某些文件, 它是從硬盤加載 驅動器或固態驅動器 到RAM中,隨機存取存儲器,其中 它生活,直到電源關閉, 筆記本電腦的蓋子關閉, 或者你退出程序。 現在,記憶, 你可能有 1 GB的這些天,2 千兆字節,甚至更多, 一般佈局 對於一個給定的程序 在這種長方形的 概念模型 由此我們有堆疊在底部 並在頂部一堆其他的東西。 在最高層的事 我們已經看到這個畫面 之前,但從來沒有說過 是所謂的文本段。 文段僅僅是一個奇特的方式 的話說,零和一的 撰寫您的實際編譯的程序。 所以,當你雙擊 微軟的Word在您的Mac或PC, 或者當您運行點斜線馬里奧在 Linux計算機在終端窗口中, 構成該零和一 字或馬里奧被暫時存儲 在所謂的計算機的RAM 文本段對特定的程序。 下面說去初始化 和未初始化的數據。 這東西像全局變量, 我們已經不能用了許多, 但有時,我們已經 有全局變量 或靜態定義的字符串 是硬編碼,如“你好”的話 未從用戶採取 被硬編碼到程序中。 現在,倒在底部我們 有所謂的堆棧。 和棧,迄今為止,我們已經 採用了什麼樣的目的? 什麼是棧被用來做什麼? 是嗎? 聽眾:功能。 戴維·J·馬蘭:功能? 在什麼意義上的功能呢? 聽眾:當你調用一個函數時, 參數複製到堆棧中。 戴維·J·馬蘭:沒錯。 當你調用一個函數,它的 參數複製到堆棧中。 因此,某X的或Y的或A或B的 那你傳遞給函數 暫時放在 所謂堆棧, 就像安尼伯格之一 食堂托盤,也事 如局部變量。 如果你的富功能或您的交換 函數有局部變量, 如溫度,這兩個 最終在堆棧中。 現在,我們不會過多談論 他們,但這些環境變量 在底部,我們看到前一段時間,當 我把玩在鍵盤1天 我開始訪問事 像argv的100 ARGV 1,000 只是elements--我忘了 在numbers--但 不應該由我來訪問。 我們開始看到一些 時髦的符號在屏幕上。 這些都是所謂的 環境變量 像全局設置我的 程序或我的電腦,而不是 無關的最近 錯誤,我們所討論的, Shellshock,這一直 困擾著不少電腦。 現在,最後,在今天的重點 我們最終會在堆中。 這是記憶另一個塊。 從根本上這一切 內存是同樣的東西。 這是同樣的硬件。 我們只是有點 對待不同的集群 的字節用於不同的目的。 堆也將會是在哪裡 您請求的變量和內存 從操作系統 被暫時存儲。 但有樣的問題 這裡,作為圖像暗示。 我們的排序有兩個 關於船舶碰撞。 因為當你使用越來越多 堆棧,並作為我們今天看到的 以後,當你使用更多的多 堆,肯定不好的事情可能會發生。 事實上,我們可以歸納出 有意或無意的。 所以最後扣人心弦 時間是這個程序, 這並沒有起到任何功能 目的除了展示 如何為壞傢伙竟然可以 利用漏洞在別人的程序 並接管程序,甚至是 整個計算機系統或服務器。 所以只是簡單地一瞥,你 請注意,主底部 需要在命令行 參數,按ARGV。 它有一個調用一個函數f, 基本上叫做匿名函數 f和它傳遞的argv [1]。 因此,在任何字的用戶類型 這個節目的名字後,在提示, 然後這個任意函數了 頂,F,需要一個字符串,又名char *的, 因為我們已經開始討論, 它只是將其稱為“巴”。 但我們可以把它叫做什麼。 然後它聲明,裡面 樓字符數組的 所謂C-- 12這樣的人物。 現在,這個故事我告訴 剛才,在內存 為c,或者是那些12 字符要結束了? 只是要清楚。 是嗎? 聽眾:在堆棧中。 戴維·J·馬蘭:在堆棧中。 所以C是一個局部變量。 我們要求12個字符或12個字節。 那些將要結束了 在所謂的堆棧。 現在終於這等功能 這實際上是相當有用的, 但我們還沒有真正使用 它自己,strncopy。 這意味著字符串拷貝,但 n只有字母,n個字符。 因此,n個字符會 從酒吧複製成C。 又有多少呢? 條的長度。 因此,換句話說,即 一條線,strncopy, 將要複製 在有效的禁止到c。 現在,只是一種預測 這個故事的寓意, 什麼是潛在的問題在這裡嗎? 儘管我們正在檢查的長度 酒吧,並向其傳遞到strncopy, 什麼是你的直覺告訴你的是 還是打破這個計劃? 是嗎? 聽眾:不包括 房間空字符。 戴維·J·馬蘭:不包括 房間空字符。 潛在地,不像在 過去的實踐中,我們甚至不 有這麼多的加1 容納空字符。 但比這更糟糕。 還有什麼是我們不能做什麼? 是嗎? 聽眾:[聽不清] 戴維·J·馬蘭:完美。 我們已經硬編碼的12相當隨意。 這是沒有這麼多的 的問題,但事實 我們甚至不檢查,如果 條的長度是小於12, 在這種情況下,這將是 安全地把它放入內存 我們已經分配名為c。 事實上,如果酒吧是像 20個字符長, 這個功能似乎被複製 從酒吧到C,使20個字符 服用至少8個字節 它不應該。 這是這裡的含義。 因此,在短期,斷程序。 沒有什麼大不了的。 也許你會得到一個段錯誤。 我們都有過在程序中的bug。 我們都可能有缺陷 在節目現在。 但是,有什麼寓意? 嗯,這裡是一個放大版本 那張照片是我的電腦的內存中。 這是我的堆棧的底部。 事實上,在最底層是什麼 所謂的母常規堆棧,奇特的方式 的話說,就是主。 所以,無論誰調用的函數 ˚F,我們正在談論的。 所以這是堆棧的底部。 返回地址是新的東西。 這是一直存在的, 一直在圖片。 我們只是從來沒有所謂的重視。 因為事實證明,C工作的方式是 當一個函數調用另一個, 不僅做到了參數的 功能得到壓入堆棧, 不僅做到了功能的地方 得到的變量壓入堆棧, 一些所謂的返回地址 也被放到堆棧。 特別是,如果主調用foo,主要的 自己的地址在內存中,牛事, 有效地被放置到堆棧 這樣,當f為完成執行它 知道在哪裡可以跳回到文本 段,以繼續執行。 所以,如果我們在這裡概念, 在主,則f被調用。 如何˚F知道是誰 以手控回來? 好了,這個小 麵包屑紅色在這裡, 所謂的返回地址,這只是 支票,那是什麼的返回地址? 哦,讓我跳回到主這裡。 這就是一點點 過於簡單化的, 因為在零和一 主在技術上 在這裡,在高科技領域。 但是,這是這個想法。 ˚F 只是必須知道什麼 到控制,最終又回到。 但是,電腦的方式 早就奠定了東西 如局部變量和 論點是這樣的。 所以,在這張照片中名列前茅 藍色是在f的棧幀,因此所有 存儲器的使f 特別是使用。 所以因此,請注意 酒吧是在這張照片。 酒吧是它的參數。 我們宣稱的參數 功能得到壓入堆棧。 和c,當然是 同時在這張照片。 而就在符號上的目的, 注意在頂部左上角 是會什麼C支架0 隨後小幅回落向右 為c支架11。 所以,換句話說,你可以想像 這有一個字節格 還有,第一個是 左上角,底部其中 是最後的這12個字節。 但現在盡量快進。 什麼是即將發生,如果我們通過 在一個字符串中的酒吧,是比C更久? 而且我們不是,如果檢查 這的確是超過12。 此圖片的一部分是要 得到由字節0,1,2,3覆蓋, 點點點,11,然後 糟糕,12,13至19? 什麼會發生在這裡, 如果從訂貨推斷 將c支架0頂部 和c支架11是有點下降 對吧? 是嗎? 聽眾:嗯,這是怎麼回事 覆蓋char *的吧。 戴維·J·馬蘭:是的,它看起來像 你要覆蓋char *的吧。 更糟糕的是,如果你發送一個很長的 字符串,你甚至可以覆蓋哪些? 返回地址。 這再次,就像是 麵包屑告訴程序在哪裡 在f回去 完成被調用。 那麼,什麼壞人通常做 是,如果他們遇到一個程序 他們很好奇是否 利用,越野車以這樣的方式 他或她可以利用 優點是錯誤的, 一般他們沒有得到 這種權利的第一次。 他們剛開始發送,例如, 隨機字符串到你的程序, 是否在鍵盤 或者坦白地說,他們可能 寫一個小程序只是 自動生成的字符串, 並開始通過敲打你的程序 派遣在許多不同的輸入 在不同的長度。 只要你的程序崩潰, 這是一個了不起的事情。 因為這意味著他 或她已經發現 什麼是可能的確是一個錯誤。 然後,他們可以得到更聰明 並開始關注更窄 如何利用這個bug。 特別是,他或她可能 要做的就是發送,在最好的情況下,你好。 沒什麼大不了的。 這是一個字符串,它是足夠短。 但是,如果他或她送什麼, 我們將其概括為, 攻擊代碼 - 讓零 而那些做的事情 如RM-RF,即去除一切 從硬盤驅動器或發送垃圾郵件 或以某種方式攻擊機? 因此,如果每個這些 字母A代表公正, 從概念上講,攻擊,攻擊, 攻擊,攻擊,一些不好的代碼 別人寫的,但 如果那人是足夠聰明 不僅包括所有 那些RM-RFS的,但也 有他或她的最後幾個字節 是一個數字,對應 到的地址他 或她自己的攻擊代碼 他(或她)在剛剛過去的 在提示符下提供的, 可以有效地欺騙電腦 為在f執行完畢注意到, 哦,是時候讓我跳 回紅返回地址。 但是,因為他或她有莫名其妙 重疊的返回地址 用自己的號碼, 而且他們足夠聰明 已配置的 數量是指,當你 看到超級頂 左上角有, 在計算機的實際地址 他們的一些攻擊代碼的內存, 壞人可以欺騙計算機 為執行他或她自己的代碼。 而這些代碼,再次可以是任何東西。 它通常被稱為 shell代碼,這僅僅是 的話說,這不是一個辦法 通常一些簡單的RM-RF。 它實際上是這樣猛砸, 或實際的方案,讓他 或她的程序控制執行 別的,他們想要。 因此,在短期,這一切 從一個簡單的事實推導出 這個錯誤不涉及檢查 陣列的界限。 而由於道路 計算機工作,他們 使用堆棧 有效的,在概念上, 底上了,但隨後的元素 你推入堆棧增長自上而下, 這是令人難以置信的問題。 現在,有方法可以解決這個問題。 坦率地說,有語言 與合作解決這個問題。 Java是免疫,例如 這個特定問題。 因為他們不給你指點。 他們不給你 直接內存地址。 因此,與這種力量,我們有 在內存按兵不動 我們要來了,誠然,巨大的風險。 所以留意。 如果坦率地說,在未來數月 或幾年來,隨時 你讀一些開發 中,一個程序或服務器 如果你曾經看到的東西的提示 就像一個緩衝區溢出攻擊, 或堆棧溢出是另一種類型 攻擊中,在精神上同樣, 就像激發網站的 名字,如果你知道的話, 這一切都在談論剛剛 滿溢一些字符的大小 數組或數組中更普遍。 有任何疑問的話,在這? 不要在家裡嘗試。 好吧。 所以malloc的迄今,我們的新 朋友,我們可以分配內存 我們不一定知道在 前進,我們希望讓我們沒有 硬編碼到我們的 程序號像12。 一旦用戶告訴我們有多少 數據他或她想要輸入 我們的malloc那麼多的記憶。 所以malloc的事實證明,在 程度上,我們一直在使用它, 明確地一次,然後 你們一直在使用它 為的GetString在不知不覺中進行 數週後,所有的malloc的內存的 來自於所謂的堆。 這就是為什麼GetString的,例如 可以動態地分配內存 不知道你在做什麼 將預先輸入, 交給你回一個指向內存中, 而且內存還是你留著, 即使在形式返回。 由於召回畢竟該 堆棧是不斷上升和下降, 向上和向下。 而一旦它進入 下,這意味著任何存儲器 這個功能應該使用 不被其他人使用。 這是垃圾值了。 不過,堆在這裡。 這有什麼好看的malloc左右是 當這裡的malloc分配內存時, 它沒有影響,對 大多數情況下,由堆棧。 所以任何函數都可以訪問 內存已malloc分配, 甚至像的GetString函數, 即使在它被返回。 現在,的malloc的逆是免費的。 事實上,規則你 需要開始採用 就是有,有,你用malloc任何時間 你必須自己使用免費的,最終, 在同樣的指針。 這段時間我們一直在寫 越野車,越野車的代碼,有很多原因。 但其中一個已 使用CS50庫, 本身是故意 越野車,它的內存洩漏。 任何你打電話的GetString時間 在過去的幾個星期 我們問工作 系統,Linux的內存。 而你從來沒有一次給它回來。 這不,在 練,是一件好事。 和Valgrind的,所述一個 在Pset的4引入的工具, 是所有關於幫助您 現在發現這樣的錯誤。 不過,值得慶幸的是在Pset的4你不需要 使用CS50庫或GetString的。 所以涉及到內存中的任何錯誤都 最終將是你自己。 所以malloc的不僅僅是 方便的用於此目的。 我們其實可以現在解決 從根本上不同的問題, 從根本上解決問題,更 有效地為每週為零的承諾。 到目前為止,這是最性感 數據結構,我們已經有。 並通過數據結構我的意思 概念化記憶的一種方式 在超越只是說一種方法, 這是一個int,這是一個字符。 我們可以開始集群的東西放在一起。 所以數組是這樣的。 什麼是對的關鍵 數組是可以讓你 備份到後端的塊 存儲器,其中每個 將是相同的類型,整型, 整型,整型,整型,或CHAR,CHAR,CHAR, 字符。 但是有幾個缺點。 此,例如,是 大小6的陣列。 假設你填充這個數組六 數字,然後,不管是什麼原因, 您的用戶想要得到 你第七號。 你在哪裡放呢? 有什麼解決辦法,如果你有 在堆棧上創建一個數組, 例如,剛與週 2符號,我們介紹了, 方括號與多家裡面? 好了,你已經有了6 在這些框中的數字。 什麼你的直覺是什麼? 在那裡你會想要把它? 聽眾:[聽不清] 戴維·J·馬蘭:對不起? 聽眾:把它放在最後。 戴維·J·馬蘭:把它放在最後。 所以才過來的吧, 這個盒子的外面。 這將是很好的,但它 事實證明,你不能這樣做。 因為如果你沒有問 此塊的存儲器, 這可能是巧合,這 正在使用的一些其它變量 乾脆。 回想一個星期左右的時候,我們奠定 出Zamyla和達文和Gabe的名字 在存儲器中。 他們從字面上 回背靠背。 所以我們可以不必 相信凡是 在這裡是供我使用。 所以,你還有什麼可以做? 那麼,一旦你實現 要7號的數組, 你可以只創建一個 尺寸7的陣列,然後使用 for循環或while循環, 將其複製到新的數組, 然後不知何故剛剛擺脫 這個陣列或只是停止使用。 但是,這不是特別有效。 總之,陣列別讓 您動態調整。 因此,一方面你 隨機訪問,這是驚人的。 因為它讓我們做的事情 如分而治之, 二進制搜索,所有這些我們已經 就在屏幕上談到。 但是你畫自己陷入了困境。 只要你打 您的陣列的結尾, 你要做的很 昂貴的操作 或寫一大堆代碼 到現在處理這個問題。 所以,如果不是我們有什麼 一些所謂的名單, 或鍊錶特別? 有如果,而不是 矩形回背靠背, 我們有長方形的留下一點 迴旋餘地在他們之間有點? 而且即使我畫這個 圖片或改編此圖片 從文本之一在這裡要回 背對背的非常有序,在現實中, 這些矩形之一 可以在這裡在存儲器中。 其中一人可能是在這裡。 其中一人可能是在這裡, 在這裡,等等。 但是,如果我們畫了, 在這種情況下,箭頭 不知怎的,這些鏈接 矩形組合在一起? 事實上,我們已經看到了技術 化身箭頭。 你有沒有看到最近使用 天那,引擎蓋底下, 是代表一個箭頭的? 一個指針,對不對? 那麼,如果,而不是 只存儲該號碼 像9,17,22,26,34, 如果我們不保存 只有一些,但指針 相鄰的數目? 所以這就像你會跟帖 針穿過一大堆面料, 不知何故搭售的東西 同時,同樣可以 我們使用指針,作為 這裡用箭頭體現, 種編織在一起 這些單個矩形 通過有效地使用指針 旁邊的每個數 指出了一些下一個號碼,即 指向,反過來,一些未來數? 因此,換句話說,什麼 如果我們真正想要的 實行這樣的事情? 好可惜,這些矩形, 至少一個與9,17,22, 等等,這些都不再 漂亮的廣場單號。 底部,矩形 以下如圖9所示,例如, 代表什麼應該 是一個指針,32位。 現在,我還不知道任何數據類型 在C中,讓你不僅是一個整數 但指針乾脆。 那麼,有什麼解決方案,如果我們想要 去創造我們自己的答案呢? 是嗎? 聽眾:[聽不清] 戴維·J·馬蘭:這是什麼? 對象:新的結構。 戴維·J·馬蘭:是啊,為什麼 我們不創建一個新的結構, 或在C中,一個結構? 我們已經看到結構之前,如果簡單地說, 我們處理了一個學生結構 這樣,誰的名稱和一所房子。 在Pset的3分場您使用了全 一堆structs-- GRect和GOvals的 在斯坦福大學創建的 集群信息一起。 那麼,如果我們採取同樣的想法 關鍵字“類型定義”和“結構” 然後一些學生具體的東西, 並演變成以下這樣的: typedef結構node--和節點 只是一個很普通的計算機科學 長期的東西,在數據結構中, 容器中的數據結構。 一個節點我要求都將有 一個整數N,完全明了, 然後多一點隱晦, 這第二條線,結構節點*旁邊。 但在更短的技術術語, 什麼是第二行 的花括號內的代碼? 是嗎? 聽眾:[聽不清] 戴維·J·馬蘭:一 指針到另一個節點。 所以不可否認,語法有點神秘。 但是,如果你從字面上看它, 接下來是一個變量的名稱。 什麼是它的數據類型? 這是一個有點冗長這個時候, 但它的類型結構節點*。 任何我們已經看到一些明星的時候,也 意味著它是一個指針,它指向的數據類型。 因此,下顯然是一個 指針指向一個結構節點。 現在,是一個結構的節點? 好了,請注意您看到的那些 同樣的話,在右上角。 事實上,你也看到這個詞 “節點”在這兒,在左下角。 這其實只是一個方便。 請注意,在我們學生的定義 有單詞“學生”只有一次。 那是因為學生 對象不是自我指涉。 沒有什麼是學生的內部 需要指向另一名學生, PerSay的。 這將是某種 怪異在現實世界中。 但在一個節點鏈接 列表中,我們希望有一個節點 是參考了類似的對象。 等注意到這裡的變化是不 只是什麼花括號內。 但是我們加上“節點” 在頂部,以及 將其添加至底部 代替“學生”。 而這僅僅是一個技術細節 這樣一來,同樣,你的數據結構 可自行參照,讓 節點可以指向另一個這樣的節點。 那麼,這是什麼最終 將意味著我們呢? 嗯,一,這裡面的東西 是我們的節點的內容。 這東西在這裡, 右上方,就是這麼 即,再次,大家可以參考一下自己。 然後最外面的東西, 即使節點是一個新名詞, 也許,它仍然是 一樣的學生,什麼 在SPL引擎蓋下面。 因此,如果我們現在要開始 實施本鍊錶, 怎麼可能,我們翻譯 像這樣的代碼? 好吧,讓我們看到一個 例如一個程序的 實際使用鍊錶。 在今天的分銷代碼 是一個名為List零計劃。 如果我運行這個,我創建了一個超 簡單的圖形用戶界面,圖形用戶界面, 但它真的只是printf的。 現在我已經給自己幾個菜單 選項 - 刪除,插入,檢索, 和導線。 並退出。 這是一個公正的常用操作 被稱為鏈接列表數據結構。 現在,刪除是要 刪除了一些從列表中。 插入件的要加 數到列表中。 搜索是要去看看 對於列表中的號碼。 和遍歷僅僅是一個奇特的方式 的說法,漫步列表, 它打印出來,但僅此而已。 不要以任何方式改變它。 因此,讓我們試試這個。 讓我們繼續前進,2型。 然後我要去 插入的數目,表示9。 輸入。 現在我的計劃就是 編程來說,列表是現在9。 現在,如果我繼續前進, 不要再插入,讓 我繼續前進,縮小並輸入17。 現在我的名單是9,那麼17。 如果我做再次插入,讓我們跳過之一。 相反22,按照圖片中我們已經 一直在看這裡,讓我跳躍前進 並插入26下一頁。 所以,我要輸入26。 這份名單是我所期望的。 但現在,只是如果這個代碼見 將是靈活的,現在讓我 型22,其中至少有 從概念上講,如果我們 保持此排序,這確實是 將是另一個目標,現在, 17和26之間應該在。 所以我敲回車。 事實上,工作的。 所以現在讓我插入 最後,每個圖片,34。 好吧。 所以現在讓我規定 刪除和遍歷和搜索做的, 其實,工作。 事實上,如果我不執行搜索,讓我們 搜索次數22,回車。 研究發現22。 所以這就是這個 程序清單零呢。 但實際上會 在實現這一點? 嗯,首先我可能有,確實 我有一個文件名為list0.h。 而在某個地方有這樣的 行,類型定義,結構節點, 然後,我有我的花括號,詮釋n和 然後struct--究竟是什麼定義? 結構節點旁邊。 因此,我們需要的明星。 現在,技術上我們進入 在這裡畫的習慣。 你可能會看到課本和 網上參考做那裡。 它的功能相當的。 其實,這是一個小更典型。 但我會用什麼樣一致 我們做了最後的時間,做到這一點。 然後最後,我要做到這一點。 因此,在頭文件 某處,在list0.h 今天是這個結構的定義, 也許一些其他的東西。 與此同時,在list0c有 將是一個幾件事情。 但是,我們要公正 開始,而不是結束了。 List0.h是我想要的文件 包括在我的C文件。 然後在某個時候,我 將有整型,主要的,無效的。 然後我要去 有一些待辦事項在這裡。 我也將有一個 原型,如虛空,搜索,INT, N,在生活中,其目的是 要搜索的元素。 再往下這裡我要求在 今天的碼,無效搜索,INT,N, 別無分號,但開放的花括號。 現在我想以某種方式查詢 對於該列表中的一個元素。 但是,我們沒有足夠的 但在屏幕上的信息。 我沒有實際 表示該清單自身。 所以一個方法,我們可以實現 鍊錶的程序 一種是我想要做的事 如聲明成鍊錶在這裡。 為簡單起見,我將做出 這一全球性的,儘管一般我們 不應該這樣做太過分了。 但它可以簡化這個例子。 所以,我想聲明 鍊錶在這裡。 現在,我怎麼可能這樣做呢? 這裡有一個鏈接列表的畫面。 我真的不 知道此刻如何 我打算去代表 只用一個這麼多東西 變量在內存中。 但回想一下。 這一切的時候,我們已經有 字符串,我們再 發現是數組 字符,然後我們 顯露只是一個指針 到的第一個字符 在字符數組 這是空終止。 所以通過該邏輯,以及與此 圖像種類播種的想法, 有什麼需要我們在實際編寫我們 代碼來表示鍊錶? 如何對這些信息多我們需要 捕捉到的C代碼,你會說什麼? 是嗎? 聽眾:我們需要一個指向一個節點。 戴維·J·馬蘭:一個指針,指向一個節點。 特別是,該節點將您的 本能是要保持一個指針? 聽眾:第一節點。 戴維·J·馬蘭:是啊, 可能只是第一個。 並注意,第一 節點是不同的形狀。 它的結構只有一半的大小, 因為它確實只是一個指針。 那麼,你的確可以做的就是聲明 鍊錶是類型的節點*。 而且,我們只是先稱它為 並把它初始化為null。 所以空,再次,是未來 到這裡的畫面。 不僅是空作為像一種特殊的 搞什麼的GetString返回值 和malloc,空也是零 指針,缺乏一個指針, 如果你願意。 它只是意味著什麼又是在這裡。 現在開始,我會一直 所謂的事。 我可以把它叫做“名單” 或任何數目的其他事情。 但我把它稱為“第一”,使 這行了這幅畫。 所以就像一個字符串可以表示 其第一個字節的地址, 所以可以一個鍊錶。 我們會看到其他數據 結構式來表示 只有一個指針, 一個32位的箭頭,指向 在該結構中的第一個節點。 但現在,讓我們期待一個問題。 如果我只記得 在我的程序中的地址 第一節點,所述第一 矩形在此數據結構中, 什麼最好是對的情況下, 實現我的名單的其餘部分? 那是什麼回事的關鍵細節 為確保這一點的實際工作? 並通過“實際工作”我 意思是說,就像一個字符串, 讓我們從第一個字符去 在達文的名稱,以第二, 到第三,對 第四,到了最後, 我們怎麼知道,當我們在最後 鍊錶,看起來像這樣? 當它為空。 我已經表示這樣的作為 像電氣工程師可能, 與小接地 各種各樣的符號。 但是,這只是意味著在這種情況下空。 您可以繪製任意數量 的方法,但筆者 發生在這裡使用這個標誌。 只要我們穿線 所有這些節點一起 只記得在哪裡 第一個是,只要 當我們把一個特殊符號,在 在列表中的最後節點, 我們將使用空,因為這是 我們必須提供給我們, 該列表已完成。 即使我只給你一個指針 第一個元素,你,程序員, 當然可以訪問它的其餘部分。 但是,讓我們讓你的頭腦 遊蕩了一點點, 如果他們不是已經 很wandered--什麼 將要的運行時間 發現在這個名單什麼? 該死,這n個大O, 這是不壞,在公平性。 但它是線性的。 我們已經放棄了什麼功能 陣列通過移動更多 對這張照片的動態 交織在一起或鏈接的節點? 我們已經放棄了隨機訪問。 數組是不錯的,因為 數學上的一切 是背靠背背靠背。 儘管這幅畫 看起來很漂亮,甚至 雖然它看起來像這些節點 是很好的分開,在現實中 他們可以在任何地方。 OX1,OX50,Ox123,Ox99,這些 節點可以在任何地方。 因為做的malloc分配內存 離堆,但在任何地方堆。 你不一定知道它的 將是背靠背回來。 所以這幅畫在現實中的 不會是今天這樣漂亮。 因此,這將需要一些 努力實現這個功能。 現在讓我們實現搜索。 我們將看到種類的 這樣做的聰明的方式。 所以,如果我是一個搜索功能和 我給一個變量,整數n 尋找,我需要知道的 在裡面尋找新的語法 一個結構,是的 指出,為求n。 因此,讓我們做到這一點。 所以,首先我會去 未來,並宣布一個節點*。 我要去把它稱為 指針,只是約定。 我要去把它初始化為先。 現在我可以做到這一點 在許多方面。 不過,我要採取的共同辦法。 而指針不等於 空,這是有效的語法。 它只是意味著做到以下幾點,那麼 只要你不指著什麼。 我該怎麼想呢? 如果指針點N,讓我回來 到,equals--等於什麼? 我在尋找什麼樣的價值? 這是通過在實際ñ。 因此,這裡的另一特色 對C和許多語言。 即使所謂的結構節點 有一個n值,完全合法 也有當地的說法 或者叫變量n。 因為即使我們有 人眼可以分辨 這n是推測 不同於該n。 因為語法是不同的。 你有一個點和一個指針, 而這其中有沒有這樣的事情。 因此,這是確定。 這是確定的打電話給他們同樣的事情。 如果我發現你這個,我是 會想要做的事 像大家宣布,我們發現Ñ。 我們會離開,作為一個 發表評論或偽代碼。 否則,和這裡的 有趣的部分,是什麼 做我想做的事情,如果當前節點 不包含n個我在乎? 我如何實現以下? 如果我的手指在 此刻是PTR,它的 指著什麼 第一是指向, 如何將我的手指 在代碼中的下一個節點? 那麼,什麼是我們的麵包屑 要在這種情況下,遵循? 聽眾:[聽不清]。 戴維·J·馬蘭:是啊,所以下一步。 所以,如果我回到我的 這裡的代碼,事實上,我 要繼續前進,說的指針,這 只是一個暫時的變量 - 這是 一個奇怪的名字,PTR,但 它就像temp-- 我要設置指針 等於任何指針is-- 又一次,這將是一個 小馬車的moment--點下一步。 換句話說,我要去把我的 指的是指向該節點 在這裡,我想說,你知道 什麼,看看下一個字段 移動你的手指 不管它的指向。 並且這將 重複,重複,重複。 但是,什麼時候我的手指 停止做了什麼呢? 只要什麼碼踢行? 聽眾:[聽不清] 戴維·J·馬蘭:如果同時點 指針不等於空。 在某些時候,我的手指的 將要指向空 我要去實現 這是該列表的末尾。 現在,這是一個小 善意的謊言的簡單性。 事實證明,即使我們 剛剛得知這個點符號 對於結構,指針不是一個結構。 PTR是什麼? 只是要更挑剔。 這是一個指針,指向一個節點。 這不是一個節點本身。 如果我在這裡沒有明星,指針 absolutely--它是一個節點。 這就好比一個星期 變量聲明, 即使單詞“節點”是新的。 但只要我們引入了 明星,它現在是一個指針,指向一個節點。 但不幸的是你不能使用 點號的一個指針。 你必須使用箭頭 符號,其中,引人注目的是, 是第一次的任何一塊 語法看起來直觀。 這從字面上看起來像一個箭頭。 因此,這是一件好事。 而到這裡字面上 看起來像一個箭頭。 所以,我認為這是la--我不 想我過犯這裡 - ì 認為這是最後的新作品 語法我們要看到的。 而幸運的是,這是真的 多一點直觀。 現在,對於那些你們誰 可能更喜歡舊的方式, 你仍然可以使用點號。 但由於每星期一 談話中,我們首先 需要去那裡,去那 處理,然後訪問字段。 因此,這也是正確的。 坦率地說,這是一個 有點迂腐。 你從字面上說,提領 指針和去那裡。 然後抓住.N,現場叫ñ。 但坦率地說,沒有人願意 打字或閱讀。 這樣一來,發明了世界 箭頭符號,其中 是等價的,相同的, 它只是語法糖。 對這個說法如此看中方式 看起來更好,看起來更簡單。 所以現在我要做的一件事。 我會說“休息”一旦我 發現它,所以我不繼續尋找它。 但是,這是依據 的搜索功能。 但它是一個容易得多,在 最後,不要穿行的代碼。 這的確是正式實施 在今天的分銷代碼搜索。 我敢說,插不 特別有趣的穿行 在視覺上,也不是刪除,甚至 雖然在這一天結束時 他們歸結為公平 簡單的啟發式方法。 因此,讓我們做到這一點。 如果你會幽默我在這裡,我沒有 把一堆壓力球。 我帶了一堆數字。 而我們能得到的只是一些志願者 代表9,17,20,22,29和34? 所以基本上每個人都 誰是今天。 這是一,二,三, 四,五,六人。 我一直在問go--看,沒有 一個在後面舉手。 好了,一,二,三,四, five--讓我加載balance-- 6。 好了,你六上來吧。 我們需要其他人。 我們帶來了額外的壓力球。 如果你可以, 只是一瞬間,行 自己剛起來 喜歡這幅畫在這裡。 好吧。 讓我們來看看,你叫什麼名字? 聽眾:安德魯。 戴維·J·馬蘭:安德魯, 你是9號。 很高興認識你。 幹得好。 聽眾:仁。 戴維·J·馬蘭:仁。 大衛。 號碼17。 是嗎? 聽眾:我是朱莉婭。 戴維·J·馬蘭:朱莉婭大衛。 號碼20。 聽眾:基督教。 戴維·J·馬蘭:基督教,大衛。 號碼22。 和? 聽眾:日本。 戴維·J·馬蘭:日本。 號碼29。 所以,儘管獲得in--嗯哦。 嗯哦。 待機。 20。 有沒有人有一個標記? 聽眾:我有一個夏普。 戴維·J·馬蘭:你有夏普? 行。 並沒有任何人有一張紙? 保存了講座。 來吧。 聽眾:我們已經知道了。 戴維·J·馬蘭:我們得到了它? 好吧,謝謝你。 開始了。 從你是這樣的? 你剛才化險為夷。 所以29。 好吧。 í拼寫錯誤29,但確定。 前進。 好吧,我給你 你的筆回暫時。 所以我們這些人在這裡。 讓我們有一個其他的。 加布,你要玩 這裡的第一個元素? 我們需要你來點 這些精美的鄉親。 所以,9,17,20,22,排序 29,然後34。 我們失去了一個人? 我有一個34。 凡did--確定,誰願意為34? 好了,上來吧,34。 好吧,這將是 非常值得的高潮。 你叫什麼名字? 聽眾:彼得。 戴維·J·馬蘭:彼得,上來吧。 好吧,那麼這裡有一個 一大堆的節點。 每次你們都代表 其中的一個矩形。 和加布,稍奇 男人出來,表示第一。 所以他的指針是一個小一點 在屏幕上比其他人。 並且在這種情況下,每個你的左 手是怎麼回事要么點下去, 從而表示空值,所以 只是沒有指針, 或者它會被人指指點點 在你旁邊的一個節點。 所以現在,如果你佩戴 喜歡的圖片呀 在這裡,繼續和點 對方,用加布 在特定的指向 編號9表示的列表。 確定,34號,你的左手 應該只指向地面。 好了,這就是鍊錶。 所以,這是該方案的問題。 事實上,這是代表 一類的問題 你可能會試圖解決與代碼。 你想最終將 一個新的元素到列表中。 在這種情況下,我們要 請嘗試將數字55。 但是,將是 不同的情況來考慮。 事實上,這將是1 的大畫面紀要這裡,是, 什麼是不同的情況。 什麼是如果條件或不同 你的程序可能有分支機構? 嗯,這個數字你要 插入,這是我們現在知道是55, 但如果你不知道 事先,我敢說 落入至少三個 可能出現的情況。 凡可能一個新的元素呢? 聽。結束或中間。 戴維·J·馬蘭:最後,在 的中間,或在開始時。 所以,我要求有至少 我們需要解決三個問題。 讓我們選擇什麼樣的可能 可以說是最簡單的 之一,其中該新元素 屬於開頭。 所以我將有相當代碼 如搜索,我只是寫。 我要去有PTR,這 我在這裡代表我的手指, 照常。 請記住,什麼樣的價值 我們曾初始化PTR什麼? 因此,我們初始化為null開始。 但後​​來我們做了一次,我們什麼 是我們的搜索功能裡? 我們設置它等於第一次, 這並不意味著這樣做。 如果我設置PTR等於一,什麼 應我的手真的是指向? 右。 所以,如果加布和我要去 這裡是相等的值, 我們需要在兩個點在9號。 因此,這是我們的故事的開始。 而現在這僅僅是簡單的, 即使語法是新的。 概念上,這只是線性搜索。 是55等於9? 或者說,讓我們說不到9。 因為我想 找出放在哪裡55。 9以上,小於17,小於 大於20,小於22,小於29, 小於34,沒有。 所以,現在我們的情況下 一個上的至少三個。 如果我要插入55在這裡,有什麼 得到執行的代碼需要行? 請問這個圖片 人類需要改變嗎? 我該怎麼辦我的左手? 這應該是零開始, 因為我在列表的末尾。 什麼應該發生 這裡彼得,是嗎? 他顯然會指向我。 所以,我要求有至少兩條線路 在今天的示例代碼代碼 這是怎麼回事實現這個 方案中加入55的尾巴。 而我能有一個人跳 起來,只是表示55? 好吧,你是新的55。 所以現在,如果下一個 情景出現時, 我們要插入的 開始的時候還是這個列表的頭? 而你叫什麼名字,號碼55? 聽眾:傑克。 戴維·J·馬蘭:傑克? 好了,很高興見到你。 歡迎登機。 所以,現在我們要 插入,比方說,數字5。 這裡的第二種情況 3,我們想出了之前。 因此,如果5屬於之初, 讓我們來看看我們是如何發現這一點。 í初始化我的PTR 指針再次號碼9。 我意識到,哦,5小於9。 因此,解決這個問題的圖片我們。 誰的手裡,Gabe的還是大衛 or--什麼是數字9的名字? 聽眾:仁。 戴維·J·馬蘭:仁的hands-- 其中,我們的手需要改變嗎? 好了,加布指著現在該怎麼辦? 看著我。 我的新節點。 所以我就種做法 這裡直觀地看到它。 而與此同時我該怎麼點呢? 還在那裡我指指點點。 所以,就是這樣。 所以真的很需要一行代碼修復 這個問題上,似乎。 好了,所以這是很好的。 而也有人是一個佔位符,5? 上來吧。 我們將讓您下一次。 好吧,讓now--和 順便說一句,該名 我不是做明確提及的權利 現在,PRED指針,指針的前身 而新的指針,這是 只是名字定 在示例代碼的指針或 我的手說的那種指著身邊。 你叫什麼名字? 聽眾:恭。 戴維·J·馬蘭:恭。 歡迎登機。 好吧,讓我們現在來考慮 一個稍微更惱人的情況, 由此我想插入 像26到這一點。 20? 什麼? 這些are--好事,我們有這樣的筆。 好吧,20。 如果有人能得到另一塊 紙準備好了,就在case--所有權利。 呵呵,有意思。 嗯,這是一個例子 的講座錯誤。 行,所以你叫什麼名字來著? 聽眾:朱莉婭。 戴維·J·馬蘭:朱莉婭,你可以彈出 出來,假裝你從未在那裡? OK,這從來沒有發生過。 謝謝。 因此,假設我們要插入 朱成這個鍊錶。 她是20號。 當然,她的 將屬於在 begin--不要在任何地步。 種那麼你的手可 倒空或一些垃圾值。 讓我們告訴了快速的故事。 我指著5號這段時間。 然後我檢查9。 然後我檢查17。 然後我檢查22。 我意識到,哦,朱莉婭 需要22日前去。 因此,需要做些什麼? 誰的手裡需要改變嗎? Julia的,我的,or-- 你叫什麼名字來著? 聽眾:基督教。 戴維·J·馬蘭:基督教還是? 聽眾:安迪。 戴維·J·馬蘭:安迪。 基督教或安迪? 安迪需要指向? 朱莉婭。 好吧。 所以安迪,你想點的朱莉婭? 但是且慢。 在故事迄今 我是一個排序 在電荷,在這個意義上, 指針的東西,是 在列表中移動。 我們可能對劉德華的名稱,但 有沒有所謂的可變安迪。 我們唯一的其他變量 第一,誰是由加布表示。 因此,這實際上是這樣,為什麼 到目前為止,我們已經沒有必要了。 但現在在屏幕上有 預計值的指針再提起。 因此,讓我更明確。 如果這是指針,我最好 得到一個小更智能 我的迭代。 如果你不介意我的經歷在這裡 再次,指指點點,指指點點。 不過,讓我有一個預計值的指針, 前任的指針,這是 種指著 元我就在。 所以,當我去這裡,現在 我的左手更新。 當我走在這裡我的左手更新。 現在我不僅是一個指針 朱莉婭之後去的元素, 我仍然有一個指針 安迪,之前的元素。 所以,你有機會,基本上, 麵包屑,如果你願意, 到所有必要的指針。 所以,如果我指著 安迪和我還指著 在基督教,他的手 現在應該在別處指出? 所以安迪現在可以指向朱莉婭。 朱莉婭現在可以指向基督徒。 因為她能複製我的 右手的指針。 並能有效地使你 回到這裡這個地方。 所以,總之,即使此 正在美國種永 實際更新 鍊錶,實現 該操作 是相對簡單的。 它是一個,兩個,三個 行代碼最終。 但纏的 行的代碼大概 有點邏輯,有效地 問這個問題,我們在哪裡? 難道我們在一開始, 中間還是結束了嗎? 現在,當然也有一些其他的 操作我們有可能實現的。 而這些圖片在這裡只是描述 我們剛剛與人類一樣。 怎麼樣去除? 如果我想,例如, 刪除號碼34或55, 我可能有同樣的代碼, 但我會需要一個或兩個步驟。 因為什麼是新的? 如果我刪除某人的盡頭, 像一些55後34, 什麼也有改變,因為我做到這一點? 我不evict-- 你叫什麼名字來著? 聽眾:傑克。 戴維·J·馬蘭:傑克。 我不僅evict--免費傑克, 所以從字面上撥打免費傑克,或者至少 指針有過,但現在 有什麼需要改變與彼得? 他的手好開始朝下。 因為只要我一打電話免費 傑克,如果彼得還指著傑克 因此我繼續穿越 列表和訪問這個指針, 這時候我們的老朋友分割 故障實際上可能一命嗚呼 因為我們已經給了 記憶回到傑克。 你可以呆在那裡 笨拙的只是一瞬間。 因為我們只是一對夫婦 最終的操作考慮。 刪除列表的頭部, 或beginning--而這一次的 有點討厭。 因為我們要知道,加布 是一種特殊的這一計劃。 因為事實上,他有自己的指針。 他不只是被指向, 因為幾乎所有的人在這裡。 所以當表的標頭是 拆除,誰的手裡現在需要改變嗎? 你叫什麼名字來著? 聽眾:恭。 戴維·J·馬蘭:我是可怕的 在名稱,顯然。 因此,Christine和加布, 誰的手裡需要改變 當我們試圖刪除恭, 5號,從圖片? 好了,讓我們做加布。 Gabe的去點, 據推測,在9號。 但是,接下來應該發生? 聽眾:恭應 為null [聽不清]。 戴維·J·馬蘭:好,我們也許應該 make--聽到“空”的地方。 聽眾:空和她的自由。 戴維·J·馬蘭:NULL是什麼? 聽眾:空和她的自由。 戴維·J·馬蘭:空和她的自由。 因此,這是很容易的。 它是完美的,你現在已經排序 站在那裡,沒有歸屬感。 因為你已經 從列表中去耦。 你一直有效 從列表中孤立。 因此,我們最好稱之為自由現在 恭讓的記憶回來了。 否則,每次我們 從列表中刪除一個節點 我們可能會犯名單 短,但實際上不降低 在存儲器的大小。 所以,如果我們繼續增加和 添加,添加的東西的清單, 我的電腦可能會變慢 和慢, 因為我跑出來的 內存,即使我沒有實際 用恭的字節 內存了。 那麼,到底還有其他 場景course--去除, 在中間,除去 到了最後,正如我們所看到。 但更有趣的 現在的挑戰是 將是準確地考慮 運行時間是什麼。 這樣不僅可以讓您的 紙片,如果,加布, 你不會介意 每個人都有壓力球。 非常感謝你對我們的鍊錶 這裡的志願者,如果你能。 [掌聲] 戴維·J·馬蘭:好吧。 因此,一對夫婦的分析 問題的話,如果我能。 我們以前見過這個符號, 大O和歐米茄,上限 和上下限 運行一些算法的時間。 所以讓我們只考慮 幾個問題。 一,我們說這 之前,有什麼運行 搜索了時間 在大澳條款清單? 什麼是上限運行 搜索鏈接列表的時間 通過我們的志願者在這裡實現的? 這n個大O,線性的。 由於在最壞的情況下, 元素,如55, 我們可能會尋找可能的地方 傑克,一路在末端。 不幸的是,一個數組不同 我們不能看上這個時候。 雖然我們所有的人都是 排序由小分子,5, 一路到更大的元素, 55,這通常是一件好事。 但到底是什麼這樣的假設 不再允許我們做什麼? 聽眾:[聽不清] 戴維·J·馬蘭:再說一遍嗎? 聽眾:隨機訪問。 戴維·J·馬蘭:隨機訪問。 而反過來,這意味著我們不能 再使用弱零,直覺, 而顯而易見使用二進制的 搜索和分而治之。 因為即使我們 人類能明顯 看到劉德華或基督徒都 大致在表的中間, 我們只知道,作為一個 計算機通過略讀列表 從一開始。 因此,我們已經放棄了隨機訪問。 n個這麼大O,現在是上 必將在我們的搜索時間。 那麼我們的搜索的歐米茄? 什麼是搜索上下限 在此列表中的一些數字? 聽眾:[聽不清] 戴維·J·馬蘭:再說一遍嗎? 聽眾:一。 戴維·J·馬蘭:一。 因此,一定的時間。 在最好的情況下,克里斯汀是 的確在列表的開頭。 我們正在尋找 5號,所以我們找到了她。 所以,沒什麼大不了的。 但她一定是在 開始列表在此情況下的。 那麼什麼樣刪除? 如果你想刪除一個元素? 什麼是上界和下界 有關刪除的東西從鏈接 上市? 聽眾:[聽不清] 戴維·J·馬蘭:再說一遍嗎? 聽眾:不適用。 戴維·J·馬蘭:n為 確的上限。 由於在最壞的情況下,我們嘗試 刪除傑克,就像我們剛剛做。 他一路底。 把我們永遠的,或 n步找到他。 所以這是一個上限。 這是線性的,肯定的。 和最好的情況下的運行時間,或 在最好的情況下,下限 將恆定時間。 因為也許我們嘗試刪除 克里斯蒂娜,我們只是很幸運 她開頭。 現在,等待一分鐘。 加布也之初, 我們也必須更新加布。 所以這不只是一個步驟。 那麼,這確實是恆定的 時,在最好的情況下, 去除的最小元素? 它,即使它可能是兩個, 3,甚至是100行的代碼, 如果它的相同數量的 行,而不是在一些環路, 和獨立的大小 名單的,絕對。 刪除的元素 在列表的開頭, 即使我們要處理 加布,仍然是固定的時間。 因此,這似乎是一個 巨大的倒退。 什麼時間是浪費 如果,在週1週和 零,我們不但 偽代碼,但實際的代碼 實施東西的日誌 基N,或登錄,而是n的基地2個, 在其運行時間條件。 那麼,為什麼赫克,我們將要開始 使用類似鍊錶? 是啊。 聽眾:所以,你可以添加 元件的陣列。 戴維·J·馬蘭:所以,你可以 元素添加到數組中。 而這也是主題。 我們將繼續看到 這個,這個權衡,多 就像我們已經看到了 權衡合併排序。 我們真的可以加快 搜索或排序,相反, 如果我們花多一點的空間, 有記憶的附加塊 或數組的歸併排序。 但是,我們花更多 空間,但我們節省時間。 在這種情況下,我們 放棄時間,但我們 獲得的靈活性, 活力,如果你願意, 這無疑是一個積極的功能。 我們也花了空間。 在什麼意義上是一個鏈接 列出更貴 在空間不是一個數組方面? 哪裡是多餘的空間來的呢? 是嗎? 聽眾:[聽不清]指針。 戴維·J·馬蘭:是的,我們 也具有指針。 因此,這是minorly煩人 在不再是 存儲I只是一個int 表示一個int。 我存儲一個int和 指針,這也是32位。 所以,我從字面上倍增 所涉及的空間量。 所以這是一個權衡,但 這是在整數的情況下。 假設你沒有存放整型, 但是假設每個這些矩形 或者這些人被代表 一個字,一個英語單詞 可能是五個字符,10 人物,更可能。 然後加入只有32多個位 也許是少了一個大問題。 如果每個學生什麼 在演示 是字面上的學生結構的 有名字和房子,也許 電話號碼和Twitter 處理等。 因此,所有的領域,我們開始 說起那天, 更大不了的 我們的節點變得更加有趣 和大花,嗯,一個額外的 指針只是將它們連接在一起。 不過說實在的,這是一個權衡。 事實上,代碼 更複雜的,因為你會 看到通過略讀 這特殊的例子。 但是,如果有什麼 這裡的一些制勝法寶。 如果我們不採取一步 倒退,但一個巨大的進步 並實現數據 結構,通過它我們 可以找到像傑克或元素 恭或任何其他元素 在這個陣列中的真正的固定時間? 搜索是恆定的。 刪除是恆​​定的。 插入件是恆定的。 所有這些操作都是恆定的。 這將是我們的制勝法寶。 而這正是我們 下次還會回升。 到時候見。