JASON Hirschhorn: Witam wszystkich do sekcji Seven. Jesteśmy w tym tygodniu siedem kursu. I ten nadchodzący czwartek jest Halloween, więc jestem ubrane jak dynia. Nie mogłem zginać i umieścić na moje buty, więc dlatego jestem tylko na sobie skarpetki. Ja również nie ma na sobie nic pod to, więc nie mogę go zdjąć, jeśli jest to rozpraszać do Ciebie. Z góry przepraszam za to. Nie trzeba sobie wyobrazić co się dzieje. Mam na sobie bokserki. Tak to wszystko jest dobre. Mam dłuższy tekst o tym, dlaczego jestem ubrany jak dynia, ale mam zamiar z zastrzeżeniem, że później w tej sekcji bo chcę zacząć. Mamy wiele ciekawych rzeczy , aby przejść przez ten tydzień. Większość z nich odnoszą się bezpośrednio do tego tygodniu zestaw problemem, błędy ortograficzne. Mamy zamiar jechać na związane hash listy i tabele na całej długości. Umieścić tę listę się co tydzień, listę Zasoby dla Ciebie, aby pomóc w Materiał na ten kurs. Jeśli ze stratą lub jeśli szukasz niektórych więcej informacji, zapoznaj się z jedną z tych zasobów. Ponownie pset6 to błędy ortograficzne, w tym tygodniu pset. A także zachęca, a ja Zachęcam do korzystania z niektórych innych Zasoby specjalnie do tego zbior. W szczególności, trzy mam wymienione na ekranie - gdb, które już znają i był używany przez jakiś czas teraz, to będzie bardzo pomocny w tym tygodniu. Więc stawiam, że się tutaj. Ale gdy pracujesz z C, należy zawsze używać gdb debugowania programów. W tym tygodniu valgrind również. Czy ktoś wie, co valgrind robi? PUBLICZNOŚCI: Sprawdza, czy nie ma wycieków pamięci? JASON Hirschhorn: Valgrind sprawdza, czy nie ma wycieków pamięci. Więc jeśli coś w twoich malloc Program, prosisz dla pamięci. Pod koniec programu, masz pisać za darmo na wszystko, co malloced dać pamięć z powrotem. Jeśli nie pisać za darmo, a na końcu Twój program dochodzi do wniosku, Wszystko będzie automatycznie być zwolniona. I dla małych programów, to nie takie wielkie rzeczy. Ale jeśli piszesz dłuższy bieg Program, który nie rzucić, niekoniecznie, w ciągu kilku minut lub A kilka sekund, a następnie pamięć przecieki może stać się wielka sprawa. Więc dla pset6, oczekuje się, że będziesz mieć zero wycieków pamięci z Twój program. Aby sprawdzić, czy nie ma wycieków pamięci, uruchomić valgrind i to da ci jakiś ładny Wyjście z powiadomieniem czy czy wszystko było za darmo. Będziemy ćwiczyć z nim później dzisiaj, mam nadzieję. Wreszcie polecenia diff. Kiedyś coś podobnego do niego w pset5 z narzędziem peek. Pozwalał zajrzeć do środka. Kiedyś też diff też za Problem ustawić specyfikację. Ale pozwalał na porównać dwa pliki. Można porównać plik bitmapy i Informacje nagłówki roztworu personelu i rozwiązanie w pset5 jeśli wybrał go używać. Różnica będzie można to zrobić, jak również. Możesz porównać poprawną odpowiedź na Problem w tym tygodniu zestaw do odpowiedzi i sprawdzić, czy linie się lub zobacz gdzie błędy. To są trzy dobre narzędzia, które należy użyć w tym tygodniu, a na pewno sprawdzić swój program z tych trzech narzędzi przed włączeniem go w. Ponownie, jak już wspomniano w każdym tygodniu, jeśli masz jakieś uwagi - zarówno dla mnie pozytywne i konstruktywne - prosimy udać się na stronę internetową w dół suwaka i wejście to jest. Naprawdę doceniam każdy i wszystkie informacje zwrotne. I jeśli dasz mi konkretne rzeczy, które Można zrobić, aby poprawić lub że jestem dobrze, że chcesz mnie do nadal uważam, że do serca i bardzo się starają, aby słuchać na Wasze opinie. Nie mogę obiecać, że zrobię wszystko, chociaż, jak sobie dyni kostium co tydzień. Więc mamy zamiar spędzić większość punkt, jak już wspomniałem, mówi o Listy i tabele powiązane z cebulą, które będzie bezpośrednio stosowane do Problem ustawić w tym tygodniu. Linked list pójdziemy na stosunkowo szybko, bo spędziliśmy w porządku trochę czasu będzie nad nim w sekcji. I tak dostaniemy prosto do kodowanie problemy dla połączonych listach. I wtedy w końcu będziemy rozmawiać o hash tabele i jak odnoszą się do tego ustawić tygodniu problem. Widziałeś ten kod wcześniej. To jest struktura, i definiuje coś nowego o nazwie węzła. I wewnątrz węzła jest liczbą całkowitą tu i tam jest wskaźnik do inny węzeł. Widzieliśmy to już wcześniej. Zostało to zbliża się do Kilka tygodni. Łączy wskazówek, które mamy już pracujemy i strukturach, które pozwalają nam się połączyć dwa różne rzeczy do jednego typu danych. Jest wiele dzieje się na ekranie. Ale wszystko to powinno być stosunkowo zaznajomieni z tobą. Na pierwszej linii Oświadczam, nowy węzeł. A następnie wewnątrz tego nowego węzła, ustawić całkowita w tym węźle do jednego. Zobaczymy w następnym wierszu robię printf polecenia, ale już nieaktywne Polecenie printf bo naprawdę Ważną częścią jest ta linia tutaj - new_node.n. Co oznacza kropka oznacza? PUBLICZNOŚCI: Idź do węzła i ocenić wartość n dla niego. JASON Hirschhorn: To Dokładnie tak. Kropka oznacza dostęp do części n ten nowy węzeł. Następna linia co robi? Michael. PUBLICZNOŚCI: To tworzy inny węzeł które wskazują na nowym węźle. JASON Hirschhorn: Więc to nie utworzenie nowego węzła. Stwarza to co? PUBLICZNOŚCI: wskaźnik. JASON Hirschhorn: wskaźnik do węzła, wskazanych przez ten węzeł * tutaj. Tak tworzy wskaźnik do węzła. I który węzeł jest wskazując do Michael? PUBLICZNOŚCI: Nowy węzeł? JASON Hirschhorn: Nowy węzeł. I to wskazuje, bo mamy tam podano mu adres nowego węzła. I teraz w tej linii widzimy dwa różne sposoby wyrażając to samo. Chciałem podkreślić, w jaki sposób dwie rzeczy są takie same. W pierwszej linii, ale nieprawidłowego wskaźnik. Więc idziemy do węzła. To właśnie ta gwiazda oznacza. Widzieliśmy, że zanim z wskaźniki. Idź do tego węzła. To jest w nawiasach. A następnie przejść przez operatora dot Element n tego węzła. Tak, że bierze składni widzieliśmy tu i teraz używając go ze wskaźnikiem. Oczywiście, robi się trochę zajęty, jeśli piszesz te nawiasy - że gwiazda i kropka. To staje się trochę tłoczno. Więc mamy trochę cukru syntaktyczne. I ta linia tutaj - ptr_node-> n. Że robi to samo dokładne. Więc te dwa wiersze kodu równoważne i zrobi dokładnie to samo. Ale chciałem zwrócić te przed pójdziemy dalej, aby zrozumieć że naprawdę to coś tu jest po prostu cukier syntaktyczny dla dereferencji wskaźnik, a następnie będzie n część tej struktury. Wszelkie pytania dotyczące tego suwaka? OK. Więc mamy zamiar przejść przez kilka operacji, które można wykonać na związane listy. Powiązana lista, przypomnijmy, jest seria węzły, które wskazują na siebie. I na ogół zaczynają się wskaźnik nazywa głowa, generalnie, który wskazuje na Pierwszą rzeczą, na liście. Tak więc w pierwszej linii Tu mają pierwszy nasz oryginalny L. Tak, co można pomyśleć - to tekst tutaj można myśleć jako tylko wskaźnik mamy zapisane gdzieś, że punkty pierwszego elementu. I w tej połączonej listy mamy cztery węzły. Każdy węzeł jest duże okno. Większe pole wewnątrz duża Skrzynka jest częścią całkowitą. A potem mamy część wskaźnika. Pola te nie są wystawione na skalę, ponieważ, jak duże jest całkowitą w bajtach? Jak teraz duży? Cztery. I jak duży jest wskaźnik? Cztery. Tak naprawdę, gdybyśmy mieli narysować to oba pola skalowanie byłby taki sam rozmiar. W tym przypadku chcemy, aby wstawić coś do połączonej listy. Więc można zobaczyć tutaj mamy wkładania pięć My przechodzić przez linked list, dowiedzieć się, gdzie pięć idzie, a następnie włóż ją. Przeanalizujmy to na dół i idź trochę wolniej. Zamierzam zwrócić się do zarządu. Więc mamy pięć, że węzeł stworzyliśmy w mallocs. Dlaczego wszyscy się śmiać? Tylko żartowałem. OK. Więc my malloced pięć. Stworzyliśmy ten węzeł gdzie indziej. Mamy to gotowi. Rozpoczynamy z przodu nasza lista z dwóch. I chcemy, aby wstawić w uporządkowany sposób. Więc jeśli widzimy dwa i chcemy umieścić w pięciu, co robimy, gdy widzimy coś mniej niż nas? Co? Chcemy, aby wstawić w to pięć linked list, zachowując to sortowanie. Widzimy numer dwa. Więc co robimy? Marcus? PUBLICZNOŚCI: Call wskaźnik do następnego węzła. JASON Hirschhorn: I dlaczego idziemy do następnego? PUBLICZNOŚCI: Bo to jest następny węzeł do wykazu. I wiemy tylko, że inną lokalizację. JASON Hirschhorn: A pięć jest większa niż dwa, w szczególności. Ponieważ chcemy, aby to posortowane. Tak więc pięć jest większa niż dwa. Więc przechodzimy do następnego. I teraz dochodzimy do czterech. A co się stanie, gdy dotrzemy cztery? Pięć jest większa niż cztery. Więc dalej. A teraz jesteśmy o szóstej. I co widzimy na sześć? Tak, Carlos? PUBLICZNOŚCI: Sześć jest większa niż pięć. JASON Hirschhorn: Six większa niż pięć. Tak to jest, gdy chcemy wstawić pięć. Jednakże, należy pamiętać, że jeśli mają tylko jeden wskaźnik tutaj - to nasz dodatkowy wskaźnik, że jest przechodzącego przez liście. A my, wskazując na sześć. Straciliśmy śledzić, co przychodzi przed szóstą. Więc jeśli chcemy wstawić coś do ta lista utrzymanie go sortowana, prawdopodobnie trzeba jak najwięcej wskazówek? PUBLICZNOŚCI: Dwa. JASON Hirschorn: Dwa. Jednym śledzić prądu oraz tę obserwację poprzedni. To jest tylko pojedynczo połączonej listy. Oczywiste jest tylko w jednym kierunku. Gdybyśmy mieli podwójnie połączonej listy, w których wszystko wskazuje na rzeczy po nim i przed nim rzeczy, a następnie nie będzie musiał tego robić. Ale w tym przypadku nie chcemy stracić utwór z tego, co było przed nami, w przypadku musimy wstawić pięć gdzieś w środku. Powiedzieć, że byliśmy wstawienie dziewięć. Co się stanie, gdy mamy do ośmiu? PUBLICZNOŚCI: Musiałbyś dostać ten punkt NULL. Zamiast punkt zerowy musiałbyś dodać element, a następnie mają wskazywać na dziewięciu. JASON Hirschorn: Dokładnie. Więc mamy osiem. Docieramy do końca listy, ponieważ to wskazuje na null. A teraz, zamiast wskazywać na wartość null mamy go zwrócić do naszego nowego węzła. I ustawiamy kursor w nasz nowy węzeł na null. Czy ktoś ma jakieś pytania o wstawienie? Co zrobić, jeśli nie dbają o prowadzenie listy sortowane? PUBLICZNOŚCI: Trzymaj go na początku lub na końcu. JASON Hirschorn: Trzymaj go na początek lub koniec. Który z nich należy zrobić? Bobby? Dlaczego koniec? PUBLICZNOŚCI: Ponieważ początek jest już wypełnione. JASON Hirschorn: OK. Początek jest już wypełnione. Kto chce argumentować przeciwko Bobby. Marcus. PUBLICZNOŚCI: Cóż prawdopodobnie chcesz trzymać go na początku, ponieważ w przeciwnym razie, jeśli umieścić go na koniec trzeba by przemierzać całą listę. JASON Hirschorn: Dokładnie. Więc jeśli myślimy o czasie pracy, czas wstawiania w celu byłaby n rozmiar. Co jest duże O czas wstawiania na początku? Stała czasowa. Więc jeśli nie dbają o utrzymanie coś, sortowanie, dużo lepiej po prostu wstaw na początku listy. A, które mogą być wykonane w stałym czasie. OK. Kolejną czynnością jest znalezienie, który inne - mamy sformułować to jako poszukiwanie. Ale będziemy patrzeć przez powiązana lista jakiegoś obiektu. Wy widzieliście kod sprawdzić wcześniej w wykładzie. Ale jakby po prostu zrobił to z wstawiania, lub co najmniej włożenie coś sortowane. Przeglądając, będzie węzeł przez węzeł, aż znajdziesz numer, że jesteś szukasz. Co się stanie, jeśli dojdziesz koniec listy? Powiedzieć szukam dziewiątej i I osiągają koniec listy. Co robimy? PUBLICZNOŚCI: return false? JASON Hirschorn: return false. Nie go znaleźć. Jeśli dojdziesz do końca listy i Nie można znaleźć numer jesteś szuka, to nie tam. Wszelkie pytania na temat znaleźć? Jeśli to był list sortowane, co by być różne dla naszych poszukiwań? Tak. PUBLICZNOŚCI: To znaleźć pierwszą wartość to jest większa niż jeden szukasz i następnie return false. JASON Hirschorn: Dokładnie. Więc jeśli jest to lista sortowane, jeśli mamy do coś, co jest większe niż to, co szukamy, nie trzeba wracamy do końca listy. Możemy w tym miejscu zwróci false bo nie będziemy go znaleźć. Pytanie brzmi teraz, rozmawialiśmy o utrzymanie umieszczony list sortowanie, utrzymując je nieposortowane. To będzie coś, że jesteś prawdopodobnie będzie myśleć o gdy błąd kodowania ustawić pięć, jeśli wybierz tabeli mieszania z osobna łańcuchowym podejście, które będziemy rozmawiać o później. Ale czy warto, aby utrzymać listę sortowane, a następnie być w stanie może mieć szybsze wyszukiwanie? Czy może lepiej, aby szybko wstawić coś w ciągłym czasie pracy, ale potem mają już poszukiwania? To kompromis tam, że ci decydujesz, co jest bardziej odpowiednie dla konkretnego problemu. I nie koniecznie jeden absolutnie prawidłowa odpowiedź. Ale to z pewnością decyzja masz zrobić, i chyba dobrze się bronić , że, powiedzmy, komentarz lub dwa, dlaczego wybierzesz jeden nad drugim. Wreszcie, usuwanie. Widzieliśmy usuwanie. To jest podobne do przeszukiwania. Szukamy elementu. Powiedzieć, staramy się usunąć sześć. Tak więc znajdziemy sześć tutaj. Rzeczą, że musimy się upewnić, że nie jest to, że cokolwiek jest skierowany do sześć - jak widzimy w kroku dwa na dole - bez względu na to, wskazując na sześć do potrzeb pominąć sześć teraz i zmienić na co sześć wskazuje. Nie chcemy, aby kiedykolwiek resztę sierocych nasza lista, zapominając, że aby ustawić poprzedni wskaźnik. A następnie czasami, w zależności w sprawie programu, oni po prostu usunąć ten węzeł całkowicie. Czasami będziesz chciał wrócić wartość, która jest w tym węźle. Tak to jest jak usuwanie prac. Wszelkie pytania na temat usunąć? PUBLICZNOŚCI: Więc jeśli masz zamiar usunąć to, by po prostu użyć darmo, bo przypuszczalnie był malloced? JASON Hirschorn: Jeśli chcesz, aby zwolnić coś, co jest dokładnie prawo i malloced go. Powiedzmy, że chciał wrócić tę wartość. Możemy powrócić sześć, a następnie wolne ten węzeł i zadzwoń za darmo na nim. Albo my prawdopodobnie najpierw zadzwonić darmo a następnie powrócić sześć. OK. Więc przejdźmy do praktyki kodowania. Jedziemy do kodu trzy funkcje. Pierwszy z nich nazywa się insert_node. Więc masz kod, który wysłałem maila cię i jeśli to oglądasz później można uzyskać dostęp do kodu w linked.c na stronie internetowej CS50. Ale w linked.c, istnieje pewne szkielet kodu, który już została napisana dla Ciebie. A wtedy nie funkcjonuje para trzeba napisać. Najpierw jedziemy do Napisać insert_node. A co insert_node robi Czy wstawia liczbę całkowitą. I dajesz liczbę całkowitą w połączonej listy. A w szczególności, trzeba zachować listę posortowaną od najmniejszego do największego. Również, że nie chcesz, aby wkładać żadnych duplikatów. W końcu, jak widać insert_node zwraca bool. Więc powinien poinformować użytkownika, czy insertu sukces, wracając prawdziwe lub fałszywe. Pod koniec tego programu - i na tym etapie nie ma potrzeby martwić się o uwolnienie nic. Więc wszystko co robisz jest podejmowanie liczbę całkowitą i umieszczeniu go w formie listy. To jest to, co pytam teraz zrobić. Ponownie, w linked.c, które wszyscy mają, jest kod szkielet. I powinieneś zobaczyć w kierunku dna deklaracja funkcji próbki. Jednak przed przejściem do jej kodowania w C, gorąco zachęcam, aby przejść przez kroki byliśmy uprawiania każdego tygodnia. Mamy już za obraz ten. Należy więc mieć pewne zrozumienie o tym, jak to działa. Ale zachęcam was do pisania niektóre pseudokod przed nurkowaniem w. I mamy zamiar iść na Pseudokod w grupie. A potem jak już napisałeś pseudokod, a raz pisaliśmy nasze pseudokod w grupie, można przejdź do kodowania to w C. Jako heads up, funkcja insert_node to chyba najtrudniejsza z trzy będziemy pisać, bo dodano kilka dodatkowych ograniczeń do programowanie, w szczególności, że nie zamierzamy wstawić dowolny duplikaty i że lista powinny pozostać sortowane. Więc to jest nietrywialne Program że trzeba kodować. I dlaczego nie można przyjąć pięć do siedmiu minut tylko po to żeby pracować na Pseudokod i kod. A potem zaczniemy dzieje w grupie. Ponownie, jeśli masz jakieś pytania po prostu podnieść rękę, a ja się wokół. . My także ogólnie do nich - lub nie wyraźnie powiedzieć ci może pracować z ludźmi. Ale oczywiście, gorąco zachęcam, jeśli masz pytania, zapytać sąsiad siedzący obok ciebie lub nawet pracować z kimś indziej, jeśli chcesz. Nie musi być indywidualnie cicha działalność. Zacznijmy pisanie niektórych pseudokod na pokładzie. Kto może mi dać pierwszą linię pseudokod dla tego programu? Aby pełnić taką funkcję, a - insert_node. Alden? PUBLICZNOŚCI: Więc pierwszą rzeczą jaką zrobiłem było utworzenie nowego wskaźnika do węzła i I inicjowany to wskazuje sama rzecz, że lista wskazuje. JASON Hirschorn: OK. Więc tworząc nowy wskaźnik z wykazu, a nie do węzła. PUBLICZNOŚCI: Prawo. Tak. JASON Hirschorn: OK. A następnie, co chcemy zrobić? Co potem? Co z węzła? Nie mamy węzeł. Musimy tylko wartość. Jeśli chcemy wstawić węzeł, co my musisz zrobić, zanim jeszcze możemy myśleć o umieszczenie go? PUBLICZNOŚCI: Och, przepraszam. musimy malloc przestrzeń dla węzła. JASON Hirschorn: Doskonały. Zróbmy - OK. Nie może dotrzeć, że wysokie. OK. Idziemy w dół, a następnie używamy dwóch kolumn. Nie mogę iść, że - OK. Utwórz nowy węzeł. Możesz utworzyć inny wskaźnik do listy albo po prostu użyć listy, gdyż istnieje. Tak naprawdę nie trzeba robić. Więc tworzymy nowy węzeł. Świetnie. To, co możemy zrobić w pierwszej kolejności. Co dalej? PUBLICZNOŚCI: Czekaj. Należy utworzyć nowy węzeł teraz lub powinniśmy poczekać, aby upewnić się, że Nie ma duplikatów węzła na liście, zanim go utworzyć? JASON Hirschorn: Dobre pytanie. Niech utrzymują, że na później, bo większość czasu będziemy tworząc nowy węzeł. Tak będziemy trzymać tego tutaj. Ale to jest dobre pytanie. Jeśli tworzymy go i znaleźć Duplikat, co powinno my przed powrotem? PUBLICZNOŚCI: Uwolnij go. JASON Hirschorn: Tak. Prawdopodobnie uwolnić go. OK. Co robimy po tym utworzyć nowy węzeł? Annie? PUBLICZNOŚCI: Włożyliśmy Liczba w węźle? JASON Hirschorn: Dokładnie. Kładziemy numer - my malloc przestrzeń. Zamierzam opuścić to wszystko w jednej linii. Ale masz rację. Mamy malloc przestrzeń, a następnie możemy podać liczbę cala Można nawet ustawić wskaźnik część null. To się dokładnie zgadza. A następnie co potem? Braliśmy tego obrazu na płycie. Więc co robimy? PUBLICZNOŚCI: Idziemy przez liście. JASON Hirschorn: Przejdź przez liście. OK. A co my sprawdzić w każdym węźle. Kurt, co możemy sprawdzić dla każdego węzła w? PUBLICZNOŚCI: Zobacz, czy wartość n węzeł ten jest większy niż wartość n naszego węzła. JASON Hirschorn: OK. Mam zamiar zrobić - Tak, OK. Więc to jest n - Zamierzam powiedzieć, czy wartość jest większa niż tego węzła, to co robimy? PUBLICZNOŚCI: Cóż, to włóż co prawda wcześniej. JASON Hirschorn: OK. Więc jeśli jest większa niż ta, następnie chcemy wstawić. Ale chcemy go wstawić tuż przed bo też musiałyby być śledzenia, następnie z tego, co było wcześniej. Więc wstawić wcześniej. Więc chyba coś przegapiłem wcześniej. Prawdopodobnie należy prowadzenie utwór z tego, co się dzieje. Ale my tam wrócić. Więc co wartość jest mniejsza niż? Kurt, co zrobimy, jeśli wartość jest mniejsza? PUBLICZNOŚCI: Wtedy po prostu iść dalej chyba że to ostatnie. JASON Hirschorn: Podoba mi się. Więc idź do następnego węzła. Chyba, że ​​to ostatni - Jesteśmy prawdopodobnie sprawdzając, że w warunkach stanu. Ale tak, następny węzeł. I to się zbyt niska, więc poruszamy tutaj. Ale jeśli - Czy każdy może to zobaczyć? Jeśli jesteśmy równe co robimy? Jeśli wartość chcemy wstawić jest równa wartości tego węzła? Tak? PUBLICZNOŚCI: [niesłyszalne]. JASON Hirschorn: Tak. Biorąc to pod uwagę - Marcus ma rację. Mogliśmy być może zrobić coś innego. Ale biorąc pod uwagę, że stworzyliśmy go tutaj należy zwolnić, a następnie wrócić. O rany. Czy tak lepiej? Jak to jest? OK. Wolne i to co mamy powrót, [niesłyszalne]? OK. Nam brakuje czegoś? Więc gdzie śledzenie ze stanu węzła? PUBLICZNOŚCI: Myślę, że byłoby to po stworzenie nowego węzła. JASON Hirschorn: OK. Tak więc na początku będziemy prawdopodobnie - Tak, możemy stworzyć nowy wskaźnik do węzeł, jak i poprzedniego wskaźnika węzła aktualny wskaźnik węzła. Warto więc włożyć, że tutaj. Tworzenie bieżących i poprzedni wskaźniki do węzłów. Ale kiedy mamy dostosować te wskaźniki? Gdzie to robimy w kodzie? Jeff? PUBLICZNOŚCI: - warunki wartości? JASON Hirschorn: Które jeden w szczególności? PUBLICZNOŚCI: Jestem po prostu pomylić. Jeśli wartość jest wyższa niż tego węzła, nie oznacza to, że chcesz iść do następnego węzła? JASON Hirschhorn: Więc jeśli nasza wartość jest większa niż wartość tego węzła. PUBLICZNOŚCI: Tak, to że chcesz pójść dalej w dół linii, prawda? JASON Hirschhorn: Prawo. Więc nie wstawić go tutaj. Jeśli wartość jest mniejsza niż tego węzła, a następnie możemy przejść do następnego węzła - lub wtedy wstawić wcześniej. PUBLICZNOŚCI: Czekaj, co to jest węzeł i co jest wartością? JASON Hirschhorn: Dobre pytanie. Wartość firmy na tej definicji funkcji jest to, co dostaniesz. Więc wartość jest podana liczba jesteśmy. Tak więc, jeżeli stosunek ten jest mniejszy niż węzeł, potrzebujemy czasu, aby wstawić. Jeśli wartość jest wyższa niż tego węzła, możemy przejść do kolejnego węzła. I powrót do pierwotnego pytania, chociaż, w którym - PUBLICZNOŚCI: Jeżeli wartość jest większa niż tego węzła. JASON Hirschhorn: I tak co robimy tutaj? Słodkie. Zgadza się. Ja tylko napiszę aktualizacja wskaźników. Jednak tak, z obecnego będzie można go zaktualizować do wskazują na następną. Coś jeszcze brakuje nam? Więc idę do tego typu kod w gedit. A ja to zrobić, możesz mieć Jeszcze kilka minut pracować na kodowanie to w C. Więc mam Wprowadź Pseudokod. Szybka uwaga, zanim zaczniemy. Nie może być w stanie w pełni skończyć w ogóle trzy z tych funkcji. Jest poprawne dla nich rozwiązania że będę do Ciebie e-mail facetów po części, i będzie być wysłane na CS50.net. Więc ja nie zachęcam do sprawdź na sekcjach. Zachęcam, aby spróbować je na swoje właścicielem, a następnie skorzystać z praktyki problemy, aby sprawdzić swoje odpowiedzi. Te zostały zaprojektowane do ścisłej dotyczą i stosować się do tego, co co musisz zrobić na planie problemów. Więc ja nie zachęcam do uprawiania tego na własną rękę, a następnie użyć kodu sprawdź swoje odpowiedzi. Ponieważ chcę, aby przejść do mieszania Tabele w pewnym momencie w sekcji. Więc nie może się przez to wszystko. Ale zrobimy teraz, jak wiele możemy. OK. Zacznijmy. Asam, w jaki sposób utworzyć nowy węzeł? PUBLICZNOŚCI: Zdajesz struct *. JASON Hirschhorn: Więc mieć, że się tutaj. Och, przepraszam. Mówiłeś struct *. PUBLICZNOŚCI: A potem [? rodzaj?] węzeł lub c węzeł. JASON Hirschhorn: OK. Mam zamiar nazwać new_node więc możemy pozostać spójne. PUBLICZNOŚCI: I chcesz ustawić, że na czele, pierwszy węzeł. JASON Hirschhorn: OK. Więc teraz to wskazując na - tak to nie stworzył jeszcze nowy węzeł. To jest po prostu wskazując Pierwszy węzeł do wykazu. Jak utworzyć nowy węzeł? Jeśli potrzebują miejsca, aby utworzyć nowy węzeł. Malloc. I jak duża? PUBLICZNOŚCI: wielkość struktury. JASON Hirschhorn: Powierzchnia tej struktury. I co się struktura nazywa? PUBLICZNOŚCI: węzeł? JASON Hirschhorn: Węzeł. Więc malloc (sizeof (węzeł)); daje nam przestrzeń. I to ta linia - jedno jest nieprawidłowy na tej linii. Czy new_node wskaźnik do struktury? To nazwa ogólna. Co to jest - węzeł, dokładnie. Jest to węzeł *. A co zrobimy zaraz po my malloc coś, Asan? Co jest pierwszą rzeczą, którą robimy? A jeśli to nie działa? PUBLICZNOŚCI: Och, sprawdzić, czy wskazuje na węźle? JASON Hirschhorn: Dokładnie. Więc jeśli new_node równa równych null, co robimy? To zwraca bool, tę funkcję. Dokładnie. Wygląda dobrze. Coś tam dodać? Dodamy rzeczy na końcu. Ale do tej pory wygląda dobrze. Tworzenie bieżących i wcześniejszych wskazówek. Michael, jak mogę to zrobić? PUBLICZNOŚCI: Trzeba zrobić węzeł *. Trzeba, aby nie jeden dla new_node ale węzły już mamy. JASON Hirschhorn: OK. Więc bieżący węzeł jesteśmy na. Zadzwonię, że Curr. Dobrze. Zdecydowaliśmy, że chcemy zachować dwa, ponieważ musimy wiedzieć co jest przed nim. Czego oni się inicjowany? PUBLICZNOŚCI: Ich wartość na naszej liście. JASON Hirschhorn: Więc co jest Pierwszą rzeczą, na naszej liście? Albo jak wiemy, gdzie początku naszej liście jest? PUBLICZNOŚCI: Czy nie przeszedł do funkcji? JASON Hirschhorn: Prawo. Została uchwalona w tutaj. Więc jeśli jest przekazywana do funkcji, początku listy, co powinniśmy ustawić prąd równy? PUBLICZNOŚCI: Lista. JASON Hirschhorn: Lista. To się dokładnie zgadza. Teraz ma adres Początek naszej liście. A co poprzedni? PUBLICZNOŚCI: Lista minus jeden? JASON Hirschhorn: Jest nic przed nim. Więc co możemy zrobić, aby oznaczać nic? PUBLICZNOŚCI: Null. JASON Hirschhorn: Tak. To brzmi jak dobry pomysł. Idealny. Dziękuję. Przejdź przez liście. Konstantyn, jak długo będziemy przejść przez liście? PUBLICZNOŚCI: aż do osiągnięcia wartości null. JASON Hirschhorn: OK. Jeśli tak, podczas gdy, na pętli. Co my robimy? PUBLICZNOŚCI: Może dla pętli? JASON Hirschhorn: Zróbmy na pętli. OK. PUBLICZNOŚCI: I mówimy o - aż bieżący wskaźnik nie jest równa null. JASON Hirschhorn: Więc jeśli wiemy Stan, w jaki sposób możemy napisać pętlę opiera się tego warunku. Jaki rodzaj pętli powinniśmy użyć? PUBLICZNOŚCI: Podczas. JASON Hirschhorn: Tak. To sprawia, że ​​więcej sensu w oparciu się z tego, co pan powiedział. Jeśli po prostu chcesz iść do my, że będzie po prostu wiem, że coś, by to zrobić Poczucie zrobić pętlę while. Podczas gdy obecna nie równa null, jeśli wartość jest mniejsza niż tego węzła. Akshar, daj mi ten wiersz. PUBLICZNOŚCI: Jeśli aktualny-> n n mniej niż wartości. Lub do tyłu, że. Przełącznik wspornik. JASON Hirschhorn: Przepraszam. PUBLICZNOŚCI: Zmień wspornik. JASON Hirschhorn: Więc jeśli to jest większa niż wartość. Bo to jest mylące z komentarz powyżej, mam zamiar zrobić. Ale tak. Jeśli nasza wartość jest mniejsza niż ta węzeł, co robimy? Och. Mam go tutaj. Włóż wcześniej. OK. Jak to robimy? PUBLICZNOŚCI: Czy to nadal ja? JASON Hirschhorn: Tak. PUBLICZNOŚCI: Ty - new_node-> następny. JASON Hirschhorn: Więc co jest że będzie równy? PUBLICZNOŚCI: To będzie równego prądu. JASON Hirschhorn: Dokładnie. I tak, z drugiej - co jeszcze trzeba aktualizować? PUBLICZNOŚCI: Sprawdź, czy przeszłość jest równa NULL. JASON Hirschhorn: Jeśli poprzednia - więc jeśli poprzednie równa NULL. PUBLICZNOŚCI: To znaczy, że będzie stać na czele. JASON Hirschhorn: To znaczy to się głowa. Więc co robimy? PUBLICZNOŚCI: Robimy głowę wynosi new_node. JASON Hirschhorn: szef równa new_node. I dlaczego udać tutaj, nie wymienić? PUBLICZNOŚCI: Ponieważ głowica jest globalnym zmienna, która jest punktem wyjściowym. JASON Hirschhorn: Słodkie. OK. I - PUBLICZNOŚCI: Wtedy robisz inny prev-> obok jest równa new_node. A potem wrócisz prawda. JASON Hirschhorn: Gdzie zrobić ustawiamy koniec new_node? PUBLICZNOŚCI: Chciałbym - Ustawić, że na początku. JASON Hirschhorn: Więc co linia? PUBLICZNOŚCI: Po if sprawdzenie, czy to wiadomo. JASON Hirschhorn: Tutaj? PUBLICZNOŚCI: Zrobiłbym new_node-> n równa się wartości. JASON Hirschhorn: Brzmi dobrze. Prawdopodobnie ma to sens - nie trzeba wiedzieć, co mamy na listy ponieważ mamy tylko do czynienia z jednej listy. Więc lepiej deklaracja funkcji dla jest to po prostu do tego pozbyć całkowicie i po prostu włóż Wartość w głowie. My nawet nie muszą wiedzieć co lista jesteśmy w. Ale będę go teraz i następnie zmienić ją na aktualizację slajdy i kod. Tak, że wygląda dobrze do teraz. Jeżeli jest to wartość - kto może zrobić ten wiersz? Jeśli - co robimy tutaj, Noah. PUBLICZNOŚCI: Jeżeli wartość jest większa niż curr-> n - JASON Hirschhorn: Jak zrobić możemy przejść do następnego węzła? PUBLICZNOŚCI: Bieżąca-> n równa new_node. JASON Hirschhorn: Tak n jaka część struktury? Całkowitą. I new_node jest wskaźnik do węzła. Więc to, co część podst powinniśmy aktualizować? Jeżeli nie dotyczy, to co jest druga część? Noe, co druga część. PUBLICZNOŚCI: Och, następny. JASON Hirschhorn: Następnie dokładnie. Dokładnie. Dalej jest słuszna. I co jeszcze musimy zaktualizować, Noah? PUBLICZNOŚCI: Wskaźniki. JASON Hirschhorn: Tak zaktualizowaliśmy prąd. PUBLICZNOŚCI: Poprzednia-> następny. JASON Hirschhorn: Tak. OK, my wstrzymać. Kto może nam pomóc? Manu, co powinniśmy zrobić? PUBLICZNOŚCI: Musisz ustawić jest równa podst-> Dalej. Ale nie, że przed poprzednim wierszu. JASON Hirschhorn: OK. Coś jeszcze? Akshar. PUBLICZNOŚCI: Nie sądzę, że jesteś Oznaczało zmienić curr-> Dalej. Myślę, że masz na myśli zrobić Curr równych curr-> Dalej, aby przejść do kolejnego węzła. JASON Hirschhorn: Przepraszam, gdzie? Na jakiej linii? Ta linia? PUBLICZNOŚCI: Tak. Dodać Curr równa curr-> następny. JASON Hirschhorn: Więc to jest prawidłowe ponieważ prąd jest wskaźnik do węzła. I chcemy, aby wskazywał na następny węzeł, co się obecnie wskazał. Sam Curr ma obok. Ale gdybyśmy zaktualizować curr.next, my będzie aktualizowanie rzeczywistego wiadomości Sam, nie tam, gdzie to wskaźnik wskazywał. Co na temat tej linii, choć. Avi? PUBLICZNOŚCI: Poprzednia-> następny równa Curr. JASON Hirschhorn: Więc jeszcze raz, jeśli poprzedni jest wskaźnik do węzła, poprzedni-> next jest Rzeczywisty wskaźnik w węźle. Tak więc byłoby aktualizowania wskaźnik w węźle na podst. Nie chcemy, aby zaktualizować wskaźnik w węźle. Chcemy, aby zaktualizować poprzedni. Więc jak to zrobić? PUBLICZNOŚCI: To po prostu się wstecz. JASON Hirschhorn: Prawo. Poprzednia jest wskaźnik do węzła. Teraz mamy go do zmiany nowy wskaźnik do węzła. OK Przejdźmy się. Wreszcie ten ostatni warunek. Jeff, co robimy tutaj? PUBLICZNOŚCI: Jeśli wartość jest równa Curr-> n. JASON Hirschhorn: Przepraszam. O mój Boże. Co? Value == curr-> n. Co robimy? PUBLICZNOŚCI: Można by uwolnić nasze new_node, a następnie chcesz return false. JASON Hirschhorn: To jest to, co pisaliśmy do tej pory. Czy ktoś ma coś dodać przed robimy? OK. Spróbujmy. Kontrola może dotrzeć do końca o nie pustego funkcji. Avi, co się dzieje? PUBLICZNOŚCI: Czy powinniśmy umieścić zwrot prawda na zewnątrz pętli while? JASON Hirschhorn: Nie wiem. Chcesz mnie? PUBLICZNOŚCI: Nieważne. Nie. JASON Hirschhorn: Akshar? PUBLICZNOŚCI: Myślę, że ma na celu umieścić return false na końcu z pętli while. JASON Hirschhorn: Więc gdzie chcesz to iść? PUBLICZNOŚCI: Podobnie jak na zewnątrz pętli. Więc jeśli wyjść z pętli while to oznacza , który już dobiega końca i nic się nie stało. JASON Hirschhorn: OK. Więc co robimy tutaj? PUBLICZNOŚCI: Ty return false również tam. JASON Hirschhorn: Och, zrobić to w obu miejscach? PUBLICZNOŚCI: Tak. JASON Hirschhorn: OK. Powinniśmy iść? O mój Boże. Przykro mi. Przepraszam ekranie. To trochę wariować na nas. Więc wybrać opcję. Zero, za kodem, kończy pracę programu. Jednym wstawia coś. Miejmy wstawić trzy. Wkładka nie jest skuteczne. Mam zamiar wydrukować. Nie mam nic. OK. Może to był tylko fuks. Włóż jedną. Nie udany. OK. Przyjrzyjmy się bardzo szybko przez GDB , aby sprawdzić, co się dzieje. Zapamiętaj gdb. / Nazwa Twojego Program robi nas w GDB. Jest to, że dużo do obsługi? Miga? Prawdopodobnie. Zamknij oczy i weź kilka głębokich oddechów jeśli znudzi patrzenia na niego. Jestem w GDB. Co jest pierwszą rzeczą, którą robię w GDB? Musimy dowiedzieć się, co tu się dzieje. Zobaczmy. Mamy sześć minut do figury się, co się dzieje. Złamać główny. I to co mam zrobić? Carlos? Uruchom. OK. Wybierzmy opcję. A co dotyczy zrobić? Następny. Tak. PUBLICZNOŚCI: Czy nie wspominając - czy nie powiedzieć, że szef, to był zerowane na początku. Ale myślałem, że powiedział, że było OK. JASON Hirschhorn: Chodźmy - spójrzmy w GDB, a następnie wrócimy. Ale to brzmi jak masz już kilka pomysłów na temat tego, co się dzieje. Dlatego chcemy, aby wstawić coś. OK. Mamy wstawić. Wprowadź int. Będziemy wkładać trzy. A ja jestem na tej linii. Jak mogę go uruchomić debugowanie Wkładka funkcji wiadomo? O mój Boże. To bardzo dużo. Jest to, że odbija dużo? PUBLICZNOŚCI: Och, to umarł. JASON Hirschhorn: Właśnie wyciągnął go. OK. PUBLICZNOŚCI: Może Drugi koniec przewodu. JASON Hirschhorn: Wow. Więc dolnej linii - Co powiedziałeś? PUBLICZNOŚCI: Powiedziałem ironia techniczne Trudności w tej klasie. JASON Hirschhorn: Wiem. Gdybym tylko miał kontrolę nad tą częścią. [Niesłyszalne] Brzmi świetnie. Dlaczego nie macie zacząć myśleć o Co mogliśmy zrobić źle, i będziemy z powrotem w ciągu 90 sekund. Avica, mam zamiar zapytać, jak go wewnątrz insert_node do debugowania. Tak to jest, gdzie ostatnio skończyliśmy. Jak mogę wejść do środka insert_node, Avica, aby sprawdzić, co się dzieje? Jakie polecenie GDB? Przerwa nie weźmie mnie do środka. Czy Marquise wiedzieć? PUBLICZNOŚCI: Co? Komenda Co GDB: JASON Hirschhorn Używam do środka tej funkcji? PUBLICZNOŚCI: Krok? JASON Hirschhorn: Krok za pośrednictwem S. To prowadzi mnie do środka. OK. New_node mallocing trochę miejsca. Że wszystko wygląda jak jego dzieje. Przeanalizujmy new_node. To ma jakiś adres pamięci. Sprawdźmy - , że jest poprawne. Więc wszystko wydaje się tu pracować poprawnie. PUBLICZNOŚCI: Jaka jest różnica między P i wyświetlacza? JASON Hirschhorn: P oznacza druku. A więc pytasz co Różnica między tym, co? W tym przypadku nic. Jednak na ogół są pewne różnice. I należy szukać w instrukcji GDB. Ale w tym przypadku nic. Mamy tendencję do korzystania drukiem, chociaż, ponieważ nie musimy zrobić o wiele więcej niż wydrukować jedną wartość. OK. Więc jesteśmy na linii 80 naszego kodu, Ustawienie węzła * Curr równą listy. Daj nam wydrukować Curr. To równa listę. Słodkie. Czekać. To równa się coś. To nie wydaje się słuszne. Nie idziemy. To dlatego, że w GDB, w prawo, jeśli Linia jest na nim jesteś jeszcze zrealizowane. Więc trzeba faktycznie wpisz przy wykonać linię przed widząc swoje wyniki. Więc jesteśmy. Właśnie wykonywane do tej linii poprzedni równa NULL. Więc jeszcze raz, jeśli drukujemy poprzedni nie zobaczymy coś dziwnego. Ale jeśli rzeczywiście wykonać, że linii, wtedy zobaczymy że linia pracowała. Więc mamy Curr. Są to zarówno dobre. Prawda? Teraz jesteśmy na tej linii tutaj. Podczas Curr nie równy null. A co robi Curr równe? Właśnie zobaczyłem, że wyniosła wartość null. Wydrukowaliśmy go. Będę go wydrukować ponownie. Tak jest, że podczas gdy pętla zamierza wykonać? PUBLICZNOŚCI: Nie. JASON Hirschhorn: Więc kiedy wpisane, że Linia, widzisz my skoczyliśmy na drodze do dołu, return false. A następnie jedziemy do return false i wrócić do naszego programu i ostatecznie wydrukować, jak widzieliśmy, Wkładka nie jest skuteczne. Tak więc, ktoś ma jakieś pomysły na to, co musimy zrobić, aby to naprawić? Będę czekać, dopóki nie zobaczę para rąk do góry. Nie wykona tego. Pamiętaj, że to był pierwszy co robimy. Nie zamierzam zrobić kilka. Mam zamiar zrobić kilka. Ponieważ para oznacza dwa. Będę czekać na więcej niż dwóch. Pierwsza wstawka, Curr, domyślnie jest równa NULL. I to pętla wykonuje tylko jeśli Curr nie jest null. Więc w jaki sposób można to obejść? Widzę trzy ręce. Będę czekać na więcej niż trzy. Marcus, co o tym myślisz? PUBLICZNOŚCI: Dobrze, jeśli jest to potrzebne, aby wykonać więcej niż jeden raz, po prostu zmień go na pętli do-while. JASON Hirschhorn: OK. Czy to rozwiąże nasz problem, choć? WIDOWNIA: W tym przypadku nie ma powodu Fakt, że lista jest pusta. Tak, to prawdopodobnie wystarczy dodać oświadczenie, że jeśli pętla wychodzi to musisz być na końcu list, w którym momencie ci może po prostu włóż go. JASON Hirschhorn: Podoba mi się. To ma sens. Jeśli pętla kończy - bo to return false tutaj. Więc jeśli wyjść pętlowych, to jesteśmy w koniec listy, a może początek listy, jeśli nie ma nic w to, co jest samo w końcu. Teraz chcemy wstawić coś tutaj. Więc w jaki sposób, że kod wygląda, Marcus? PUBLICZNOŚCI: Jeśli już masz węzeł malloced, można tylko powiedzieć, new_node-> następny równa wartości null, ponieważ musi znajdować się na końcu. Lub new_node-> obok jest równa NULL. JASON Hirschhorn: OK. Przepraszam. New_node-> następny równa wartości null dlatego, że jesteśmy na końcu. Że nie umieścić go w Jak możemy umieścić go na liście? Prawo. To jest po prostu ustawienie go równa. No jak mamy rzeczywiście umieścić go na liście? , Co wskazuje na koniec listy? PUBLICZNOŚCI: Kierownik. JASON Hirschhorn: Przepraszam? PUBLICZNOŚCI: Głowa jest skierowana na koniec listy. JASON Hirschhorn: Jeśli nic w lista, głowa jest skierowana do koniec listy. Tak, że będzie pracować dla Pierwsza wstawka. A co, jeśli istnieje kilka rzeczy na liście? Niż nie chcemy, aby ustawić głowy równa new_node. Co chcemy zrobić tam? Tak? Prawdopodobnie poprzedni. Czy to działa? Przypomnijmy, że poprzednia jest po prostu wskaźnik do węzła. I poprzedni jest zmienna lokalna. Tak więc ta linia będzie ustawić zmienną lokalną, poprzedniego, takie same lub wskazując tym nowym węźle. Że nie będzie faktycznie umieścić go na naszej liście, choć. Jak możemy umieścić go na naszej liście? Akchar? PUBLICZNOŚCI: Myślę, że ci nie aktualny-> następny. JASON Hirschhorn: OK. curr-> następny. Więc jeszcze raz, tylko dlatego, że jesteśmy w dół Oto, co robi prąd równy? PUBLICZNOŚCI: Równa wartość null. JASON Hirschhorn: I co z tego się stanie, jeśli mamy zerową-> następny? Co dostaniemy? Dostaniemy winy segmentacji. PUBLICZNOŚCI: Do Curr równa NULL. JASON Hirschhorn: To jest to samo, jak poprzednia, choć, bo jest zmienna lokalna jesteśmy ustawienie równa nowego węzła. Wróćmy do naszego obrazka wkładania czegoś. Powiedzieć, że jesteśmy na końcu wstawianie z listy, więc tutaj. Mamy wskaźnik, który jest aktualny wskazując na null i poprzedni punkt że to wskazuje na 8. Więc co trzeba zaktualizować, Avi? PUBLICZNOŚCI: Poprzednie-> następny? JASON Hirschhorn: Poprzednie-> next to, co chcemy zaktualizować, ponieważ to rzeczywiście wstawić go na Koniec listy. Mamy jeszcze jeden problem, choć, że mamy zamiar uruchomić na. Co to za błąd? Tak? PUBLICZNOŚCI: To będzie powrót fałszywe w tym przypadku? JASON Hirschhorn: Och, to jest będzie return false. Ale jest jeszcze jeden błąd. Więc musimy umieścić w zamian prawdziwą. PUBLICZNOŚCI: Czy poprzedni wciąż równa równe zeru na początku listy? JASON Hirschhorn: Więc poprzedni nadal równa wartości null na samym początku. Więc jak możemy się nad tym? Tak? PUBLICZNOŚCI: Myślę, że można zrobić test przed pętli while, aby zobaczyć, czy jest to pusta lista. JASON Hirschhorn: OK. Więc chodźmy tutaj. Czy czek. Jeśli - PUBLICZNOŚCI: Więc jeśli głowa równa jest równa NULL. JASON Hirschhorn: Jeśli szef równa jest równa wartości null - że będzie nam powiedzieć, czy jest to lista pusta. PUBLICZNOŚCI: A potem do głowy równa nowy. JASON Hirschhorn: szef równa new_node? I co jeszcze musimy zrobić? PUBLICZNOŚCI: A potem wrócisz prawda. JASON Hirschhorn: Nie całkiem. Brakuje nam jeden krok. PUBLICZNOŚCI: New_node następna ma wskazywać na wartość null. JASON Hirschhorn: Dokładnie, Alden. I wtedy możemy wrócić prawda. OK. Ale to wciąż dobry pomysł, aby robić rzeczy, Na koniec liście, tak? Dobrze. Nadal może rzeczywiście dostać na koniec listy. Więc jest to kod w porządku, czy jesteśmy w końcu listy, a są tacy, rzeczy na liście? Prawda? Ponieważ mamy jeszcze pojęcia, Marcusa. Możemy wyjść z pętli, ponieważ my na koniec listy. Więc nadal chcemy to kod tutaj? PUBLICZNOŚCI: Tak. JASON Hirschhorn: Tak. I co musimy zmienić to? Prawda. Czy to dobry dźwięk wszystkim do tej pory? Ktoś ma w ogóle - Avi, czy masz coś do dodania? PUBLICZNOŚCI: Nie. JASON Hirschhorn: OK. Więc zrobiliśmy kilka zmian. Zrobiliśmy tę kontrolę, zanim poszedł do pustej listy. Więc mamy załatwione pustej listy. I tu zadbał o wstawienie coś na koniec listy. Tak więc wydaje się, że podczas tej pętli podejmowania troska o rzeczy pomiędzy nimi, gdzie liście, jeżeli Są rzeczy na liście. OK. Daj nam uruchomić program ponownie. Nie udany. PUBLICZNOŚCI: Nie udało się. JASON Hirschhorn: Och, Nie udało się. Dobry punkt, Michael. Dodajmy markę związaną. Linia 87 jest błąd. Linia 87. Alden, był to linia, którą mi dałeś. Co jest nie tak? PUBLICZNOŚCI: To musi być null. JASON Hirschhorn: Doskonały. Dokładnie tak. Powinien być zerowy. Zróbmy jeszcze raz. Skompilować. OK. Miejmy wstawić trzy. Wkładka pomyślnie. Niech go wydrukować. Och, gdyby tylko mogli sprawdzić. Ale nie zrobiliśmy jeszcze funkcję drukowania. Miejmy wprowadzić coś innego. Co powinniśmy wprowadzić? PUBLICZNOŚCI: Siedem. JASON Hirschhorn: Siedem? PUBLICZNOŚCI: Tak. JASON Hirschhorn: Mamy awarię seg. Więc mamy jeden, ale wyraźnie nie może dostać dwa. Jest 05:07. Więc możemy debugować to przez trzy minuty. Ale mam zamiar zostawić nas tutaj i przenieść się do mieszania tabele. Ale znowu, odpowiedzi do tego kodu Ja e-mail do Ciebie za chwilę. Jesteśmy bardzo blisko. Gorąco zachęcam, aby dowiedzieć się co tu się dzieje i to naprawić. Więc ja ci email ten kod jako oraz Plus rozwiązanie - Prawdopodobnie roztwór później. Pierwszy to kod. Inna sprawa, chcę zrobić, zanim Wykończenie to nie mamy nic uwolniony. Tak, chcę pokazać, co valgrind wygląda. Jeśli prowadzimy granice valgrind w naszym programie. / powiązane. Ponownie, zgodnie z niniejszym suwaka, to Należy uruchomić valgrind z pewnego rodzaju Opcja, w tym przypadku - Sprawdzenie szczelności = pełna. Więc napisz valgrind - Sprawdzenie szczelności = pełna. Więc to będzie działać valgrind w naszym programie. A teraz program rzeczywiście działa. Więc mamy zamiar uruchomić go jak przed, umieścić coś w. Mam zamiar umieścić w trzech. Że działa. Nie zamierzam spróbować umieścić w coś indziej, bo mamy zamiar uzyskać fałszywe seg w tej sprawie. Więc mam zamiar rzucić. A teraz widzisz tutaj wyciek i podsumowanie kupa. To są dobre rzeczy, które chcesz sprawdzić. Więc podsumowanie kupa - mówi, w użyciu na wyjeździe - osiem bajtów w jednym bloku. Że jest jeden blok węzeł my malloced. Michael, powiedział przed węzeł jest osiem ukąszenia ponieważ ma całkowitą i wskaźnik. Więc to jest nasz węzeł. A potem mówi, że stosowany malloc siedem razy i jesteśmy uwolnieni coś sześć razy. Ale nigdy nie nazywa darmo, więc nie mam pomysł, co to mówi. Ale wystarczy powiedzieć, że gdy uruchamia program, nazywany jest malloc w innych miejscach, które nie muszą się martwić. Prawdopodobnie tak zwane malloc w niektórych miejscach. Nie musimy się martwić, gdzie. Ale to jest naprawdę z nami. To pierwsza linia jest nam. Zostawiliśmy tego bloku. I widać, że tutaj w podsumowaniu nieszczelności. Nadal osiągalny - osiem bajtów w jednym bloku. Oznacza to, że pamięć - mamy wyciekły że pamięć. Zdecydowanie stracił - coś jest stracone na zawsze. Ogólnie rzecz biorąc, nie będzie zobaczyć coś tam. Wciąż dostępny jest na ogół, w których zobaczysz rzeczy, w którym będziesz chciał szukać, aby zobaczyć co kodu należy zostały uwolnione, ale zapomniałeś uwolnić. A jeśli to nie był przypadek, jeśli wszystko zrobiliśmy bezpłatny, możemy sprawdzić, że. Po prostu uruchom program nie wprowadzenie niczego. Zobaczysz tu w użyciu na wyjeździe - zerowych bajtów zerowych bloków. Oznacza to, że nie mieliśmy nic w lewo gdy program ten odszedł. Więc przed włączeniem w pset6 uruchom valgrind i upewnij się, że nie mają wszelkie przecieki pamięci w programie. Jeśli masz jakieś pytania z Valgrind, tutaj dotrzeć. Ale to, jak go używać. Bardzo prosta - sprawdzić, czy mieć używane na wyjeździe - żadnych bajtów jakichkolwiek bloków. Więc pracowaliśmy na węźle wkładki. Miałem dwie inne funkcje tutaj - wydrukować i wolnych węzłów węzły. Ponownie, są to funkcje, które są będzie dobre, aby ćwiczyć ponieważ będą one pomóc nie tylko z Te przykładowe ćwiczenia, ale również na problem ustawienia. Są mapy na dość ściśle do rzeczy będziesz musiał zrobić w ustawić problemem. Ale chcę się upewnić, dotykamy na wszystko. I tabele mieszania są również istotne, aby co robimy w tej sekcji tygodniu - lub w zestawie problemów. Więc mamy zamiar zakończyć sekcję mówić o tablicach hash. Jeśli zauważysz, że wykonane mała tabela hash. To nie jest to, co mówimy o jednak. Mówimy o różne typ tabel hash. I w swojej podstawowej, tabeli mieszania jest niczym więcej niż Tablica oraz funkcja skrótu. Mamy zamiar rozmawiać na nieco tylko upewnij się, że wszyscy rozumieją, co to funkcja skrótu jest. I mówię ci teraz, że jest to niczym więcej niż dwóch rzeczy - Tablica i funkcja skrótu. I tutaj są kroki poprzez których działa. Tam jest nasza tablica. Tam jest nasza funkcja. W szczególności funkcje mieszania konieczne zrobić kilka rzeczy z tym. Idę porozmawiać konkretnie o ustawić ten problem. To prawdopodobnie będzie podjąć w ciągu. I co idzie do powrotu? Jaki typ danych? Alden? Twoja funkcja skrótu wrócić? Całkowitą. Więc to jest to, co hash Tabela zawiera - Tabela w postaci macierzy i funkcja skrótu. Jak to działa? Działa się w trzech etapach. Dajemy mu klucz. W tym przypadku, damy mu ciąg. Nazywamy funkcję mieszania na etapie jednego na klucz i otrzymujemy wartość. Konkretnie, to mówimy, otrzymujemy liczbę całkowitą. To całkowitą, są bardzo specyficzne granice tego, co może być, że liczba całkowita. W tym przykładzie, nasze Tablica jest wielkości trzech. Więc co można, że ​​liczba jest liczbą całkowitą. Jaki jest zakres prawidłowych wartości że całkowita, powrót tego typu funkcji skrótu? Zero, jeden i dwa. Punkt funkcji skrótu jest dowiedzieć się miejsce w tablicy gdzie nasz klucz będzie. Istnieją tylko trzy możliwe miejsca tutaj - zero, jeden lub dwa. Więc lepiej powrót tej funkcji zero, jeden lub dwa. Niektóre ważne Indeks w tej tablicy. , A następnie w zależności od miejsca zwraca, widać tam tablicę otwarty wspornik wartość. To miejsce, gdzie możemy umieścić klucz. Więc rzucać w dyni, dostać się do zera. Na wsporniku tablicy 0, kładziemy dyni. Rzucamy w kotów, wyjdziemy jeden. Kładziemy kota w jednym. Włożyliśmy w pająka. Wyjdziemy dwa. Kładziemy pająk na wsporniku tablicy dwa. Byłoby miło, gdyby to działało tak. Ale niestety, jak zobaczymy, jest to nieco bardziej skomplikowane. Zanim tam dotrzemy, wszelkie pytania o ten podstawowy set-up z tabeli mieszania? To jest obraz dokładnie co narysował na tablicy. Ale od kiedy wyciągnął go na płycie, ja nie zamierzam iść do niego dalej. Zasadniczo klucze, magia czarna skrzynka - czy w tym przypadku pole morski - z funkcja skrótu umieszcza je w wiadrach. I w tym przypadku mamy nie wprowadza nazwy. Stawiamy skojarzony telefon liczba nazwą w wiadrze. Ale może po prostu bardzo dobrze umieścić nazwę w wiadrze. To jest po prostu obraz tego, co zwróciliśmy na pokładzie. Mamy potencjalnych pułapek, choć. I tam w szczególności są dwa slajdy, że chcę przejść. Pierwszym z nich jest o funkcja skrótu. Poprosiłem więc pytanie, co robi dobre funkcji skrótu? I dać dwie odpowiedzi. Pierwszym jest to, że jest deterministyczny. W kontekście funkcji mieszających, co to znaczy? Tak? PUBLICZNOŚCI: Można go znaleźć Indeks w stałym czasie? JASON Hirschhorn: To nie jest, co to znaczy. Ale to dobre przypuszczenie. Ktoś jeszcze ma zgadywać się, co to oznacza? Że dobra funkcja skrótu jest deterministyczny? Annie? PUBLICZNOŚCI: To klucz można przypisać tylko do jednego miejsca w tabeli mieszania. JASON Hirschhorn: To Dokładnie tak. Za każdym razem można umieścić w dyni, zawsze zwraca zero. Jeśli umieścisz w dyni i swojej hash Funkcja zwraca zero, ale ma prawdopodobieństwo powrotu coś jeszcze większe niż zero - więc może to powrót jednego czasem lub dwa inne czasy - to nie jest dobry funkcji skrótu. Masz całkowitą rację. Twoja funkcja skrótu powinna wrócić dokładnie takie same całkowite, w tym przypadku, na dokładnie taki sam ciąg znaków. Może to zwraca dokładnie taki sam całkowitą w tym samym dokładnie ciąg niezależnie od kapitalizacji. Ale w tym przypadku jest to nadal deterministyczny, ponieważ wiele rzeczy, są odwzorowywane na tę samą wartość. To dobrze. Tak długo, jak jest tylko jeden Moc dla danego wejścia. OK. Drugą rzeczą jest to, że zwraca ważnych wskaźników. Przywieźliśmy się, że wcześniej. Ta funkcja skrótu - O rany - funkcja skrótu powinna powrót ważnych wskaźników. Tak powiedzieć - wróćmy do tego przykładu. Moja funkcja skrótu liczy się litery w słowie. To jest funkcja skrótu. I zwraca, że ​​całkowitą. Więc jeśli mam tego słowa, to jest zamierza powrócić jedna. I to się umieścić tutaj. Co zrobić, jeśli umieścić w nietoperza słowo? To będzie powrót trzy. Gdzie nietoperz iść? To nie pasuje. Ale to musi gdzieś iść. To jest mój tabeli mieszania po wszystkim, i wszystko musi gdzieś iść. Więc gdzie należy bat iść? Wszelkie myśli? Zgaduje? Dobre domysły? PUBLICZNOŚCI: zero. JASON Hirschhorn: Dlaczego zera? PUBLICZNOŚCI: Ponieważ trzy modulo trzy jest zero? JASON Hirschhorn: Trzy modulo trzy zero. To jest wielki przypuszczenie, i to jest prawidłowe. Tak więc w tym przypadku powinno Prawdopodobnie go na zero. Tak dobry sposób, aby upewnić się, że ten hash Funkcja zwraca tylko ważnych wskaźników jest modulo go do rozmiaru tablicy. Jeśli modulo cokolwiek to powroty przez trzy, jesteś zawsze dostanie coś od zera, jeden i dwa. I jeśli to zawsze zwraca siedem, a zawsze modulo przez trzy, jesteś zawsze dostanie to samo. Więc to jeszcze deterministyczny jeśli modulo. Ale zapewnia, że ​​ci nigdy nie dostać coś - nieważne przemysł. Generalnie powinno się zdarzyć, że modulo wewnątrz funkcji skrótu. Więc nie musisz się o to martwić. Musisz tylko upewnić się, że może to jest ważne Indeks. Wszelkie pytania na ten temat potencjalna pułapka? OK. I tam idziemy. Następna potencjalna pułapka, i to jest wielki. Co zrobić, jeśli dwa klucze mapę do tej samej wartości? Tak więc istnieją dwa sposoby, aby sobie z tym poradzić. Pierwszy z nich nazywany jest liniowa sondowania, który jestem nie pójdzie na. Ale należy zapoznać się z tym, jak to działa i co to jest. Drugi mam zamiar iść na ponieważ jest to, że wielu osób będzie prawdopodobnie w końcu decydując do stosowania w ich zestawie problemów. Oczywiście, że nie trzeba. Ale za zestaw problemów, wielu ludzi mają tendencję do wyboru, aby utworzyć tabeli mieszania z oddzielnym łańcuchowych do realizacji ich słowniku. Więc mamy zamiar iść na to, co to znaczy do tworzenia tabeli mieszania z oddzielne łańcuchowym. Więc umieścić w dyni. Zwraca zero. I umieścić tutaj dyni. Następnie umieścić w - co jest kolejnym Halloween tematyczne rzecz? PUBLICZNOŚCI: Cukierki. JASON Hirschhorn: Cukierki! To jest wielki. I umieścić w cukierki i słodycze również daje mi zero. Co mam zrobić? Jakieś pomysły? Bo wszystko jakby wiedzieć Łańcuchy, co jest oddzielne. Więc jakieś pomysły, co robić? Tak. PUBLICZNOŚCI: Putting ciąg faktycznie w tabeli mieszania. JASON Hirschhorn: Więc idziemy do narysować dobry pomysł tutaj. OK. PUBLICZNOŚCI: Czy hashtable [Niesłyszalne] wskaźnik, który wskazuje na początek listy. A potem już dynia być pierwsza wartość w tej połączonej listy i cukierki być Druga wartość w tym połączonej listy. JASON Hirschhorn: OK. Marcus, który był znakomity. Mam zamiar złamać to. Marcus mówi nie nadpisać dyni. To byłoby złe. Nie wkładać słodycze gdzieś indziej. Mamy zamiar umieścić je zarówno na zero. Ale my jedziemy do czynienia z umieszczając je na zero tworzenie listy na zero. I mamy zamiar utworzyć listę wszystko to odwzorowane na zero. A najlepszym sposobem dowiedzieliśmy się, aby stworzyć lista, które mogą rosnąć i kurczyć dynamicznie nie jest w kolejna tablica. Więc nie wielowymiarowa tablica. Ale po prostu stworzyć połączonej listy. Więc to, co zaproponował - Mam zamiar dostać nowy - jest utworzenie tablicy ze wskaźnikami, Tablica wskaźników. OK. Każdy pomysł lub wskazówkę co typ z tym wskaźniki powinny być? Marcus? PUBLICZNOŚCI: Wskaźniki do - JASON Hirschhorn: bo powiedział powiązana lista, więc - PUBLICZNOŚCI: wskaźniki węzła? JASON Hirschhorn: wskaźniki węzła. Jeśli to, co w naszym powiązane Lista węzłów, a następnie są one Wskaźniki powinny być węzeł. I co one równe początkowo? PUBLICZNOŚCI: Null. JASON Hirschhorn: Null. Więc jest nasz pusty rzeczą. Powraca dyni zera. Co robimy? Spacer mnie przez to? Właściwie, już mi dał Marcus. Ktoś chodzić mnie przez to. Co robimy, gdy - to wygląda bardzo podobnie do co nam po prostu robi. Avi. PUBLICZNOŚCI: zamierzam zgadywać. Więc kiedy dostaniesz cukierka. JASON Hirschhorn: Tak. Cóż, mamy dyni. Chodźmy nasz pierwszy. Mamy dyni. PUBLICZNOŚCI: OK. Powraca dyni zera. Więc umieścić go w tym. Albo rzeczywiście, można umieścić go w połączonej listy. JASON Hirschhorn: Jak możemy umieścić go w połączonej listy? PUBLICZNOŚCI: Och, rzeczywista składnia? JASON Hirschhorn: Wystarczy chodzić - powiedzieć więcej. Co robimy? PUBLICZNOŚCI: Wystarczy włożyć że jako pierwszy węzeł. JASON Hirschhorn: OK. Więc mamy węzła, dynia. A teraz jak mam włożyć? PUBLICZNOŚCI: przypisać to do wskaźnika. JASON Hirschhorn: Który wskaźnik? PUBLICZNOŚCI: wskaźnik na zero. JASON Hirschhorn: Więc gdzie robi to sens? PUBLICZNOŚCI: na null teraz. JASON Hirschhorn: No to wskazuje na null. Ale Kładę w dyni. Więc gdzie powinien wskazywać? PUBLICZNOŚCI: Aby dynia. JASON Hirschhorn: Aby dyni. Dokładnie. Więc to wskazuje na dyni. A gdzie ten wskaźnik w pkt dyni? Do PUBLICZNOŚCI: Null. JASON Hirschhorn: null. Dokładnie. Więc po prostu coś dodaje w połączonej listy. Po prostu napisał ten kod, aby to zrobić. Prawie że prawie mam całkowicie popękane. Teraz włóż cukierki. Nasz cukier przechodzi również do zera. Więc co zrobimy z cukierkami? PUBLICZNOŚCI: To zależy od tego, czy nie staramy się go rozwiązać. JASON Hirschhorn: To Dokładnie tak. To zależy od tego, czy staramy się go rozwiązać. Załóżmy, że nie jesteśmy zamiar go rozwiązać. PUBLICZNOŚCI: No to, jak mówiliśmy przed najprościej po prostu umieścić go zaraz na początku, więc wskaźnik od zera punktów do cukierków. JASON Hirschhorn: OK. Trzymaj się. Pozwólcie mi tworzyć cukierki tutaj. Więc ten wskaźnik - PUBLICZNOŚCI: Tak, powinno się teraz być skierowane do cukierków. Wtedy wskaźnik z punkt cukierków do dyni. JASON Hirschhorn: Jak to? I powiedzieć, że ma inny co do map do zera? PUBLICZNOŚCI: Cóż, po prostu zrobić to samo? JASON Hirschhorn: Czy to samo. Więc w tym przypadku, jeśli tego nie zrobimy Aby zachować to rozwiązywało problem Brzmi dość proste. Bierzemy wskaźnik w Indeks podane przez nas funkcji skrótu. Mamy ten punkt do naszego nowego węzła. A potem, co to było, wskazując wcześniej - w tym przypadku wartości null, w Drugi przypadek dyni - , że bez względu na to, wskazując na poprzednio, dodajemy do najbliższych nasz nowy węzeł. Jesteśmy wkładając coś na początku. W rzeczywistości jest dużo prostsze starając się zachować listę posortowane. Ale znowu, wyszukiwanie będzie bardziej skomplikowane tutaj. Będziemy zawsze iść do końca. OK. Wszelkie pytania dotyczące odrębnej łańcuchowych? Jak to działa? Poproś ich teraz. Naprawdę chcę, aby upewnić się, że wszystkie to zrozumieć, zanim głowę. PUBLICZNOŚCI: Dlaczego szuka dyni i cukierki na sam część tabeli mieszania? JASON Hirschhorn: Dobre pytanie. Dlaczego je w ten sam część tabeli mieszania? Cóż, w tym przypadku nasza funkcja skrótu zwraca zero dla obu z nich. Więc trzeba iść na Indeks zera bo tam będziemy ich szukać, jeśli kiedykolwiek chcą wyglądać ich. Ponownie, z podejściem liniowym sondowania nie byłoby im postawić zarówno na zero. Jednak w oddzielnym podejście łańcuchowej mamy zamiar umieścić je zarówno na zero a następnie utworzyć listę od zera. A my nie chcemy nadpisywać dyni po prostu za to, bo wtedy będziemy Zakładamy, że dynia była nie dodaje. Jeśli tylko zachować jedną rzecz w Lokalizacja, że ​​byłoby źle. Wtedy nie byłoby szans z nas kiedykolwiek - jeśli kiedykolwiek miał duplikat, wtedy po prostu wymazać naszą wartość początkową. Więc dlatego robimy to podejście. Albo dlatego, że wybraliśmy - ale znowu, my wybrał osobne podejście łańcuchowym, którym istnieje wiele innych metod można wybrać. Czy to wyjaśniło Twoje pytanie? OK. Carlos. Sondowanie liniowe wiązałoby - gdy okazało się, kolizji na zero, to będzie wyglądać w następnym miejscu, aby sprawdzić, czy był otwarty i umieścić go tam. A następnie przyjrzymy się w następnym sportu i patrz, czy to był otwarty i umieścić go tam. Więc znaleźć następny dostępny otwarte miejsce i umieścić go tam. Wszelkie inne pytania? Tak, Avi. PUBLICZNOŚCI: W następstwie, że co masz na myśli przez następnego miejscu? W tabeli mieszającej lub w połączonym listy. JASON Hirschhorn: Dla liniowych programowanie, nie związane listy. Kolejnym miejscem, w tabeli mieszania. PUBLICZNOŚCI: OK. Więc tabeli mieszania będzie inicjowane wielkości - jak liczba łańcuchów które zostały wstawiania? JASON Hirschhorn: Chciałabyś ma to być naprawdę duże. Tak. Oto obraz tego, co tylko zwrócił na pokładzie. Znów mamy kolizję tutaj. na 152. A zobaczysz, stworzyliśmy linked list od niego. Ponownie, tabela hash oddzielne łańcuchowym Podejście to nie jest ten, który wziąć na zestaw problemów sześciu ale który Wiele studenci mają tendencję do. Więc na tej notatce, niech nam krótko porozmawiać przed ruszamy się o problemie sześć, i wtedy będę dzielić historię z tobą. Mamy trzy minuty. Problem ustawić sześć. Masz cztery funkcje - obciążenia, sprawdzić, rozmiar i wyładować. Obciążenia - dobrze, że już się dzieje na obciążenia już teraz. Mamy zwrócił ładunek na pokładzie. I nawet zaczął dużo kodowania wstawienie do połączonej listy. Więc obciążenie nie jest dużo więcej niż to, co właśnie robi. Sprawdź to, gdy już coś załadowany. To taki sam proces jak ten. Te same dwie pierwsze części, gdzie rzucasz coś do funkcji skrótu i uzyskać jego wartość. Ale teraz nie jesteśmy włożeniem. Teraz szukamy dla niego. Mam przykładowy kod napisany dla znalezienia coś w połączonej listy. Zachęcam do praktykowania tego. Ale coś jest intuicyjnie znaleźć całkiem podobna do wkładania czegoś. Rzeczywiście, narysował znalezieniu coś w połączonej listy, przenosząc przez aż dotarł do końca. A jeśli masz do końca i nie mógł go znaleźć, to nie ma. Więc to jest sprawdzenie, w istocie. Dalej jest rozmiar. Pomińmy rozmiar. Wreszcie masz rozładować. Rozładunek jest nie dowie na pokładzie lub jeszcze zakodowany. Ale zachęcam do spróbować kodowania w naszym przykładzie próbki połączonej listy. Ale rozładować intuicyjnie jest podobna do free - czy to znaczy jest podobny do sprawdzenia. Z wyjątkiem teraz za każdym razem masz zamiar dzięki, nie jesteś po prostu sprawdzenie się czy masz tam swoją wartość. Ale bierzesz tego węzła i zwalniając go, w istocie. To wyładować prosi zrobić. Bezpłatne wszystko już malloced. Więc masz zamiar całej listy ponownie, przechodząc przez cały hash Tabela ponownie. Tym razem nie sprawdza aby zobaczyć, co tam jest. Wystarczy zwolnić, co tam jest. I wreszcie rozmiar. Rozmiar powinien być realizowany. Jeśli nie wdrożyć rozmiar - Powiem to tak. Jeśli nie w dokładnie realizować rozmiar jednej linii kodu w tym powrót oświadczenie, jesteś robi rozmiar nieprawidłowo. Więc upewnij się, że wielkość, do pełnego projektu punktów, robisz to w dokładnie jednym linii kodu, w tym instrukcja return. I nie pakować się jeszcze, Akchar. Chętny bóbr. Chciałem podziękować wam za przybycie do sekcji. Mają Happy Halloween. To jest mój kostium. Będę sobie to w czwartek gdy widzę cię w godzinach urzędowania. A jeśli jesteś ciekaw kilka tło, jak do tego stroju, czuć do zapoznania się z 2011 punkt do opowieści o tym, dlaczego jestem na sobie kostium dyni. I to jest smutna historia. Więc upewnij się, że w pobliżu niektórych tkankach. Ale na tym, jeśli masz jakiekolwiek pytania, będę trzymać się poza po sekcji. Powodzenia na problemu ustawić sześć. I jak zawsze, jeśli masz jakiekolwiek pytania, daj mi znać.