[Powered by Google Translate] [Phần 6] [thoải mái hơn]
[Rob Bowden] [Đại học Harvard]
[Đây là CS50.] [CS50.TV]
>> Chúng tôi có thể đi đến phần câu hỏi của chúng tôi.
Tôi đã gửi các URL cho không gian trước.
Sự khởi đầu của phần trong những câu hỏi nói-
dường như tôi không hoàn toàn unsick là một câu hỏi rất dễ dàng
chỉ là những gì được valgrind?
Valgrind làm gì?
Bất cứ ai muốn nói những gì valgrind không?
[Sinh viên] Kiểm tra rò rỉ bộ nhớ.
Yeah, valgrind là một kiểm tra bộ nhớ chung.
Nó, cuối cùng, cho bạn biết nếu bạn có bất kỳ rò rỉ bộ nhớ,
mà chủ yếu là những gì chúng ta đang sử dụng nó bởi vì nếu bạn muốn
làm tốt trong các thiết lập vấn đề hoặc nếu bạn muốn
có được trên bảng lớn, bạn cần phải có không có rò rỉ bộ nhớ nào,
và trong trường hợp bạn có một rò rỉ bộ nhớ mà bạn không thể tìm thấy,
cũng ghi nhớ rằng bất cứ khi nào bạn mở một tập tin
và nếu bạn không đóng nó, đó là một rò rỉ bộ nhớ.
>> Rất nhiều người đang tìm kiếm một số nút mà họ không giải phóng
khi thực sự, họ không đóng từ điển trong bước đầu tiên.
Nó cũng cho bạn nếu bạn có bất kỳ không hợp lệ lần đọc hoặc viết,
có nghĩa là nếu bạn cố gắng và đặt một giá trị
đó là vượt ra ngoài cuối của heap và nó không xảy ra lỗi seg
nhưng valgrind bắt nó, như bạn nên không thực sự được viết ở đó,
và như vậy chắc chắn bạn không nên có bất kỳ của những người hoặc.
Làm thế nào để bạn sử dụng Valgrind?
>> Đó là một câu hỏi chung của
loại chạy nó và nhìn vào đầu ra.
Sản lượng áp đảo rất nhiều lần.
Ngoài ra còn có lỗi thú vị mà nếu bạn có một số điều khủng khiếp sai
xảy ra trong vòng một, sau đó nó sẽ nói, "Cách quá nhiều lỗi.
Tôi sẽ ngừng đếm. "
Đó là cơ bản văn bản đầu ra mà bạn phải phân tích.
Cuối cùng, nó sẽ cho bạn bất kỳ rò rỉ bộ nhớ mà bạn có,
bao nhiêu khối, mà có thể là hữu ích vì
nếu nó một khối unfreed, sau đó nó thường dễ dàng hơn để tìm
hơn 1.000 khối unfreed.
1.000 khối unfreed có thể có nghĩa là bạn không giải phóng
danh sách của bạn liên kết thích hợp hoặc một cái gì đó.
Đó là valgrind.
>> Bây giờ chúng tôi có phần câu hỏi của chúng tôi,
mà bạn không cần phải tải về.
Bạn có thể bấm vào tên của tôi và kéo chúng lên trong không gian.
Bây giờ bấm vào tôi.
Phiên bản 1 sẽ là chồng, mà chúng tôi đang làm 1.
Phiên bản 2 sẽ là hàng đợi, và sửa đổi 3 sẽ là danh sách liên kết đơn lẻ.
Bắt đầu với stack của chúng tôi.
Như nó nói ở đây, một chồng là một trong những cơ bản nhất,
cấu trúc dữ liệu cơ bản của khoa học máy tính.
Ví dụ rất nguyên mẫu là
ngăn xếp của các khay trong phòng ăn.
Đó là cơ bản bất cứ khi nào bạn đang được giới thiệu với một chồng,
người nào đó sẽ nói: "Ồ, như một chồng các khay."
Bạn sắp xếp các khay.
Sau đó, khi bạn đi để kéo một cái khay,
khay đầu tiên nhận được kéo là một trong những cuối cùng đã được đặt trên stack.
Stack cũng như nó nói ở đây
chúng tôi có các phân đoạn của bộ nhớ được gọi là ngăn xếp.
Và tại sao nó được gọi là ngăn xếp?
>> Bởi vì giống như một cấu trúc dữ liệu ngăn xếp,
nó đẩy bật các khung stack trên stack,
nơi mà các khung stack giống như một cuộc gọi cụ thể của một hàm.
Và như một chồng, bạn sẽ luôn luôn phải quay trở lại
từ một cuộc gọi chức năng trước khi bạn có thể nhận được vào các khung stack thấp hơn một lần nữa.
Bạn không thể có chính thanh cuộc gọi cuộc gọi foo và trở về thanh chính trực tiếp.
Nó luôn luôn có để thực hiện theo các ngăn xếp chính xác và đẩy popping.
Hai hoạt động, như tôi đã nói, là push và pop.
Đó là những thuật ngữ phổ quát.
Bạn nên biết push và pop về các ngăn xếp không có vấn đề gì.
Chúng ta sẽ thấy hàng đợi là loại khác nhau.
Nó không thực sự có một thuật ngữ phổ quát, nhưng push và pop phổ quát cho ngăn xếp.
Đẩy chỉ cần đặt trên stack.
Pop là lấy ra khỏi ngăn xếp.
Và chúng ta thấy ở đây chúng tôi có typedef struct stack của chúng tôi,
vì vậy chúng tôi có chuỗi char **.
Đừng sợ hãi bởi bất kỳ **.
Điều này sẽ là một mảng của chuỗi
hoặc một mảng của các con trỏ ký tự,
con trỏ với các nhân vật có xu hướng được chuỗi.
Nó không có được chuỗi, nhưng ở đây, họ sẽ được chuỗi.
>> Chúng tôi có một mảng của chuỗi.
Chúng tôi có một kích thước, đại diện cho bao nhiêu yếu tố này là trên stack,
và sau đó chúng tôi có khả năng, mà là nhiều yếu tố có thể được trên stack.
Năng lực nên bắt đầu như là một cái gì đó lớn hơn 1,
nhưng kích thước sẽ bắt đầu như là 0.
Bây giờ, về cơ bản có ba cách khác nhau bạn có thể nghĩ một chồng.
Vâng, có lẽ nhiều hơn, nhưng hai cách chính
bạn có thể thực hiện nó bằng cách sử dụng một mảng, hoặc bạn có thể thực hiện nó bằng cách sử dụng một danh sách liên kết.
Danh sách liên kết là loại tầm thường để làm cho ngăn xếp từ.
Nó rất dễ dàng để tạo ra một ngăn xếp bằng cách sử dụng danh sách liên kết,
vì vậy ở đây, chúng tôi sẽ làm cho một chồng sử dụng các mảng,
và sau đó sử dụng các mảng, có cũng có hai cách bạn có thể suy nghĩ về nó.
Trước đây, khi tôi nói rằng chúng ta có một năng lực cho stack,
vì vậy chúng tôi có thể phù hợp với một phần tử trên stack.
>> Là một trong những cách có thể xảy ra ngay sau khi bạn nhấn 10 yếu tố, sau đó bạn đang thực hiện.
Bạn có thể biết rằng có một ràng buộc trên của 10 điều trên thế giới
mà bạn sẽ không bao giờ có hơn 10 điều trên stack của bạn,
trong trường hợp đó, bạn có thể có một trên ràng buộc về kích thước của ngăn xếp của bạn.
Hoặc bạn có thể có ngăn xếp của bạn không bị chặn,
nhưng nếu bạn đang làm một mảng, mà có nghĩa là mỗi lần duy nhất, bạn nhấn 10 yếu tố,
sau đó bạn sẽ phải tăng lên 20 phần tử, và khi bạn nhấn 20 phần tử,
bạn sẽ phải phát triển mảng của bạn 30 yếu tố hoặc 40 yếu tố.
Bạn sẽ cần phải tăng cường năng lực, đó là những gì chúng tôi đang làm ở đây.
Mỗi lần duy nhất chúng tôi đạt đến kích thước tối đa của ngăn xếp của chúng tôi,
khi chúng ta đẩy một cái gì đó khác trên, chúng ta sẽ cần phải tăng cường năng lực.
Ở đây, chúng tôi đã đẩy khai báo là đẩy bool (char * str).
Char * str là chuỗi mà chúng ta đang đẩy vào stack,
và bool chỉ nói rằng cho dù chúng tôi đã thành công hay thất bại.
>> Làm thế nào chúng ta có thể thất bại?
Trường hợp duy nhất mà bạn có thể nghĩ là gì
nơi chúng tôi sẽ cần phải quay trở lại sai?
Yeah.
[Sinh viên] Nếu nó đầy đủ và chúng tôi đang sử dụng một thực hiện giáp.
Yeah, vì vậy làm thế nào để chúng ta xác định anh ta trả lời
nếu nó đầy đủ và chúng tôi đang sử dụng một thực hiện bị chặn.
Sau đó, chúng tôi chắc chắn sẽ trở lại sai.
Ngay khi chúng tôi đạt 10 điều trong mảng, chúng ta không có thể phù hợp với 11, do đó, chúng tôi quay trở lại sai.
Điều gì sẽ xảy ra nếu nó bị chặn? Yeah.
Nếu bạn không thể mở rộng mảng cho một số lý do.
Yeah, vì vậy bộ nhớ là một nguồn lực hạn chế,
và cuối cùng, nếu chúng ta giữ cho mọi thứ đẩy vào stack hơn và hơn nữa,
chúng tôi sẽ cố gắng và cấp phát một mảng lớn hơn để phù hợp với
công suất lớn hơn, và malloc hoặc bất cứ điều gì mà chúng ta đang sử dụng sẽ trả về false.
, Malloc sẽ trả về null.
>> Hãy nhớ rằng, mỗi lần duy nhất bạn đã bao giờ gọi malloc, bạn nên được kiểm tra để xem nếu nó
trả về null hoặc người nào khác đó là một trích đúng đắn.
Vì chúng ta muốn có một ngăn xếp không bị chặn,
trường hợp duy nhất chúng ta sẽ được trở về sai là nếu chúng ta cố gắng
tăng cường năng lực và malloc hoặc bất cứ điều gì trả về false.
Sau đó, cửa sổ pop không có đối số,
và nó trả về chuỗi đó là trên đỉnh của ngăn xếp.
Dù gần đây đã được đẩy vào ngăn xếp là gì pop đang trở lại,
và nó cũng có thể loại bỏ nó khỏi stack.
Và nhận thấy rằng nó trả về null nếu không có gì trên stack.
Nó luôn luôn là có thể ngăn xếp là sản phẩm nào.
Trong Java, nếu bạn đang sử dụng đó, hoặc các ngôn ngữ khác,
cố gắng để bật từ một ngăn xếp rỗng có thể gây ra một ngoại lệ hoặc một cái gì đó.
>> Nhưng trong C, null là loại của rất nhiều các trường hợp làm thế nào chúng ta xử lý những vấn đề này.
Quay trở lại null là làm thế nào chúng ta sẽ biểu rằng ngăn xếp rỗng.
Chúng tôi đã cung cấp mã mà sẽ kiểm tra chức năng ngăn xếp của bạn,
thực hiện đẩy và pop.
Đây không phải là rất nhiều mã.
Tôi sẽ thực sự, trước khi chúng tôi làm điều đó, gợi ý, gợi ý-
nếu bạn không nhìn thấy nó, malloc không phải là chức năng duy nhất
cấp phát bộ nhớ trên heap cho bạn.
Có một gia đình của các chức năng alloc.
Đầu tiên là malloc, mà bạn đang sử dụng để.
Sau đó có calloc, làm điều tương tự như malloc,
nhưng nó sẽ không ra tất cả mọi thứ cho bạn.
Nếu bạn đã bao giờ muốn để thiết lập tất cả mọi thứ để null sau khi mallocing một cái gì đó
bạn cần phải có chỉ được sử dụng calloc ở nơi đầu tiên thay vì viết
một vòng lặp không ra toàn bộ khối bộ nhớ.
>> Realloc như malloc và có rất nhiều trường hợp đặc biệt,
nhưng về cơ bản realloc làm gì
phải mất một con trỏ đã được phân bổ.
Realloc là chức năng bạn muốn được chú ý ở đây.
Phải mất một con trỏ đã được trở về từ malloc.
Hãy nói rằng bạn yêu cầu từ malloc một con trỏ của 10 byte.
Sau đó bạn nhận ra rằng bạn muốn 20 byte,
do đó, bạn gọi realloc trên con trỏ với 20 byte,
và realloc sẽ tự động sao chép trên tất cả mọi thứ cho bạn.
Nếu bạn chỉ cần gọi là malloc một lần nữa, như tôi có một khối 10 byte.
Bây giờ tôi cần một khối 20 byte,
vì vậy nếu tôi malloc 20 byte, sau đó tôi phải tự sao chép 10 byte từ những điều đầu tiên
vào điều thứ hai và sau đó điều đầu tiên.
Realloc sẽ xử lý đó cho bạn.
>> Chú ý chữ ký là có được void *,
mà chỉ là trở về một con trỏ tới các khối của bộ nhớ,
sau đó void * ptr.
Bạn có thể nghĩ void * như một con trỏ chung chung.
Nói chung, bạn không bao giờ đối phó với void *,
nhưng malloc trả về một void *, và sau đó nó chỉ được sử dụng như
điều này thực sự sẽ là một char *.
Void * trước đó đã được trả lại bởi malloc
bây giờ sẽ được thông qua để realloc, và sau đó kích thước
là số điện thoại mới của byte mà bạn muốn phân bổ, do đó, khả năng mới của bạn.
Tôi sẽ cung cấp cho bạn một vài phút, và làm điều đó trong không gian của chúng tôi.
Bắt đầu với phiên bản 1.
Tôi sẽ dừng lại sau khi hy vọng về đủ thời gian để thực hiện push,
và sau đó tôi sẽ cung cấp cho bạn một break để làm pop.
Nhưng nó thực sự là không có mã nhiều ở tất cả.
Mã nhất có lẽ là các công cụ mở rộng, mở rộng công suất.
Được rồi, không có áp lực được hoàn toàn thực hiện,
nhưng miễn là bạn cảm thấy như bạn đang ở trên con đường bên phải, đó là tốt.
>> Có ai có bất kỳ mã mà họ cảm thấy thoải mái với tôi kéo lên?
Vâng, tôi sẽ làm, nhưng không ai có bất kỳ mã tôi có thể kéo lên?
Được rồi, bạn có thể bắt đầu, lưu nó, bất cứ điều gì?
Tôi luôn luôn quên rằng bước.
Được rồi, nhìn push,
nào bạn muốn để giải thích mã của bạn?
[Sinh viên] Trước hết, tôi tăng kích thước.
Tôi đoán có lẽ tôi nên có mà dù sao, tôi tăng kích thước,
và tôi thấy nếu nó ít hơn so với khả năng.
Và nếu nó ít hơn so với khả năng, tôi thêm vào các mảng mà chúng tôi đã có.
Và nếu nó không phải, tôi nhân năng lực cho 2,
và tôi tái phân bổ các mảng chuỗi đến một cái gì đó với một kích thước công suất lớn hơn.
Và sau đó nếu thất bại, tôi nói với người sử dụng và trả về false,
và nếu nó là tốt, sau đó tôi đặt chuỗi trong vị trí mới.
>> [Rob B.] Cũng thông báo rằng chúng tôi đã sử dụng một nhà điều hành Bitwise tốt đẹp ở đây
nhân cho 2.
Hãy nhớ rằng, sự thay đổi trái luôn luôn là sẽ được nhân 2.
Shift phải được chia cho 2 miễn là bạn nhớ rằng nó có nghĩa
chia 2 như trong một số nguyên chia cho 2.
Nó có thể cắt xén một 1 ở đây hoặc có.
Nhưng sự thay đổi để lại 1 luôn luôn là sẽ được nhân 2,
trừ khi bạn tràn giới hạn của các số nguyên, và sau đó nó sẽ không được.
Một nhận xét bên cạnh.
Tôi thích để làm điều này sẽ không thay đổi mã hóa bất kỳ cách nào,
nhưng tôi muốn làm một cái gì đó như thế này.
Nó thực sự là để làm cho nó dài hơn một chút.
Có lẽ đây không phải là trường hợp hoàn hảo để hiển thị này,
nhưng tôi muốn nó vào phân đoạn các khối of-
okay, nếu điều này nếu xảy ra, thì tôi sẽ làm một cái gì đó,
và sau đó chức năng được thực hiện.
Tôi không cần kéo thanh cuộn đôi mắt của tôi tất cả các con đường xuống chức năng
để xem những gì sẽ xảy ra sau khi người nào khác.
Đó là nếu điều này nếu xảy ra, sau đó tôi chỉ trả lại.
Nó cũng có thêm lợi ích tốt đẹp của tất cả mọi thứ ngoài này
bây giờ chuyển trái một lần.
Tôi không còn cần đến nếu bạn đã bao giờ gần ridiculously dài dòng,
sau đó những 4 byte có thể giúp đỡ, và cũng là một cái gì đó trái nhiều hơn là,
ít bị áp đảo bạn cảm thấy nếu như được rồi, tôi phải nhớ
Tôi hiện đang trong một vòng lặp trong khi bên trong khác của một bên trong một vòng lặp for.
Bất cứ nơi nào bạn có thể làm được điều này trở lại ngay lập tức, tôi giống như.
Nó hoàn toàn tùy chọn và sẽ không bất kỳ cách nào.
>> [Sinh viên] Nếu có một kích thước trong điều kiện thất bại?
Điều kiện thất bại ở đây là chúng tôi không realloc, do đó có.
Thông báo như thế nào trong điều kiện thất bại, có lẽ,
trừ khi chúng tôi công cụ miễn phí sau, chúng tôi sẽ luôn luôn thất bại
không có vấn đề bao nhiêu lần chúng ta cố gắng để đẩy một cái gì đó.
Nếu chúng ta tiếp tục đẩy mạnh, chúng tôi giữ kích thước incrementing,
mặc dù chúng tôi không đặt bất cứ điều gì vào stack.
Thông thường chúng ta không tăng kích thước cho đến khi
sau khi chúng tôi đã thành công đặt nó trên stack.
Chúng tôi sẽ làm điều đó, nói rằng, hoặc là ở đây và ở đây.
Và sau đó thay vì nói s.size ≤ công suất, nó ít hơn so với khả năng,
chỉ vì chúng ta chuyển nơi tất cả mọi thứ đã được.
>> Và hãy nhớ, nơi duy nhất mà chúng ta có thể có thể trả về false
là ở đây, nơi realloc trở lại vô giá trị,
và nếu bạn xảy ra để nhớ lỗi tiêu chuẩn,
có thể bạn có thể xem xét trường hợp này là nơi mà bạn muốn in một lỗi tiêu chuẩn,
fprintf stderr thay vì chỉ cần in trực tiếp để ra tiêu chuẩn.
Một lần nữa, đó không phải là một kỳ vọng, nhưng nếu đó là một lỗi,
gõ printf, sau đó bạn có thể muốn để làm cho nó in ra lỗi tiêu chuẩn thay vì ra tiêu chuẩn.
>> Bất cứ ai có bất cứ điều gì khác cần lưu ý? Vâng.
[Sinh viên] Bạn có thể đi qua [] không nghe được?
[Rob B.], binariness thực tế của nó, hoặc chỉ những gì nó được?
[Sinh viên] Vì vậy, bạn nhân nó 2 lần?
[Rob B.] Yeah, về cơ bản.
Trong đất nhị phân, chúng tôi luôn luôn có tập hợp các chữ số.
Chuyển trái này bởi 1 về cơ bản chèn nó ở đây ở phía bên phải.
Trở lại này, chỉ cần nhớ rằng tất cả mọi thứ trong hệ nhị phân
là một sức mạnh của 2, do đó, điều này đại diện cho 2 0 các,
2 đến 1, 2 với 2.
Bằng cách chèn một 0 sang bên phải bây giờ, chúng tôi chỉ thay đổi tất cả mọi thứ trên.
Những gì được sử dụng là 2 0 các bây giờ là 2 đến số 1, 2 với 2.
Phía bên phải mà chúng tôi đưa vào
nhất thiết sẽ là 0,
có ý nghĩa.
Nếu bạn đã bao giờ nhân một số bằng 2, nó sẽ không kết thúc kỳ lạ,
vì vậy 2 đến nơi 0 là 0,
và đây là những gì tôi nửa cảnh báo về trước là nếu bạn xảy ra để thay đổi
vượt quá số bit trong một số nguyên,
sau đó điều này 1 sẽ kết thúc đi ra.
Đó là chỉ lo lắng nếu bạn xảy ra để đối phó với khả năng thực sự lớn.
Tuy nhiên, tại thời điểm đó, sau đó bạn đang làm việc với một mảng tỷ thứ,
mà có thể không phù hợp với bộ nhớ anyway.
>> Bây giờ chúng ta có thể nhận được pop, mà thậm chí còn dễ dàng hơn.
Bạn có thể làm điều đó như nếu bạn xảy ra để bật một bó toàn bộ,
và bây giờ bạn đang nửa công suất một lần nữa.
Bạn có thể realloc để thu nhỏ số lượng bộ nhớ mà bạn có,
nhưng bạn không phải lo lắng về điều đó, vì vậy trường hợp realloc chỉ là có được
phát triển bộ nhớ, không bao giờ thu hẹp lại bộ nhớ,
đó là sẽ làm cho siêu pop dễ dàng.
Bây giờ hàng đợi, mà sẽ được như ngăn xếp,
nhưng thứ tự mà bạn thực hiện những điều trên được đảo ngược.
Ví dụ nguyên mẫu của một hàng đợi là một dòng,
vì vậy tôi đoán nếu bạn là người Anh, tôi sẽ nói
một ví dụ nguyên mẫu của một hàng đợi là một hàng đợi.
Vì vậy, như một dòng, nếu bạn là người đầu tiên trong dòng,
bạn mong đợi để là người đầu tiên ra khỏi đường.
Nếu bạn là người cuối cùng trong dòng, bạn sẽ là người cuối cùng phục vụ.
Chúng tôi gọi đó là mô hình FIFO, trong khi ngăn xếp được LIFO mô hình.
Những lời nói là khá phổ quát.
>> Giống như ngăn xếp và không giống như mảng, hàng đợi thường không cho phép truy cập đến các yếu tố ở giữa.
Ở đây, một chồng, chúng tôi có push và pop.
Ở đây, chúng tôi xảy ra đã gọi họ enqueue và dequeue.
Tôi cũng đã nghe họ gọi là thay đổi và unshift.
Tôi đã nghe người ta nói push và pop cũng được áp dụng cho hàng đợi.
Tôi đã nghe nói chèn, xóa,
để đẩy và bật, nếu bạn đang nói về ngăn xếp, bạn đang đẩy mạnh và popping.
Nếu bạn đang nói về hàng đợi, bạn có thể chọn những từ bạn muốn sử dụng
để chèn và loại bỏ, và không có sự đồng thuận về những gì nó nên được gọi.
Nhưng ở đây, chúng tôi có enqueue và dequeue.
Bây giờ, cấu trúc trông gần giống như các cấu trúc ngăn xếp.
Nhưng chúng ta phải theo dõi của người đứng đầu.
Tôi đoán nó nói ở đây, nhưng tại sao chúng ta cần người đứng đầu?
Các nguyên mẫu về cơ bản giống hệt nhau để đẩy và pop.
Bạn có thể nghĩ về nó như là push và pop.
Sự khác biệt duy nhất là pop đang trở lại-thay vì của người cuối cùng, nó trở về đầu tiên.
2, 1, 3, 4, hoặc một cái gì đó.
Và đây là sự bắt đầu.
Hàng đợi của chúng tôi là hoàn toàn đầy đủ, do đó, có bốn yếu tố trong đó.
Sự kết thúc của hàng đợi của chúng tôi hiện đang là 2,
và bây giờ chúng tôi đi để chèn một cái gì đó khác.
>> Khi chúng ta muốn chèn một điều gì đó khác, những gì chúng tôi đã làm cho phiên bản stack
chúng tôi mở rộng khối bộ nhớ của chúng ta.
Vấn đề này là gì?
[Sinh viên] Bạn di chuyển 2.
Những gì tôi đã nói trước về sự kết thúc của hàng đợi,
điều này không có ý nghĩa mà chúng tôi bắt đầu từ 1,
sau đó chúng tôi muốn để dequeue 1, sau đó dequeue 3, sau đó dequeue 4,
sau đó dequeue 2, sau đó dequeue này.
Chúng tôi không thể sử dụng realloc bây giờ,
hoặc ít nhất, bạn phải sử dụng realloc theo một cách khác.
Nhưng có lẽ bạn không nên chỉ cần sử dụng realloc.
Bạn sẽ phải tự sao chép bộ nhớ của bạn.
>> Có hai chức năng để sao chép bộ nhớ.
Có memcopy và memmove.
Tôi hiện đang đọc các trang người đàn ông xem cái nào bạn sẽ muốn sử dụng.
Được rồi, memcopy, sự khác biệt
memcopy và memmove, xử lý các trường hợp một cách chính xác
nơi mà bạn đang sao chép vào một khu vực xảy ra chồng chéo các khu vực
bạn đang sao chép từ.
Memcopy không xử lý nó. Memmove.
Bạn có thể nghĩ về các vấn đề như
hãy nói rằng tôi muốn sao chép anh chàng này,
bốn anh chàng này hơn.
Cuối cùng, các mảng sẽ giống như
sau khi sao chép là 2, 1, 2, 1, 3, 4, và sau đó một số công cụ ở cuối.
Nhưng điều này phụ thuộc vào thứ tự mà chúng tôi thực sự sao chép,
vì nếu chúng ta không xem xét thực tế rằng khu vực chúng tôi đang sao chép vào
chồng chéo mà chúng ta đang sao chép từ,
sau đó chúng ta có thể làm như bắt đầu ở đây, sao chép 2 vào nơi chúng ta muốn đi,
sau đó di chuyển con trỏ của chúng tôi về phía trước.
>> Bây giờ chúng ta sẽ ở đây và ở đây, và bây giờ chúng tôi muốn sao chép
anh chàng này hơn anh chàng này và di chuyển con trỏ của chúng tôi về phía trước.
Những gì chúng ta sẽ kết thúc nhận được là 2, 1, 2, 1, 2, 1
thay vì thích hợp 2, 1, 2, 1, 3, 4 vì
2, 1 overrode gốc 3, 4.
Memmove xử lý một cách chính xác.
Trong trường hợp này, về cơ bản chỉ cần luôn luôn sử dụng memmove
bởi vì nó xử lý nó một cách chính xác.
Nó thường không thực hiện bất kỳ tồi tệ.
Ý tưởng là thay vì bắt đầu từ đầu và sao chép theo cách này
như chúng ta đã làm ở đây, nó bắt đầu từ kết thúc và bản sao,
và trong trường hợp đó, bạn có thể không bao giờ có một vấn đề.
Không có hiệu suất bị mất.
Luôn luôn sử dụng memmove. Không bao giờ lo lắng về memcopy.
Và đó là nơi bạn sẽ có riêng memmove
phần bao bọc xung quanh hàng đợi của bạn.
Không có lo lắng nếu không hoàn toàn thực hiện.
Điều này là khó khăn hơn so với stack, push và pop.
>> Bất cứ ai có bất kỳ mã, chúng ta có thể làm việc với?
Ngay cả khi hoàn toàn không đầy đủ?
[Sinh viên] Yeah, nó hoàn toàn không đầy đủ, mặc dù.
Hoàn toàn không đầy đủ là tốt miễn là chúng ta có thể lưu các sửa đổi?
Tôi quên rằng mỗi lần duy nhất.
Được rồi, bỏ qua những gì sẽ xảy ra khi chúng ta cần phải thay đổi kích thước điều.
Hoàn toàn bỏ qua thay đổi kích cỡ.
Giải thích mã này.
Tôi đang kiểm tra đầu tiên của tất cả các kích thước là ít hơn so với bản sao đầu tiên của tất cả các
và sau đó sau đó, tôi chèn-I lấy đầu + kích thước,
và tôi chắc chắn rằng nó kết thúc tốt đẹp xung quanh khả năng của mảng,
và tôi chèn chuỗi mới ở vị trí đó.
Sau đó, tôi tăng kích thước và trả lại đúng sự thật.
>> [Rob B.] Điều này chắc chắn là một trong những trường hợp mà bạn sẽ muốn được sử dụng mod.
Bất kỳ loại trường hợp, nơi bạn có gói xung quanh, nếu bạn nghĩ rằng gói xung quanh,
những suy nghĩ ngay lập tức nên mod.
Là một tối ưu hóa nhanh chóng / mã một dòng của bạn ngắn hơn,
bạn nhận thấy rằng các dòng sau này
chỉ là kích thước + +, do đó, bạn nhập vào dòng này, kích thước + +.
Bây giờ ở đây, chúng ta có các trường hợp
mà chúng ta không có đủ bộ nhớ,
vì vậy chúng tôi đang gia tăng năng lực của chúng tôi 2.
Tôi đoán bạn có thể có cùng một vấn đề ở đây, nhưng chúng ta có thể bỏ qua nó,
mà nếu bạn thất bại trong việc nâng cao năng lực của bạn,
sau đó bạn sẽ muốn làm giảm năng lực của bạn 2 lần nữa.
Một lưu ý ngắn gọn là giống như bạn có thể làm + =,
bạn cũng có thể làm << =.
Hầu như bất cứ điều gì có thể đi trước bằng, + =, | =, & =, << =
Char * mới là khối bộ nhớ mới của chúng tôi.
Oh, ở đây.
>> Làm gì mọi người nghĩ về các loại của khối bộ nhớ mới của chúng tôi?
[Sinh viên] Nó sẽ được char **.
Nghĩ về cấu trúc của chúng tôi ở đây,
dây là những gì chúng tôi đang phân bổ lại.
Chúng tôi đang làm cho một lưu trữ toàn bộ mới năng động cho các phần tử trong hàng đợi.
Những gì chúng ta sẽ được gán cho chuỗi của bạn là những gì chúng tôi đang mallocing ngay bây giờ,
và như vậy mới là có được một char **.
Nó sẽ là một mảng của chuỗi.
Sau đó, các trường hợp theo đó chúng tôi đang đi để trả lại sai là gì?
[Sinh viên] Chúng ta có nên làm char *?
[Rob B.] Vâng, cuộc gọi tốt.
[Sinh viên] Cái gì thế?
[Rob B. Chúng tôi muốn làm kích thước của char * bởi vì chúng ta không còn
điều này thực sự sẽ là một vấn đề rất lớn bởi vì sizeof (char) sẽ là 1.
Sizeof char * sẽ là 4,
vì vậy rất nhiều lần khi bạn đang làm việc với ints,
bạn có xu hướng để có được đi với nó bởi vì kích thước của int và kích thước của int *
trên một hệ thống 32-bit đang có được điều tương tự.
Nhưng ở đây, sizeof (char) và sizeof (char *) là sẽ được điều tương tự.
>> Hoàn cảnh, nơi chúng tôi quay trở lại sai là gì?
[Sinh viên] là null.
Yeah, nếu mới là vô giá trị, chúng tôi quay trở lại sai,
và tôi sẽ ném xuống đây
[Sinh viên] [không nghe được]
[Rob B.] Yeah, điều này là tốt.
Bạn có thể có thể làm 2 lần công suất hoặc 1 ca năng lực và sau đó chỉ đặt nó ở đây hoặc bất cứ điều gì.
Chúng tôi sẽ làm điều đó như chúng tôi đã có nó.
Công suất >> = 1.
Và bạn sẽ không bao giờ phải lo lắng về việc bị mất vị trí số 1
bởi vì bạn còn lại chuyển bằng 1, vì vậy số 1 nơi nhất thiết phải là một 0,
như vậy ngay chuyển bằng 1, bạn vẫn sẽ được sử dụng tốt.
[Sinh viên bạn cần phải làm điều đó trước khi trở về?
[Rob B. Có, điều này làm cho hoàn toàn không có ý nghĩa.
>> Bây giờ giả sử chúng ta sẽ kết thúc trở về đúng để kết thúc.
Cách chúng ta sẽ làm những memmoves,
chúng ta cần phải cẩn thận với cách chúng tôi làm cho họ.
Có ai có bất cứ lời đề nghị làm thế nào chúng ta làm cho họ?
Đây là khởi đầu của chúng tôi.
Chắc chắn, chúng tôi muốn bắt đầu từ đầu một lần nữa
và sao chép những thứ từ đó, 1, 3, 4, 2.
Làm thế nào để bạn làm điều đó?
Trước tiên, tôi phải nhìn vào trang người đàn ông cho memmove một lần nữa.
Memmove, trật tự của các đối số luôn luôn là quan trọng.
Chúng tôi muốn đích của chúng tôi đầu tiên, nguồn thứ hai, kích thước 3.
Hiện có rất nhiều các chức năng đảo ngược nguồn và đích.
Nguồn đích, có xu hướng để phù hợp phần nào.
Di chuyển, những gì là nó trở về?
Nó trả về một con trỏ đến đích, vì lý do gì bạn có thể muốn điều đó.
Tôi hình ảnh có thể đọc nó, nhưng chúng tôi muốn chuyển vào đích của chúng tôi.
>> Đích của chúng tôi là gì được không?
[Sinh viên].
[Rob B.] Có, và nơi chúng ta sao chép từ?
Điều đầu tiên chúng tôi được sao chép này là 1, 3, 4.
-1 là gì, 3, 4.
Địa chỉ này 1 là gì?
Địa chỉ rằng 1 là gì?
[Sinh viên] [không nghe được]
Rob B. Head + địa chỉ của các yếu tố đầu tiên.
Làm thế nào để chúng ta có được những yếu tố đầu tiên trong mảng?
[Sinh viên] Queue.
[Rob B.] Vâng, q.strings.
Hãy nhớ rằng, ở đây, người đứng đầu của chúng tôi là 1.
Darn. Tôi chỉ nghĩ rằng đó là kỳ diệu
Ở đây, người đứng đầu của chúng tôi là 1. Tôi sẽ thay đổi màu sắc của tôi quá.
Và đây là chuỗi.
Này, chúng tôi có thể viết nó như là chúng tôi đã làm ở đây
với người đứng đầu + q.strings.
Rất nhiều người cũng viết & q.strings [đầu].
Đây không phải là thực sự bất kỳ kém hiệu quả hơn.
Bạn có thể nghĩ về nó như là bạn đang dereferencing nó và sau đó nhận được địa chỉ,
nhưng trình biên dịch sẽ dịch nó với những gì chúng ta đã có trước khi anyway, q.strings + đầu.
Dù bằng cách nào bạn muốn nghĩ về nó.
>> Và có bao nhiêu byte chúng ta muốn sao chép?
[Sinh viên] - đầu năng lực.
Đầu năng lực.
Và sau đó bạn luôn luôn có thể viết ra một ví dụ
để tìm ra nếu đó là đúng.
[Sinh viên] Nó cần phải được chia bởi 2 sau đó.
Yeah, vì vậy tôi đoán chúng ta có thể sử dụng kích thước.
Chúng tôi vẫn có kích thước là-
sử dụng kích thước, chúng tôi có kích thước bằng 4.
Kích thước của chúng tôi là 4. Đầu của chúng tôi là 1.
Chúng tôi muốn sao chép 3 yếu tố này.
Đó là sanity kiểm tra xem kích thước đầu là chính xác 3.
Và trở lại đây, giống như chúng tôi đã nói trước,
nếu chúng ta sử dụng năng lực, sau đó chúng tôi phải chia 2
bởi vì chúng tôi đã phát triển năng lực của chúng tôi, do đó, thay vì, chúng ta sẽ sử dụng kích thước.
Rằng các bản sao phần đó.
Bây giờ, chúng ta cần để sao chép các phần khác, phần còn lại của đầu.
>> Đó sẽ memmove vào những gì vị trí?
[Sinh viên] cộng với kích thước đầu.
Có, vì vậy chúng tôi đã sao chép kích thước byte đầu,
và vì vậy mà chúng ta muốn sao chép các byte còn lại là mới
và sau đó kích thước trừ-tốt, số byte, chúng tôi đã sao chép.
Và sau đó chúng tôi sao chép từ?
[Sinh viên] Q.strings [0].
[Rob B.] Vâng, q.strings.
Chúng tôi có thể làm q.strings [0].
Điều này là đáng kể ít phổ biến hơn này.
Nếu nó chỉ là 0, sau đó bạn sẽ có xu hướng để xem q.strings.
Đó là nơi mà chúng tôi đang sao chép từ.
Chúng tôi đã có bao nhiêu byte còn lại để sao chép? >> [Sinh viên] 10.
Đúng.
[Sinh viên] Chúng ta phải nhân 5 - 10 lần kích thước của các byte hoặc một cái gì đó?
Yeah, vì vậy đây là nơi mà chính xác những gì chúng ta sao chép?
[Sinh viên] [không nghe được]
Loại trong những điều chúng ta đang sao chép là gì?
[Sinh viên] [không nghe được]
Yeah, vì vậy char * chúng tôi đang sao chép, chúng tôi không biết nơi mà những người đang đến từ.
Vâng, họ đang trỏ đến, giống như các chuỗi, chúng tôi kết thúc đẩy nó vào hàng đợi
hoặc enqueuing vào hàng đợi.
Nơi mà những người đến từ đâu, chúng tôi không có ý tưởng.
Chúng ta chỉ cần để theo dõi các s * char mình.
Chúng tôi không muốn để sao chép kích thước byte đầu.
Chúng tôi muốn sao chép kích thước đầu char * s,
do đó, chúng ta sẽ nhân này bằng sizeof (char *).
Cùng xuống đây, người đứng đầu * sizeof (char *).
>> [Sinh viên] về [không nghe được?
Quyền này ở đây?
[Sinh viên] Không có, dưới đây, kích thước đầu.
[Rob B. Điều này ngay tại đây?
Con trỏ số học.
Làm thế nào để con trỏ số học là sẽ làm việc
nó sẽ tự động nhân bởi kích thước của các loại mà chúng ta đang đối phó với.
Cũng giống như ở đây, mới + (size - đầu)
là chính xác tương đương với & [size đầu]
cho đến khi chúng tôi hy vọng rằng để làm việc một cách chính xác,
vì nếu chúng ta đang đối phó với một mảng int, sau đó chúng tôi không chỉ số int-
hoặc nếu đó là kích thước của 5 và bạn muốn các yếu tố thứ 4, sau đó chúng tôi lập chỉ mục vào
int array [4].
Bạn đừng-[4] * kích thước của int.
Xử lý tự động, và trường hợp này
có nghĩa là tương đương, do đó, các cú pháp khung
chỉ cần đi để được chuyển đổi này ngay sau khi bạn biên dịch.
Đó là điều mà bạn cần phải cẩn thận đó
khi bạn đang thêm kích thước đầu
bạn có thêm không phải là một byte.
Bạn thêm một char *, có thể là một byte hoặc bất cứ điều gì.
>> Các câu hỏi khác?
Được rồi, dequeue sẽ được dễ dàng hơn.
Tôi sẽ cung cấp cho bạn một phút để thực hiện.
Oh, và tôi đoán đây là tình hình tương tự
trường hợp enqueue, nếu chúng ta đang enqueuing null,
có lẽ chúng ta muốn để xử lý nó, có lẽ chúng tôi không.
Chúng tôi sẽ không làm điều đó một lần nữa ở đây, nhưng giống như trường hợp chồng của chúng tôi.
Nếu chúng ta enqueue null, chúng tôi có thể muốn bỏ qua nó.
Bất cứ ai cũng có một số mã tôi có thể kéo lên?
[Sinh viên] Tôi chỉ có dequeue.
Phiên bản 2 là được rồi.
Bạn muốn giải thích?
[Sinh viên] Đầu tiên, bạn hãy chắc chắn có điều gì đó trong hàng đợi
và rằng kích thước sẽ giảm 1.
Bạn cần phải làm điều đó, và sau đó bạn trở về đầu
và sau đó di chuyển đầu lập 1.
Được rồi, do đó, có một trường hợp góc chúng ta phải xem xét. Yeah.
[Sinh viên] Nếu đầu của bạn là yếu tố cuối cùng,
sau đó bạn không muốn đầu đến điểm bên ngoài của mảng.
>> Yeah, vì vậy ngay sau khi đầu chạm cuối mảng của chúng tôi,
khi chúng ta dequeue, đầu của chúng tôi nên được modded trở về 0.
Thật không may, chúng tôi không thể làm điều đó trong một bước.
Tôi đoán là cách tôi có thể sửa chữa nó là
này là có được một char *, những gì chúng ta đang quay trở lại,
bất cứ tên biến của bạn muốn trở thành.
Sau đó, chúng tôi muốn để mod đầu bởi năng lực của chúng tôi
và sau đó trở về ret.
Rất nhiều người dân ở đây, họ có thể làm
đây là trường hợp của-bạn sẽ thấy mọi người làm đầu
lớn hơn năng lực, làm đầu năng lực.
Và đó chỉ là làm việc xung quanh mod là gì.
Trưởng mod = công suất là rất sạch hơn
của một gói xung quanh hơn nếu đầu lớn hơn so với khả năng đầu năng lực.
>> Câu hỏi?
Được rồi, điều cuối cùng chúng ta đã để lại là danh sách liên kết của chúng tôi.
Bạn có thể sử dụng một số hành vi của danh sách liên kết nếu bạn đã làm
danh sách liên kết trong bảng băm của bạn, nếu bạn đã làm một bảng băm.
Tôi mạnh mẽ khuyên bạn nên làm một bảng băm.
Bạn có thể đã thực hiện một Trie,
nhưng cố gắng là khó khăn hơn.
Về lý thuyết, họ đang tiệm cận tốt hơn.
Nhưng chỉ cần nhìn vào bảng lớn,
và cố gắng không bao giờ làm tốt hơn, và chúng chiếm nhiều bộ nhớ hơn.
Mọi thứ về cố gắng kết thúc lên được tồi tệ hơn cho công việc nhiều hơn.
Đó là những gì David Malan của giải pháp luôn luôn là
ông luôn luôn giải pháp Trie của mình, và chúng ta hãy xem nơi ông hiện nay là.
Ông là gì theo, David J?
# 18, do đó, không phải terribly,
và đó sẽ là một trong những cố gắng bạn có thể nghĩ
hoặc một trong những cố gắng của Trie.
Đó không phải là giải pháp ban đầu của mình?
Tôi cảm thấy như Trie giải pháp có xu hướng được nhiều hơn trong phạm vi này sử dụng bộ nhớ RAM.
>> Đi xuống đầu, và RAM sử dụng trong các chữ số duy nhất.
Đi xuống hướng phía dưới, và sau đó bạn bắt đầu thấy cố gắng
nơi bạn có sử dụng RAM hoàn toàn lớn,
và cố gắng khó khăn hơn.
Không hoàn toàn giá trị nó nhưng một kinh nghiệm giáo dục nếu bạn đã làm một.
Điều cuối cùng là danh sách liên kết của chúng tôi,
và những ba điều, ngăn xếp, hàng đợi và danh sách liên kết,
bất cứ điều gì trong tương lai bao giờ bạn làm trong lĩnh vực khoa học máy tính
sẽ cho rằng bạn có quen với những điều này.
Họ là những nguyên tắc cơ bản cho tất cả mọi thứ.
>> Danh sách liên kết, và ở đây chúng tôi có một danh sách đơn lẻ liên kết là có được việc thực hiện của chúng tôi.
Những gì không liên kết đơn lẻ có nghĩa là như trái ngược với liên kết kép? Vâng.
[Sinh viên] Nó chỉ chỉ vào con trỏ tiếp theo thay vì các con trỏ,
giống như một trước và một sau khi nó.
Yeah, do đó, trong định dạng hình ảnh, tôi đã làm những gì chỉ cần làm?
Tôi có hai điều. Tôi có hình ảnh và hình ảnh.
Trong bức ảnh định dạng, liên kết đơn lẻ của chúng tôi danh sách,
chắc chắn, chúng tôi có một số loại con trỏ đến người đứng đầu danh sách của chúng tôi,
và sau đó trong danh sách của chúng tôi, chúng tôi chỉ có con trỏ,
và có thể điều này dẫn đến giá trị null.
Nó sẽ là bản vẽ điển hình của bạn của một danh sách liên kết đơn lẻ.
Một danh sách liên kết kép, bạn có thể đi ngược.
Nếu tôi cung cấp cho bạn bất kỳ nút nào trong danh sách, sau đó nhất thiết các bạn có thể nhận được để
bất kỳ nút khác trong danh sách nếu nó là một danh sách liên kết kép.
Nhưng nếu tôi nhận được nút thứ ba trong danh sách và nó là một danh sách liên kết đơn lẻ,
không có cách nào bạn đã bao giờ đi để có được các nút đầu tiên và thứ hai.
Và có lợi ích và detriments, và một trong những rõ ràng
là bạn mất nhiều kích cỡ, và bạn có để theo dõi những điều này chỉ bây giờ.
Nhưng chúng tôi chỉ quan tâm đơn lẻ liên kết.
>> Một số điều chúng ta sẽ phải thực hiện.
Nút struct typedef của bạn, int i: struct node * next; nút.
Đó typedef nên được đốt cháy vào trong tâm trí của bạn.
Bài kiểm tra 1 phải được cung cấp cho một typedef của một nút danh sách liên kết,
và bạn sẽ có thể ngay lập tức scribble mà xuống
mà không cần suy nghĩ về nó.
Tôi đoán một vài câu hỏi, tại sao chúng ta cần cấu trúc ở đây?
Tại sao chúng ta không thể nói rằng * nút?
[Sinh viên] [không nghe được]
Yeah.
Điều duy nhất mà xác định một nút như một điều
là typedef chính nó.
Nhưng kể từ thời điểm này, khi chúng ta đang loại phân tích cú pháp thông qua định nghĩa này nút struct,
chúng tôi đã không hoàn thành typedef của chúng tôi, do đó, kể từ khi typedef đã không hoàn thành,
nút không tồn tại.
Nhưng struct node không có gì, và nút này ở đây,
điều này cũng có thể được gọi là bất cứ điều gì khác.
Điều này có thể được gọi là n.
Nó có thể được gọi là danh sách các node liên kết.
Nó có thể được gọi là bất cứ điều gì.
Tuy nhiên, cấu trúc node này cần phải được gọi là điều tương tự như cấu trúc node này.
Những gì bạn gọi điều này cũng có mặt ở đây,
và vì vậy mà cũng trả lời điểm thứ hai của câu hỏi
đó là lý do tại sao rất nhiều lần khi bạn nhìn thấy cấu trúc và typedefs của cấu trúc,
bạn sẽ thấy các cấu trúc vô danh hợp bạn sẽ chỉ nhìn thấy struct typedef,
thực hiện từ điển, cấu trúc, hoặc bất cứ điều gì.
>> Tại sao ở đây chúng ta cần nói nút?
Tại sao nó không thể là một cấu trúc vô danh?
Nó gần như cùng một câu trả lời.
[Sinh viên] Bạn cần phải đề cập đến nó trong cấu trúc.
Yeah, trong các cấu trúc, bạn cần tham khảo các cấu trúc riêng của mình.
Nếu bạn không cung cấp cho các cấu trúc một cái tên, nếu nó là một cấu trúc vô danh, bạn không thể tham chiếu đến nó.
Và cuối cùng nhưng không kém tất cả những nên được phần nào đơn giản,
và họ sẽ giúp bạn nhận ra nếu bạn đang viết này xuống
rằng bạn đang làm một cái gì đó sai lầm nếu các loại của sự vật không có ý nghĩa.
Cuối cùng nhưng không kém, tại sao điều này có là struct node *?
Tại sao không thể chỉ được cấu trúc nút tiếp theo?
[Sinh viên] Con trỏ trỏ tới các cấu trúc tiếp theo.
Đó là chắc chắn những gì chúng ta muốn.
Tại sao nó không bao giờ có thể là struct node tiếp theo?
Tại sao nó có được struct node * next? Yeah.
[Sinh viên] Nó giống như một vòng lặp vô hạn.
Yeah.
[Sinh viên] sẽ là tất cả trong một.
Yeah, chỉ cần nghĩ về làm thế nào chúng ta sẽ làm kích thước hoặc một cái gì đó.
Kích thước của một cấu trúc cơ bản là + hoặc - một số mô hình ở đây hoặc có.
Đó là cơ bản sẽ là tổng của các kích thước của những thứ trong cấu trúc.
Quyền này ở đây, mà không thay đổi bất cứ điều gì, kích thước sẽ được dễ dàng.
Kích thước của nút struct là có được kích thước của kích thước + i tiếp theo.
Kích thước của i sẽ là 4. Kích thước của tiếp theo sẽ là 4.
Kích thước của nút struct sẽ là 8.
Nếu chúng ta không có *, suy nghĩ của sizeof,
sau đó sizeof (i) sẽ là 4.
Kích thước của nút struct tiếp theo sẽ được kích thước của i + kích thước của nút struct tiếp theo
+ Kích thước của kích thước + i của nút struct tiếp theo.
Nó sẽ là một đệ quy vô hạn của các nút.
Đây là lý do tại sao điều này là những thứ như thế nào có được.
>> Một lần nữa, chắc chắn ghi nhớ đó,
hoặc ít nhất là hiểu nó đủ để bạn có thể có thể
lý do thông qua những gì nó sẽ giống như.
Những điều chúng ta sẽ muốn thực hiện.
Nếu độ dài của danh sách
bạn có thể ăn gian và giữ cho xung quanh một
chiều dài toàn cầu hoặc một cái gì đó, nhưng chúng tôi sẽ không làm điều đó.
Chúng tôi sẽ để đếm độ dài của danh sách.
Chúng tôi đã có, vì vậy đó là cơ bản giống như một tìm kiếm,
vì vậy chúng tôi có một danh sách liên kết các số nguyên để xem nếu số nguyên này là trong danh sách liên kết.
Thêm tiền tố sẽ để chèn vào đầu danh sách.
Nối sẽ chèn ở cuối.
Insert_sorted sẽ để chèn vào vị trí sắp xếp trong danh sách.
Insert_sorted loại giả định rằng bạn không bao giờ được sử dụng thêm vào trước hoặc thêm trong cách xấu.
>> Insert_sorted khi bạn đang thực hiện insert_sorted-
Chúng ta đã có danh sách của chúng tôi liên kết.
Đây là những gì nó trông giống như, 2, 4, 5.
Tôi muốn chèn 3, do đó, miễn là danh sách đã được sắp xếp,
thật dễ dàng để tìm thấy nơi 3 thuộc về.
Tôi bắt đầu tại 2.
Được rồi, 3 là lớn hơn 2, vì vậy tôi muốn tiếp tục đi.
Oh, 4 là quá lớn, vì vậy tôi biết 3 sẽ đi từ 2 đến 4,
và tôi có để sửa chữa con trỏ và tất cả các công cụ.
Nhưng nếu chúng ta không nghiêm sử dụng insert_sorted,
như chúng ta hãy chỉ nói rằng tôi thêm vào trước 6,
sau đó danh sách liên kết của tôi là sẽ trở thành điều này.
Nó bây giờ làm cho không có ý nghĩa, vì vậy cho insert_sorted, bạn chỉ có thể giả định
danh sách được sắp xếp, mặc dù hoạt động tồn tại
có thể gây ra nó không được phân loại, và đó là nó.
Tìm một chèn hữu ích để những người đang có những điều chính bạn sẽ phải thực hiện.
>> Để bây giờ, mất vài phút để làm chiều dài và chứa,
và những người cần được tương đối nhanh chóng.
Gần thời gian đóng cửa, do đó, bất cứ ai có bất cứ điều gì cho chiều dài hoặc có chứa?
Họ sẽ để được gần như giống hệt nhau.
[Sinh viên] Thêm bài này vào danh sách Video của bạn.
Hãy xem, sửa đổi.
Okay.
Bạn muốn giải thích?
[Sinh viên] Tôi chỉ tạo ra một nút con trỏ và khởi tạo nó đầu tiên, là biến toàn cầu của chúng tôi,
và sau đó tôi kiểm tra xem nếu nó là null vì vậy tôi không nhận được một lỗi seg và trở về 0 nếu đó là trường hợp.
Nếu không, tôi lặp qua, theo dõi trong số nguyên
bao nhiêu lần tôi đã truy cập vào phần tử tiếp theo của danh sách
và trong cùng một hoạt động tăng cũng có thể truy cập yếu tố đó thực tế,
và sau đó tôi liên tục làm cho việc kiểm tra để xem nếu nó là vô giá trị,
và nếu nó là vô giá trị, sau đó nó hủy bỏ và chỉ cần trả về số lượng các yếu tố tôi đã truy cập.
>> [Rob B.] Có ai có bất kỳ ý kiến ​​về bất cứ điều gì?
Điều này có vẻ tốt đúng đắn khôn ngoan.
[Sinh viên] Tôi không nghĩ rằng bạn cần các nút == null.
Yeah, vì vậy nếu nút == null trở về 0.
Nhưng nếu null nút == sau đó này-oh, có một vấn đề đúng đắn.
Đó chỉ là bạn trả lại tôi, nhưng nó không phải trong phạm vi ngay bây giờ.
Bạn chỉ cần int i, do đó, i = 0.
Nhưng nếu nút là null, sau đó tôi vẫn sẽ là 0,
và chúng ta sẽ trở về 0, do đó, trường hợp này là giống hệt nhau.
Một điều phổ biến khác là để giữ cho tờ khai
của nút bên trong cho vòng lặp.
Bạn có thể nói-oh, không có.
Hãy để giữ cho nó như thế này.
Tôi có lẽ sẽ đặt int i = 0 ở đây,
sau đó node * node = đầu tiên ở đây.
Và điều này có lẽ là làm thế nào nhận được thoát khỏi điều này ngay bây giờ.
Đây có lẽ là làm thế nào tôi sẽ có văn bản nó.
Bạn cũng có thể nhìn vào nó như thế này.
Điều này cho cấu trúc vòng lặp ngay tại đây
nên được gần như là tự nhiên với bạn như int i = 0
i là ít hơn so với chiều dài của mảng i + +.
Nếu đó là làm thế nào bạn lặp qua một mảng, đây là làm thế nào bạn lặp qua một danh sách liên kết.
>> Điều này cần được bản chất thứ hai tại một số điểm.
Với ý nghĩ đó, điều này là có được gần như cùng một.
Bạn sẽ muốn để lặp lại trên một danh sách liên kết.
Nếu node-Tôi không có ý tưởng những gì giá trị được gọi là.
Node i.
Nếu giá trị tại nút đó tôi trở về đúng sự thật, và đó là nó.
Chú ý rằng cách duy nhất chúng tôi đã từng trả về false
là nếu chúng ta lặp qua danh sách liên kết toàn bộ và không bao giờ trở lại đúng sự thật,
để điều này không.
Là một phụ lưu ý, chúng ta có thể sẽ không nhận được để phụ thêm hoặc thêm vào trước.
>> Nhanh chóng lưu ý cuối.
Nếu bạn thấy các từ khoá tĩnh, vì vậy chúng ta hãy nói static int count = 0,
sau đó chúng ta làm count + +, bạn về cơ bản có thể nghĩ về nó như là một biến toàn cầu,
mặc dù tôi chỉ nói điều này không phải là làm thế nào chúng ta sẽ thực hiện chiều dài.
Tôi làm điều này ở đây, và sau đó đếm + +.
Bất kỳ cách nào chúng ta có thể nhập vào một nút vào danh sách liên kết của chúng tôi, chúng tôi được incrementing số của chúng tôi.
Điểm này là các từ khoá tĩnh có nghĩa là gì.
Nếu tôi chỉ có số int = 0 đó sẽ là biến toàn cầu thường xuyên.
Static int count phương tiện là nó là một biến toàn cầu cho tập tin này.
Nó là không thể cho một số tập tin khác,
suy nghĩ của pset 5, nếu bạn đã bắt đầu.
Bạn có cả hai speller.c, và bạn có dictionary.c,
và nếu bạn chỉ cần khai báo một điều toàn cầu, sau đó bất cứ điều gì trong speller.c
có thể được truy cập trong dictionary.c và ngược lại.
Biến toàn cầu có thể truy cập bất kỳ tập tin c.
nhưng các biến tĩnh chỉ có thể truy cập từ bên trong các tập tin riêng của mình,
như vậy bên trong kiểm tra chính tả hoặc bên trong của dictionary.c,
này là loại thế nào tôi sẽ khai báo biến của tôi cho kích thước của mảng của tôi
hoặc kích thước của số từ trong từ điển của tôi.
Vì tôi không muốn khai báo một biến toàn cầu mà bất cứ ai đã truy cập vào,
Tôi thực sự chỉ quan tâm đến nó cho mục đích riêng của tôi.
>> Những điều tốt về điều này cũng là tên toàn bộ các công cụ va chạm.
Nếu một số file khác cố gắng sử dụng một biến toàn cầu tính, mọi thứ đi rất, rất sai trái,
do đó, điều này độc đáo giữ những điều an toàn, và chỉ có bạn mới có thể truy cập vào nó,
và không ai khác có thể, và nếu người khác khai báo một biến toàn cầu tính,
sau đó nó sẽ không can thiệp với biến tĩnh đếm được gọi là.
Đó là những gì tĩnh là. Đây là một biến tập tin toàn cầu.
>> Các câu hỏi về bất cứ điều gì?
Tất cả các thiết lập. Bye.
[CS50.TV]