1 00:00:00,000 --> 00:00:02,832 >> [عزف الموسيقى] 2 00:00:02,832 --> 00:00:05,670 3 00:00:05,670 --> 00:00:08,560 >> DOUG لويد: OK، وذلك في هذه النقطة في الدورة، 4 00:00:08,560 --> 00:00:15,300 لقد غطت الكثير من أساسيات C. نحن نعرف الكثير عن المتغيرات، والمصفوفات، 5 00:00:15,300 --> 00:00:17,610 مؤشرات، كل ما الأشياء الجيدة. 6 00:00:17,610 --> 00:00:21,610 تلك هي كل نوع من المدمج في أن نرى مثل الأساسيات، 7 00:00:21,610 --> 00:00:23,880 لكن يمكننا أن نفعل أكثر من ذلك، أليس كذلك؟ 8 00:00:23,880 --> 00:00:27,930 يمكننا الجمع بين الأشياء معا بطرق مثيرة للاهتمام. 9 00:00:27,930 --> 00:00:31,010 >> وذلك دعونا نفعل ذلك، دعونا نبدأ إلى فرع من أصل ما C يعطينا، 10 00:00:31,010 --> 00:00:35,270 والبدء في إنشاء البيانات الخاصة بنا الهياكل باستخدام هذه بناء 11 00:00:35,270 --> 00:00:40,590 كتل معا لنفعل شيئا حقا قيمة ومفيدة. 12 00:00:40,590 --> 00:00:43,420 طريقة واحدة يمكننا أن نفعل هذا هو للحديث عن مجموعات. 13 00:00:43,420 --> 00:00:48,360 لذلك حتى الآن كان لدينا نوع واحد من البيانات هيكل لتمثيل مجموعات 14 00:00:48,360 --> 00:00:51,030 من مثل القيم، قيم متشابهة. 15 00:00:51,030 --> 00:00:52,350 من شأنه أن يكون صفيف. 16 00:00:52,350 --> 00:00:57,020 لدينا مجموعة من الأعداد الصحيحة، أو مجموعات من الشخصيات وهلم جرا. 17 00:00:57,020 --> 00:01:00,890 >> والهياكل فرز أيضا من بيانات هيكل لجمع المعلومات، 18 00:01:00,890 --> 00:01:03,220 ولكنها ليست لجمع مثل القيم. 19 00:01:03,220 --> 00:01:08,090 فإنه عادة ما تختلط أنواع مختلفة من البيانات معا داخل صندوق واحد. 20 00:01:08,090 --> 00:01:10,750 ولكنها ليست في حد ذاتها تستخدم لسلسلة معا 21 00:01:10,750 --> 00:01:16,920 أو الاتصال معا مماثلة البنود، مثل صفيف. 22 00:01:16,920 --> 00:01:20,960 صفائف كبيرة ل عنصر بالبحث، ولكن تذكر 23 00:01:20,960 --> 00:01:24,262 أنه من الصعب جدا لإدراج في صفيف، 24 00:01:24,262 --> 00:01:26,470 إلا أننا إدراج في النهاية من أن مجموعة. 25 00:01:26,470 --> 00:01:29,730 >> وخير مثال لدي لذلك هو الإدراج النوع. 26 00:01:29,730 --> 00:01:31,650 اذا كنت أذكر لدينا شريط فيديو على الإدراج النوع، 27 00:01:31,650 --> 00:01:34,110 كان هناك الكثير من حساب تشارك في وجود 28 00:01:34,110 --> 00:01:37,970 لالتقاط العناصر، وتحويلهم للخروج من الطريق لتناسب شيء 29 00:01:37,970 --> 00:01:41,290 في وسط مجموعة الخاصة بك. 30 00:01:41,290 --> 00:01:44,690 يعاني صفائف أيضا من آخر المشكلة، وهي عدم المرونة. 31 00:01:44,690 --> 00:01:47,150 عندما نعلن صفيف، نحن على طلقة واحدة في ذلك. 32 00:01:47,150 --> 00:01:49,790 نصل الى القول، أريد العديد من هذه العناصر. 33 00:01:49,790 --> 00:01:51,940 قد يكون 100، أنه قد تكون 1000، أنه قد 34 00:01:51,940 --> 00:01:55,930 يكون x حيث x هو الرقم الذي المستخدم قدم لنا في موجه أو في الأمر 35 00:01:55,930 --> 00:01:56,630 الخط. 36 00:01:56,630 --> 00:01:59,905 >> ولكن نحن فقط على طلقة واحدة في ذلك، ونحن لا تحصل على ثم يقول يا، في الواقع أنا 37 00:01:59,905 --> 00:02:04,360 يحتاج 101، أو كنت بحاجة X زائد 20. 38 00:02:04,360 --> 00:02:07,910 في وقت متأخر جدا، ونحن قد أعلن بالفعل مجموعة، وإذا كنا نريد للحصول على 101 أو س 39 00:02:07,910 --> 00:02:12,050 بالإضافة إلى 20، علينا أن نعلن مجموعة مختلفة تماما، 40 00:02:12,050 --> 00:02:15,540 نسخ كافة عناصر المصفوفة أكثر، ثم لدينا ما يكفي. 41 00:02:15,540 --> 00:02:19,880 وماذا لو كنا مخطئين مرة أخرى، ما إذا كنا فعلا بحاجة إلى 102، أو X زائد 40، 42 00:02:19,880 --> 00:02:21,970 علينا أن نفعل ذلك مرة أخرى. 43 00:02:21,970 --> 00:02:26,250 حتى انهم غير مرنة جدا لتغيير حجم البيانات لدينا، 44 00:02:26,250 --> 00:02:29,360 ولكن إذا جمعنا معا بعض من الأساسيات التي قمنا بالفعل 45 00:02:29,360 --> 00:02:33,230 علم مؤشرات والهياكل، على وجه الخصوص باستخدام ذاكرة ديناميكية 46 00:02:33,230 --> 00:02:36,180 تخصيص مع malloc، ونحن يمكن وضع هذه القطع معا 47 00:02:36,180 --> 00:02:40,960 لإنشاء بيانات جديدة structure-- ل قائمة ونحن قد say-- مرتبطة منفردة 48 00:02:40,960 --> 00:02:45,400 الذي يسمح لنا أن تنمو و يتقلص مجموعة من القيم 49 00:02:45,400 --> 00:02:48,800 ولن يكون لدينا أي مساحة مهدرة. 50 00:02:48,800 --> 00:02:53,320 >> ذلك مرة أخرى، فإننا ندعو هذه الفكرة، هذه الفكرة، قائمة مرتبطة. 51 00:02:53,320 --> 00:02:56,320 على وجه الخصوص، في هذا الفيديو نحن نتحدث عن قائمة مرتبطة منفردة، 52 00:02:56,320 --> 00:02:59,185 ثم فيديو آخر سنتحدث قوائم حول ربط مضاعف، والتي 53 00:02:59,185 --> 00:03:01,560 هو مجرد الاختلاف على موضوع هنا. 54 00:03:01,560 --> 00:03:05,200 لكن قائمة مرتبطة منفردة ويتكون من العقد، 55 00:03:05,200 --> 00:03:08,559 العقد كونها مجرد term-- مجردة انها مجرد شيء ادعو 56 00:03:08,559 --> 00:03:10,350 هذا هو نوع من هيكل، في الأساس، وأنا؟ 57 00:03:10,350 --> 00:03:16,190 مجرد الذهاب الى نسميها node-- وهذا عقدة عضوين أو اثنين من المجالات. 58 00:03:16,190 --> 00:03:20,300 فقد البيانات، عادة ما يكون صحيح، تعويم حرف، 59 00:03:20,300 --> 00:03:23,790 أو يمكن أن تكون بعض نوع بيانات آخر التي قمت بتحديدها مع نوع مواطنه. 60 00:03:23,790 --> 00:03:29,290 وأنه يحتوي على مؤشر ل عقدة أخرى من نفس النوع. 61 00:03:29,290 --> 00:03:34,710 >> لذلك لدينا اثنين من الأشياء داخل هذه العقدة والبيانات ومؤشر 62 00:03:34,710 --> 00:03:36,380 إلى عقدة أخرى. 63 00:03:36,380 --> 00:03:39,370 وإذا كنت تبدأ تصور هذا، ويمكن كنت تفكر في ذلك 64 00:03:39,370 --> 00:03:42,280 مثل سلسلة من العقد التي ترتبط معا. 65 00:03:42,280 --> 00:03:45,070 لدينا عقدة الأولى، يحتوي على بيانات، ومؤشر 66 00:03:45,070 --> 00:03:49,110 إلى العقدة الثانية، الذي يحتوي على البيانات، ومؤشر إلى العقدة الثالثة. 67 00:03:49,110 --> 00:03:52,940 وولهذا السبب نحن نسميها قائمة مرتبطة، انهم مرتبطة معا. 68 00:03:52,940 --> 00:03:56,070 >> ماذا يعني هذا خاص هيكل العقدة تبدو وكأنها؟ 69 00:03:56,070 --> 00:04:01,120 حسنا، إذا كنت تذكر من لدينا شريط فيديو على تحديد الأنواع المخصصة، مع نوع صفر، 70 00:04:01,120 --> 00:04:05,400 يمكننا تعريف structure-- و اكتب تحديد هيكل من هذا القبيل. 71 00:04:05,400 --> 00:04:11,240 tyepdef البنية sllist، ثم أنا باستخدام قيمة الكلمة هنا تعسفا 72 00:04:11,240 --> 00:04:13,891 للإشارة إلى أي نوع بيانات حقا. 73 00:04:13,891 --> 00:04:16,890 هل يمكن أن تمر على عدد صحيح أو عدد عشري، هل يمكن أن يكون كل ما تريد. 74 00:04:16,890 --> 00:04:19,389 ليس يقتصر على مجرد الأعداد الصحيحة، أو أي شيء من هذا القبيل. 75 00:04:19,389 --> 00:04:22,790 لذلك قيمة هو مجرد تعسفيا نوع البيانات، ومن ثم مؤشر 76 00:04:22,790 --> 00:04:26,310 إلى عقدة أخرى من نفس النوع. 77 00:04:26,310 --> 00:04:29,690 >> الآن، هناك القليل من الصيد هنا مع تحديد هيكل 78 00:04:29,690 --> 00:04:33,030 عندما حان بنية مرجعية الذات. 79 00:04:33,030 --> 00:04:35,340 يجب أن يكون لدي مؤقتة اسم لهيكل بلدي. 80 00:04:35,340 --> 00:04:37,640 في نهاية اليوم الأول نريد بوضوح أن نسميها 81 00:04:37,640 --> 00:04:43,030 عقدة SLL، وهذا في نهاية المطاف جديدة تسمية جزء من بلادي نوع تعريف، 82 00:04:43,030 --> 00:04:47,450 ولكن لا يمكنني استخدام عقدة SLL في منتصف هذا. 83 00:04:47,450 --> 00:04:51,430 والسبب، وأنا لم خلق نوع يسمى عقدة SLL 84 00:04:51,430 --> 00:04:55,200 حتى أنا ضربت هذه النقطة الأخيرة هنا. 85 00:04:55,200 --> 00:04:59,720 حتى هذه النقطة، يجب أن يكون لدي طريقة أخرى للإشارة إلى هذا النوع من البيانات. 86 00:04:59,720 --> 00:05:02,440 >> وهذا هو النفس نوع البيانات المرجعية. 87 00:05:02,440 --> 00:05:06,314 عليه؛ ق نوع بيانات ل الهيكل الذي يحتوي على البيانات، 88 00:05:06,314 --> 00:05:08,480 ومؤشر إلى آخر هيكل من نفس النوع. 89 00:05:08,480 --> 00:05:11,750 لذلك أنا بحاجة إلى أن تكون قادرة على الرجوع إلى هذا النوع من البيانات مؤقتا على الأقل، 90 00:05:11,750 --> 00:05:14,910 حتى يعطيها مؤقتة اسم بنية sllist 91 00:05:14,910 --> 00:05:18,540 يتيح لي الفرصة لثم يقول أنا أريد المؤشر إلى sllist البنية آخر، 92 00:05:18,540 --> 00:05:24,690 نجم البنية sllist، ثم بعد لقد أكملت التعريف، 93 00:05:24,690 --> 00:05:27,220 يمكنني الآن نسمي هذا النوع عقدة SLL. 94 00:05:27,220 --> 00:05:30,520 >> ولهذا السبب ترى هناك اسم مؤقت هنا، 95 00:05:30,520 --> 00:05:31,879 ولكن اسم دائم هنا. 96 00:05:31,879 --> 00:05:33,920 في بعض الأحيان قد ترى تعريفات هيكل، 97 00:05:33,920 --> 00:05:36,570 على سبيل المثال، التي لا المرجعية الذاتية، التي 98 00:05:36,570 --> 00:05:39,390 لم يكن لديك اسم محدد هنا. 99 00:05:39,390 --> 00:05:43,040 فإنها يمكن أن تقول فقط typedef والبنية، فتح متعرج ومن ثم تحديد ذلك. 100 00:05:43,040 --> 00:05:45,620 ولكن إذا كنت البنية هي النفس المرجعية، وهذا هو واحد، 101 00:05:45,620 --> 00:05:49,010 تحتاج إلى تحديد اسم نوع مؤقت. 102 00:05:49,010 --> 00:05:51,310 ولكن في نهاية المطاف، والآن أننا قد فعلت ذلك، 103 00:05:51,310 --> 00:05:53,620 يمكن أن نشير فقط إلى هذه العقد، هذه الوحدات، 104 00:05:53,620 --> 00:05:57,900 كما عقد SLL لأغراض ما تبقى من هذا الفيديو. 105 00:05:57,900 --> 00:06:00,900 >> كل الحق، لذلك نحن نعرف كيف إنشاء عقدة قائمة مرتبطة. 106 00:06:00,900 --> 00:06:03,240 نحن نعرف كيفية تعريف عقدة قائمة مرتبطة. 107 00:06:03,240 --> 00:06:06,670 الآن، إذا كنا في طريقنا للبدء استخدامها لجمع المعلومات، 108 00:06:06,670 --> 00:06:10,360 هناك بضع عمليات نحن تحتاج إلى فهم والتعامل معها. 109 00:06:10,360 --> 00:06:12,860 نحن بحاجة إلى معرفة كيفية إنشاء قائمة مرتبطة من العدم. 110 00:06:12,860 --> 00:06:14,901 اذا لم يكن هناك قائمة بالفعل، نحن نريد أن تبدأ واحدة. 111 00:06:14,901 --> 00:06:16,960 لذلك نحن بحاجة إلى أن تكون قادرة لإنشاء قائمة مرتبط، 112 00:06:16,960 --> 00:06:19,130 نحتاج على الأرجح للبحث من خلال القائمة رابط 113 00:06:19,130 --> 00:06:21,830 العثور على العنصر الذي نبحث عنه. 114 00:06:21,830 --> 00:06:24,430 نحن بحاجة إلى أن تكون قادرة على إدراج أشياء جديدة في القائمة، 115 00:06:24,430 --> 00:06:25,930 نريد قائمتنا لتكون قادرة على النمو. 116 00:06:25,930 --> 00:06:28,638 وعلى نحو مماثل، ونحن نريد أن نكون قادرين لحذف الأشياء من قائمتنا، 117 00:06:28,638 --> 00:06:30,250 نريد قائمتنا لتكون قادرة على الانكماش. 118 00:06:30,250 --> 00:06:32,160 وفي نهاية لدينا برامج خاصة 119 00:06:32,160 --> 00:06:34,550 اذا كنت أذكر أننا حيوي تخصيص الذاكرة 120 00:06:34,550 --> 00:06:38,337 لبناء هذه القوائم عادة، نريد الافراج عن كل من تلك الذاكرة 121 00:06:38,337 --> 00:06:39,670 عندما ننتهي العمل معها. 122 00:06:39,670 --> 00:06:44,627 ولذا فإننا بحاجة إلى أن تكون قادرة على حذف قائمة كاملة مرتبطة في واحد تفشل انقضاض. 123 00:06:44,627 --> 00:06:46,460 لذلك دعونا من خلال الذهاب بعض من هذه العمليات 124 00:06:46,460 --> 00:06:51,192 وكيف يمكننا تصور لهم، يتحدث في التعليمات البرمجية شبة الكود على وجه التحديد. 125 00:06:51,192 --> 00:06:53,150 لذلك نحن نريد لخلق قائمة مرتبطة، لذلك ربما نحن 126 00:06:53,150 --> 00:06:56,480 تريد أن تحدد وظيفة مع هذا النموذج. 127 00:06:56,480 --> 00:07:01,690 SLL نجمة عقدة، وخلق، وأنا مارة في حجة واحدة، وبعض البيانات التعسفي 128 00:07:01,690 --> 00:07:05,530 اكتب مرة أخرى، من نوع البيانات التعسفي. 129 00:07:05,530 --> 00:07:10,482 ولكن أنا returning-- هذه الوظيفة يجب أن العودة إلى لي المؤشر، لمنفردة 130 00:07:10,482 --> 00:07:11,190 ربط العقدة القائمة. 131 00:07:11,190 --> 00:07:14,050 مرة أخرى، ونحن نحاول خلق قائمة مرتبطة من العدم، 132 00:07:14,050 --> 00:07:17,900 لذلك أنا بحاجة مؤشر ل هذه القائمة عندما انتهيت. 133 00:07:17,900 --> 00:07:19,420 >> فما هي الخطوات المتبعة هنا؟ 134 00:07:19,420 --> 00:07:20,960 حسنا، أول شيء أنا تنوي القيام به هو حيوي 135 00:07:20,960 --> 00:07:22,550 تخصيص مساحة لعقدة جديدة. 136 00:07:22,550 --> 00:07:26,689 مرة أخرى، ونحن خلق من ذلك رقيقة الهواء، لذلك نحن بحاجة إلى مساحة malloc لذلك. 137 00:07:26,689 --> 00:07:28,480 وبطبيعة الحال، فورا بعد أن malloc، 138 00:07:28,480 --> 00:07:31,692 نحن دائما التحقق للتأكد من أن لدينا pointer-- لم نحصل على باطل الظهر. 139 00:07:31,692 --> 00:07:33,650 لأنه إذا حاولنا و إذعان مؤشر فارغة، 140 00:07:33,650 --> 00:07:36,190 ونحن في طريقنا تعاني من segfault ونحن لا نريد ذلك. 141 00:07:36,190 --> 00:07:39,510 >> ثم نريد لملء في الميدان، نريد تهيئة حقل القيمة 142 00:07:39,510 --> 00:07:41,690 وتهيئة الحقل التالي. 143 00:07:41,690 --> 00:07:45,450 ثم نريد to-- في نهاية المطاف باعتبارها وظيفة النموذج indicates-- نريد 144 00:07:45,450 --> 00:07:49,940 للعودة مؤشر إلى عقدة SLL. 145 00:07:49,940 --> 00:07:51,710 وذلك ما جعل هذا تبدو بصريا؟ 146 00:07:51,710 --> 00:07:55,230 حسنا، أولا نحن ذاهبون الى حيوي تخصيص مساحة لعقدة SLL الجديدة، 147 00:07:55,230 --> 00:07:58,320 لذلك نحن malloc-- هذا التمثيل البصري 148 00:07:58,320 --> 00:08:00,020 العقدة أنشأنا فقط. 149 00:08:00,020 --> 00:08:02,757 ونحن تحقق للتأكد من انها ليست null-- في هذه الحالة، 150 00:08:02,757 --> 00:08:04,840 ان الصورة ليست لديها أظهرت حتى لو كان باطلا، 151 00:08:04,840 --> 00:08:07,298 كنا قد نفد من الذاكرة، لذلك نحن في حالة جيدة للذهاب الى هناك. 152 00:08:07,298 --> 00:08:10,200 لذلك نحن الآن إلى الخطوة C، تهيئة الحقل قيمة العقد. 153 00:08:10,200 --> 00:08:12,280 حسنا، بناء على هذه الوظيفة استدعاء أنا باستخدام هنا، 154 00:08:12,280 --> 00:08:16,700 يبدو وكأنني أريد أن يمر في 6، لذلك سوف أكون أنا 6 في مجال القيمة. 155 00:08:16,700 --> 00:08:18,865 الآن، تهيئة الحقل التالي. 156 00:08:18,865 --> 00:08:21,640 حسنا، ما أنا ذاهب الى القيام به هناك، لا يوجد شيء المقبل، الحق، 157 00:08:21,640 --> 00:08:23,600 هذا هو الشيء الوحيد في القائمة. 158 00:08:23,600 --> 00:08:27,206 إذن ما هو الشيء التالي في القائمة؟ 159 00:08:27,206 --> 00:08:29,660 >> لا ينبغي أن نشير إلى أي شيء، أليس كذلك. 160 00:08:29,660 --> 00:08:33,600 هناك شيء آخر هناك، فما هو مفهوم نعرف من هذا هو nothing-- 161 00:08:33,600 --> 00:08:35,638 مؤشرات إلى لا شيء؟ 162 00:08:35,638 --> 00:08:37,929 وينبغي أن يكون ربما نريد لوضع مؤشر فارغة هناك، 163 00:08:37,929 --> 00:08:40,178 وسوف تمثل لاغية المؤشر كما مجرد مربع أحمر، 164 00:08:40,178 --> 00:08:41,559 لا نستطيع أن نذهب إلى أبعد من ذلك. 165 00:08:41,559 --> 00:08:44,430 كما سنرى بعد قليل على، سيكون لدينا في نهاية المطاف السلاسل 166 00:08:44,430 --> 00:08:46,330 من السهام التي تربط هذه العقد معا، 167 00:08:46,330 --> 00:08:48,480 ولكن عندما ضرب مربع أحمر، وهذا باطل، 168 00:08:48,480 --> 00:08:51,150 لا نستطيع أن نذهب إلى أبعد من ذلك، هذا هو نهاية القائمة. 169 00:08:51,150 --> 00:08:53,960 >> وأخيرا، نحن نريد فقط أن عودة مؤشر إلى هذه العقدة. 170 00:08:53,960 --> 00:08:56,160 ولذا فإننا سوف يطلق عليه الجديدة، وسيعود جديدة 171 00:08:56,160 --> 00:08:59,370 لذلك يمكن استخدامها في مهما كانت وظيفة إنشائه. 172 00:08:59,370 --> 00:09:03,100 لذلك هناك نذهب، لقد قمنا بإنشاء منفردة ربط العقدة قائمة من العدم، 173 00:09:03,100 --> 00:09:05,920 والآن لدينا قائمة نتمكن من العمل مع. 174 00:09:05,920 --> 00:09:08,260 >> الآن، دعونا نقول أننا بالفعل لدينا سلسلة كبيرة، 175 00:09:08,260 --> 00:09:09,800 ونحن نريد أن تجد شيئا في ذلك. 176 00:09:09,800 --> 00:09:12,716 ونحن نريد وظيفة ما يجري للعودة صحيحة أو خاطئة، اعتمادا 177 00:09:12,716 --> 00:09:15,840 على ما إذا كانت قيمة موجودة في تلك القائمة. 178 00:09:15,840 --> 00:09:18,160 وظيفة النموذج، أو الإعلان عن تلك الوظيفة، 179 00:09:18,160 --> 00:09:23,320 قد تبدو وكأنها this-- منطقي العثور عليها، و ثم نريد أن تمر في حجتين. 180 00:09:23,320 --> 00:09:26,996 >> الأولى، هي مؤشر إلى العنصر الأول من القائمة المرتبطة. 181 00:09:26,996 --> 00:09:29,620 هذا هو في الواقع شيء عليك دائما نريد أن تتبع، 182 00:09:29,620 --> 00:09:33,110 وفعلا قد يكون شيئا حتى كنت وضعت في متغير عمومي. 183 00:09:33,110 --> 00:09:35,360 بمجرد إنشاء قائمة، كنت دائما، ودائما 184 00:09:35,360 --> 00:09:38,990 تريد أن تتبع جدا العنصر الأول من القائمة. 185 00:09:38,990 --> 00:09:43,690 وبهذه الطريقة يمكنك الرجوع إلى كل أخرى العناصر التي كتبها مجرد عقب سلسلة، 186 00:09:43,690 --> 00:09:47,300 دون الحاجة للحفاظ على مؤشرات سليمة إلى كل عنصر واحد. 187 00:09:47,300 --> 00:09:50,920 ما عليك سوى أن تتبع أول واحد لو انهم كل بالسلاسل معا. 188 00:09:50,920 --> 00:09:52,460 >> ثم الشيء الثاني نحن يمر مرة أخرى 189 00:09:52,460 --> 00:09:54,376 غير some-- تعسفا أيا كان نوع البيانات نحن 190 00:09:54,376 --> 00:09:59,640 يبحث عن وجود داخل نأمل احدة من العقد في القائمة. 191 00:09:59,640 --> 00:10:00,980 فما هي الخطوات؟ 192 00:10:00,980 --> 00:10:04,250 كذلك، فإن أول شيء نقوم به هو نحن إنشاء مؤشر مستعرضة 193 00:10:04,250 --> 00:10:06,015 مشيرا إلى رأس القوائم. 194 00:10:06,015 --> 00:10:08,890 حسنا، لماذا نفعل ذلك، ونحن بالفعل لدينا مؤشر على رأس القوائم، 195 00:10:08,890 --> 00:10:10,974 لماذا لا يمكننا فقط نقل أن أحد حولها؟ 196 00:10:10,974 --> 00:10:13,140 حسنا، كما قلت للتو، من المهم حقا بالنسبة لنا 197 00:10:13,140 --> 00:10:17,580 للحفاظ على المسار دائما ل العنصر الأول جدا في القائمة. 198 00:10:17,580 --> 00:10:21,270 وحتى انها في الواقع أفضل لإنشاء نسخة مكررة من ذلك، 199 00:10:21,270 --> 00:10:25,350 واستخدام هذا التحرك حتى نتمكن أبدا نقل بطريق الخطأ بعيدا، أو أننا دائما 200 00:10:25,350 --> 00:10:30,430 يملك المؤشر في مرحلة ما هو الحق على العنصر الأول من القائمة. 201 00:10:30,430 --> 00:10:33,290 لذلك فمن الأفضل لخلق والثانية التي نستخدمها للتحرك. 202 00:10:33,290 --> 00:10:35,877 >> ثم نحن فقط مقارنة سواء حقل القيمة في تلك العقدة 203 00:10:35,877 --> 00:10:38,960 هو ما نبحث عنه، وإذا كان لا، نحن فقط الانتقال إلى العقدة المقبل. 204 00:10:38,960 --> 00:10:41,040 ونستمر في فعل ذلك أكثر، وأكثر، وأكثر، 205 00:10:41,040 --> 00:10:44,811 حتى ونحن إما أن تجد العنصر، أو أننا ضرب 206 00:10:44,811 --> 00:10:47,310 null-- نحن قد وصلنا إلى نهاية من قائمة وانه ليس هناك. 207 00:10:47,310 --> 00:10:50,540 هذا نأمل أن قرع جرس لك البحث الخطي كما للتو، 208 00:10:50,540 --> 00:10:54,430 نحن فقط تكرار ذلك في هيكل قائمة مرتبطة منفردة 209 00:10:54,430 --> 00:10:56,280 بدلا من استخدام صفيف للقيام بذلك. 210 00:10:56,280 --> 00:10:58,210 >> حتى هنا مثال قائمة مرتبطة منفردة. 211 00:10:58,210 --> 00:11:00,043 يتكون هذا واحد من خمسة العقد، وليس لدينا 212 00:11:00,043 --> 00:11:04,330 مؤشر إلى رئيس القائمة، وهو ما يسمى القائمة. 213 00:11:04,330 --> 00:11:07,385 أول شيء نريد أن نفعله هو مرة أخرى، وخلق هذا المؤشر اجتياز. 214 00:11:07,385 --> 00:11:09,760 لذلك لدينا الآن اثنين من المؤشرات التي تشير إلى نفس الشيء. 215 00:11:09,760 --> 00:11:15,025 >> الآن، لاحظ هنا أيضا، لم أكن يجب أن malloc أي مساحة للبالسفر. 216 00:11:15,025 --> 00:11:18,970 أنا لا أقول بالسفر يساوي malloc شيء، تلك العقدة موجود بالفعل، 217 00:11:18,970 --> 00:11:21,160 هذه المساحة في الذاكرة موجود بالفعل. 218 00:11:21,160 --> 00:11:24,290 لذلك كل ما أفعله هو في الواقع خلق مؤشر آخر على ذلك. 219 00:11:24,290 --> 00:11:28,210 أنا لا mallocing إضافي الفضاء، فقط الآن اثنين من المؤشرات 220 00:11:28,210 --> 00:11:31,370 لافتا إلى نفس الشيء. 221 00:11:31,370 --> 00:11:33,710 >> ذلك هو 2 ما أبحث عنه؟ 222 00:11:33,710 --> 00:11:37,220 حسنا، لا، وذلك بدلا أنا الذهاب للانتقال إلى المرحلة التالية. 223 00:11:37,220 --> 00:11:41,740 وذلك أساسا أود أن أقول، بالسفر يساوي بالسفر المقبل. 224 00:11:41,740 --> 00:11:43,630 هو 3 ما أنا أبحث عن، لا. 225 00:11:43,630 --> 00:11:45,780 لذلك أنا لا تزال تسير من خلال، حتى في نهاية المطاف 226 00:11:45,780 --> 00:11:48,690 الحصول على 6 وهو ما أنا أبحث للبناء على استدعاء دالة 227 00:11:48,690 --> 00:11:51,600 لدي في الجزء العلوي هناك، وهكذا انتهيت. 228 00:11:51,600 --> 00:11:54,150 >> الآن، ما إذا كان العنصر أنا تبحث عن يست في القائمة، 229 00:11:54,150 --> 00:11:55,510 وأنه لا يزال الذهاب إلى العمل؟ 230 00:11:55,510 --> 00:11:57,120 حسنا، لاحظ أن القائمة هنا يختلف بمهارة، 231 00:11:57,120 --> 00:11:59,410 وهذا هو آخر شيء هذا المهم مع القوائم المرتبطة، 232 00:11:59,410 --> 00:12:01,780 لم يكن لديك للحفاظ على لهم في أي ترتيب معين. 233 00:12:01,780 --> 00:12:05,390 يمكنك إذا كنت تريد، ولكن كنت قد لاحظت بالفعل 234 00:12:05,390 --> 00:12:09,310 اننا لا تتبع ما العنصر رقم نحن في. 235 00:12:09,310 --> 00:12:13,150 >> وهذا النوع من التجارة أحد أننا يكون مع قائمة مرتبطة الآيات المصفوفات، 236 00:12:13,150 --> 00:12:15,300 وذلك ليس لدينا وصول عشوائي بعد الآن. 237 00:12:15,300 --> 00:12:18,150 لا نستطيع أن نقول فقط، أريد للذهاب إلى العنصر 0TH، 238 00:12:18,150 --> 00:12:21,410 أو العنصر 6TH من مجموعة بلدي، الذي يمكنني القيام به في صفيف. 239 00:12:21,410 --> 00:12:25,080 لا أستطيع أن أقول أريد أن أذهب إلى عنصر 0TH، أو العنصر 6TH، 240 00:12:25,080 --> 00:12:30,360 أو العنصر ال25 من قائمتي مرتبط، ليس هناك مؤشر المرتبطة بها. 241 00:12:30,360 --> 00:12:33,660 ولذا فإنه لا يهم حقا إذا كان لنا أن الحفاظ على قائمتنا في النظام. 242 00:12:33,660 --> 00:12:36,080 إذا كنت تريد لك يمكن بالتأكيد، ولكن هناك 243 00:12:36,080 --> 00:12:38,567 لا يوجد سبب لماذا تحتاج إلى يتم الحفاظ عليها في أي أمر. 244 00:12:38,567 --> 00:12:40,400 ذلك مرة أخرى، دعونا نحاول و العثور على 6 في هذه القائمة. 245 00:12:40,400 --> 00:12:43,200 حسنا، نحن نبدأ في بداية، لا نجد 6، 246 00:12:43,200 --> 00:12:47,690 ثم واصلنا عدم العثور على 6، حتى نحن في نهاية المطاف الحصول على هنا. 247 00:12:47,690 --> 00:12:52,790 الحق في ذلك نقاط الآن بالسفر إلى العقدة تحتوي على 8، وستة ليست هناك. 248 00:12:52,790 --> 00:12:55,250 >> لذا فإن الخطوة المقبلة ستكون للذهاب إلى مؤشر المقبل، 249 00:12:55,250 --> 00:12:57,440 أقول ذلك بالسفر يساوي بالسفر المقبل. 250 00:12:57,440 --> 00:13:00,750 حسنا، بالسفر المقبل، وأشار المربع الأحمر هناك، لاغيا. 251 00:13:00,750 --> 00:13:03,020 ولذلك لا يوجد في أي مكان آخر ل تذهب، وحتى في هذه النقطة 252 00:13:03,020 --> 00:13:06,120 يمكننا أن نستنتج أننا وصلنا نهاية القائمة المرتبطة، 253 00:13:06,120 --> 00:13:07,190 و6 ليس في هناك. 254 00:13:07,190 --> 00:13:10,980 وسيتم إعادتها خطأ في هذه الحالة. 255 00:13:10,980 --> 00:13:14,540 >> OK، كيف يمكننا إدراج جديدة عقدة في قائمة مرتبطة؟ 256 00:13:14,540 --> 00:13:17,310 لذلك كنا قادرين على خلق قائمة مرتبطة من العدم، 257 00:13:17,310 --> 00:13:19,370 ولكن ربما نحن نريد ل بناء سلسلة وليس 258 00:13:19,370 --> 00:13:22,620 إنشاء مجموعة من قوائم مختلفة. 259 00:13:22,620 --> 00:13:25,700 نحن نريد أن يكون قائمة واحدة أن لديه مجموعة من العقد في ذلك، 260 00:13:25,700 --> 00:13:28,040 ليس حفنة من القوائم مع عقدة واحدة. 261 00:13:28,040 --> 00:13:31,260 لذلك نحن لا يمكن أن تبقي فقط باستخدام إنشاء وظيفة حددنا في وقت سابق، ونحن الآن 262 00:13:31,260 --> 00:13:33,860 تريد إدراج في قائمة موجود بالفعل. 263 00:13:33,860 --> 00:13:36,499 >> حتى هذه الحالة، نحن ذاهبون لتمرير في حجتين، 264 00:13:36,499 --> 00:13:39,290 المؤشر إلى رأس تلك القائمة التي نريد أن نضيف إلى ربط. 265 00:13:39,290 --> 00:13:40,910 مرة أخرى، وهذا هو السبب في أنه من ذلك المهم أننا دائما 266 00:13:40,910 --> 00:13:43,400 تتبع ذلك، ل انها الطريقة الوحيدة التي يمكننا حقا 267 00:13:43,400 --> 00:13:46,690 أن الرجوع إلى قائمة بأكملها فقط عن طريق مؤشر إلى العنصر الأول. 268 00:13:46,690 --> 00:13:49,360 لذلك نحن نريد أن يمر في مؤشر إلى أن العنصر الأول، 269 00:13:49,360 --> 00:13:52,226 ومهما كانت قيمة نحن تريد إضافتها إلى القائمة. 270 00:13:52,226 --> 00:13:54,600 وفي النهاية هذه الوظيفة سوف تعود مؤشر 271 00:13:54,600 --> 00:13:57,980 إلى رئيس جديد للقائمة مرتبطة. 272 00:13:57,980 --> 00:13:59,700 >> ما هي الخطوات المتبعة هنا؟ 273 00:13:59,700 --> 00:14:02,249 حسنا، تماما مثل مع خلق، نحن بحاجة إلى تخصيص حيوي 274 00:14:02,249 --> 00:14:05,540 مساحة للعقدة جديدة، وتحقق للتأكد بالتأكيد نحن لا ينفد من الذاكرة، مرة أخرى، 275 00:14:05,540 --> 00:14:07,150 لأننا باستخدام malloc. 276 00:14:07,150 --> 00:14:09,080 ثم نريد أن تعبئة وتضاف العقدة، 277 00:14:09,080 --> 00:14:12,730 ولذلك وضعت الرقم، أيا كان فال هو، في العقدة. 278 00:14:12,730 --> 00:14:17,310 نحن نريد لإدراج عقدة في بداية القائمة المرتبطة. 279 00:14:17,310 --> 00:14:19,619 >> هناك سبب أنني تريد أن تفعل هذا، وذلك 280 00:14:19,619 --> 00:14:21,910 قد يكون من المفيد أخذ الثاني وقفة الفيديو هنا، 281 00:14:21,910 --> 00:14:25,860 ونفكر لماذا أريد أن إدراج في بداية مرتبط 282 00:14:25,860 --> 00:14:26,589 القائمة. 283 00:14:26,589 --> 00:14:28,630 مرة أخرى، ذكرت في وقت سابق أنه لا حقا 284 00:14:28,630 --> 00:14:33,020 يهم إذا علينا الحفاظ عليه في أي أجل، ولذلك ربما يكون هذا هو أدنى فكرة. 285 00:14:33,020 --> 00:14:36,040 ورأيت ما سيحدث لو أننا أراد to-- أو من ثانية واحدة 286 00:14:36,040 --> 00:14:37,360 منذ متى نحن ذاهبون من خلال البحث الذي 287 00:14:37,360 --> 00:14:39,235 يمكن أن نرى ما يمكن يحدث إذا كنا نحاول 288 00:14:39,235 --> 00:14:41,330 لإدراج في نهاية القائمة. 289 00:14:41,330 --> 00:14:44,750 لأننا لم يكن لديك المؤشر إلى نهاية القائمة. 290 00:14:44,750 --> 00:14:47,490 >> لذلك السبب الذي أريد لإدراج في البداية، 291 00:14:47,490 --> 00:14:49,380 لأنني يمكن أن تفعل ذلك على الفور. 292 00:14:49,380 --> 00:14:52,730 لدي المؤشر في البداية، و سنرى هذا في البصرية في الثانية. 293 00:14:52,730 --> 00:14:55,605 ولكن إذا كنت تريد إدراج في النهاية، لدي لبدء في البداية، 294 00:14:55,605 --> 00:14:58,760 اجتياز كل وسيلة ل نهاية، ثم تك عليه. 295 00:14:58,760 --> 00:15:01,420 بحيث يعني أن إدراج في نهاية القائمة 296 00:15:01,420 --> 00:15:04,140 سيصبح س ن العملية، تعود 297 00:15:04,140 --> 00:15:06,720 لمناقشتنا ل التعقيد الحسابي. 298 00:15:06,720 --> 00:15:10,140 انها تريد ان تصبح س العملية n، حيث كما حصلت قائمة أكبر، وأكبر، 299 00:15:10,140 --> 00:15:13,310 وأكبر، وأنها سوف تصبح أكثر و من الصعب تك شيئا 300 00:15:13,310 --> 00:15:14,661 على في نهاية المطاف. 301 00:15:14,661 --> 00:15:17,410 ولكن من السهل دائما حقا ل تك شيئا على في البداية، 302 00:15:17,410 --> 00:15:19,060 كنت دائما في البداية. 303 00:15:19,060 --> 00:15:21,620 >> وسنرى البصرية لهذا مرة أخرى. 304 00:15:21,620 --> 00:15:24,100 ثم بمجرد ان تنتهي من ذلك، مرة واحدة لقد إدراج عقدة جديدة، 305 00:15:24,100 --> 00:15:26,880 نحن نريد أن يعود المؤشر جهدنا ل الرئيس الجديد لقائمة مرتبطة، التي 306 00:15:26,880 --> 00:15:29,213 منذ نحن إدراج في بداية، سوف يكون في الواقع 307 00:15:29,213 --> 00:15:31,060 مؤشر إلى عقدة أنشأنا فقط. 308 00:15:31,060 --> 00:15:33,280 دعونا تصور هذا، لأنني أعتقد أنها سوف تساعد. 309 00:15:33,280 --> 00:15:36,661 >> حتى هنا قائمتنا، وتتكون من أربعة عناصر، وهي العقدة التي تحتوي على 15، 310 00:15:36,661 --> 00:15:38,410 الأمر الذي يشير إلى عقدة تحتوي على 9، والتي 311 00:15:38,410 --> 00:15:41,370 يشير إلى العقدة التي تحتوي على 13، مما يشير إلى العقدة التي تحتوي على 312 00:15:41,370 --> 00:15:44,840 10، والتي لديها لاغية المؤشر كما مؤشر المقبل 313 00:15:44,840 --> 00:15:47,010 لذلك هذا هو نهاية القائمة. 314 00:15:47,010 --> 00:15:50,200 لذلك نحن نريد لإدراج عقدة جديدة بقيمة 12 315 00:15:50,200 --> 00:15:52,720 في بداية هذا القائمة، ماذا نفعل؟ 316 00:15:52,720 --> 00:15:58,770 حسنا، أولا نحن malloc الفضاء ل العقدة، ومن ثم وضعنا 12 في هناك. 317 00:15:58,770 --> 00:16:02,211 >> حتى الآن نحن وصلنا الى نقطة اتخاذ القرار، أليس كذلك؟ 318 00:16:02,211 --> 00:16:03,960 لدينا بضع المؤشرات التي نستطيع 319 00:16:03,960 --> 00:16:06,770 نقل، التي ينبغي لأحد أن ننتقل أولا؟ 320 00:16:06,770 --> 00:16:09,250 وينبغي أن نجعل 12 نقطة ل الرئيس الجديد للlist-- 321 00:16:09,250 --> 00:16:13,020 أو عفوا، يجب أن نجعل 12 إشارة إلى رئيس القديم من القائمة؟ 322 00:16:13,020 --> 00:16:15,319 أو ينبغي أن نقول أن يبدأ القائمة الآن في 12. 323 00:16:15,319 --> 00:16:17,110 هناك تمييز هناك، ونحن سوف ننظر 324 00:16:17,110 --> 00:16:19,870 على ما يحدث مع كل من في الثانية. 325 00:16:19,870 --> 00:16:23,350 >> ولكن هذا يؤدي إلى موضوع كبير للالشريط الجانبي، 326 00:16:23,350 --> 00:16:26,280 وهو أن واحدة من أصعب الأمور مع القوائم المرتبطة 327 00:16:26,280 --> 00:16:30,980 هو ترتيب المؤشرات في الترتيب الصحيح. 328 00:16:30,980 --> 00:16:34,520 إذا قمت بنقل الأشياء من النظام، يمكنك في نهاية المطاف عن طريق الخطأ 329 00:16:34,520 --> 00:16:36,050 اليتم بقية القائمة. 330 00:16:36,050 --> 00:16:37,300 وهنا مثال على ذلك. 331 00:16:37,300 --> 00:16:40,540 لذلك دعونا نذهب مع فكرة of-- حسنا، لقد خلقت فقط 12. 332 00:16:40,540 --> 00:16:43,180 نحن نعرف 12 سيكون الرئيس الجديد للقائمة، 333 00:16:43,180 --> 00:16:47,660 وهكذا لماذا لا نتحرك فقط مؤشر القائمة إلى نقطة هناك. 334 00:16:47,660 --> 00:16:49,070 >> حسنا، هذا جيد. 335 00:16:49,070 --> 00:16:51,560 وحتى الآن حيث يقوم 12 نقطة في المرة القادمة؟ 336 00:16:51,560 --> 00:16:54,580 أعني، بصريا يمكننا أن نرى أنه سوف يشيرون إلى 15، 337 00:16:54,580 --> 00:16:57,250 كبشر من الواضح جدا بالنسبة لنا. 338 00:16:57,250 --> 00:17:00,300 كيف يمكن للكمبيوتر تعلم؟ 339 00:17:00,300 --> 00:17:02,720 ليس لدينا أي شيء لافتا الى 15 بعد الآن، أليس كذلك؟ 340 00:17:02,720 --> 00:17:05,869 >> لقد فقدت أي قدرة على الرجوع إلى 15. 341 00:17:05,869 --> 00:17:11,460 لا نستطيع أن نقول السهم الجديد يساوي القادمة شيء، لا يوجد شيء هناك. 342 00:17:11,460 --> 00:17:13,510 في الواقع، لقد اليتامى بقية القائمة 343 00:17:13,510 --> 00:17:16,465 بذلك، لدينا كسر عن طريق الخطأ في السلسلة. 344 00:17:16,465 --> 00:17:18,089 ونحن بالتأكيد لا نريد ان نفعل ذلك. 345 00:17:18,089 --> 00:17:20,000 >> لذلك دعونا نعود ونحاول مرة أخرى. 346 00:17:20,000 --> 00:17:24,060 ربما الشيء الصحيح الذي ينبغي القيام به هو وضع 12 في مؤشر المقبل 347 00:17:24,060 --> 00:17:28,290 في الرأس القديم من قائمة البداية، ثم اننا يمكن ان تتحرك لائحة أكثر. 348 00:17:28,290 --> 00:17:30,420 في واقع الأمر، وهذا هو الترتيب الصحيح أننا 349 00:17:30,420 --> 00:17:32,836 تحتاج إلى متابعة عندما نكون العمل مع قائمة مرتبطة منفردة. 350 00:17:32,836 --> 00:17:36,460 نحن دائما نريد لربط عنصر جديد إلى القائمة، 351 00:17:36,460 --> 00:17:41,010 قبل أن نتخذ هذا النوع من خطوة هامة لتغيير 352 00:17:41,010 --> 00:17:43,360 حيث رأس قائمة مرتبطة هو. 353 00:17:43,360 --> 00:17:46,740 مرة أخرى، هذا شيء من هذا القبيل الأساسي، نحن لا نريد أن تفقد مسارها من ذلك. 354 00:17:46,740 --> 00:17:49,310 >> لذلك نحن نريد أن نتأكد من أن يتم ربط كل شيء معا، 355 00:17:49,310 --> 00:17:52,040 قبل أن ننتقل هذا المؤشر. 356 00:17:52,040 --> 00:17:55,300 وحتى هذا سيكون الترتيب الصحيح، الذي هو ربط 12 في القائمة، 357 00:17:55,300 --> 00:17:57,630 ثم يقول أن القائمة تبدأ 12. 358 00:17:57,630 --> 00:18:00,860 إذا كان لنا أن قال وتبدأ القائمة في 12 و ثم حاولت الاتصال 12 إلى القائمة، 359 00:18:00,860 --> 00:18:02,193 لقد رأينا بالفعل ما يحدث. 360 00:18:02,193 --> 00:18:04,920 نفقد القائمة عن طريق الخطأ. 361 00:18:04,920 --> 00:18:06,740 >> OK، لذلك أكثر شيء واحد للحديث عن. 362 00:18:06,740 --> 00:18:09,750 ماذا لو كنا نريد للتخلص من لكامل قائمة ربطت في وقت واحد؟ 363 00:18:09,750 --> 00:18:11,750 مرة أخرى، نحن mallocing كل هذا الفضاء، ولذا فإننا 364 00:18:11,750 --> 00:18:13,351 تحتاج إلى تحريرها عندما ننتهي. 365 00:18:13,351 --> 00:18:15,350 حتى الآن نحن نريد أن حذف القائمة المرتبطة بأكملها. 366 00:18:15,350 --> 00:18:16,850 حسنا، ماذا نريد أن نفعل؟ 367 00:18:16,850 --> 00:18:20,460 >> إذا كنا قد وصلنا إلى مؤشر فارغة، ونحن تريد أن تتوقف، وإلا، فقط حذف 368 00:18:20,460 --> 00:18:23,420 بقية القائمة ثم يحررني. 369 00:18:23,420 --> 00:18:28,890 حذف بقية القائمة، ثم تحرير العقدة الحالية. 370 00:18:28,890 --> 00:18:32,850 ما هذا الصوت مثل، ما الأسلوب ديك تحدثنا 371 00:18:32,850 --> 00:18:35,440 عن سبق هذا الصوت مثل؟ 372 00:18:35,440 --> 00:18:39,560 حذف الجميع، ثم أعود وحذف لي. 373 00:18:39,560 --> 00:18:42,380 >> هذا العودية، لقد حققنا مشكلة أصغر قليلا، 374 00:18:42,380 --> 00:18:46,910 نقوله حذف الجميع آخر، ثم يمكنك حذف لي. 375 00:18:46,910 --> 00:18:50,940 ومزيد من أسفل الطريق، تلك العقدة سيقول، حذف الجميع. 376 00:18:50,940 --> 00:18:53,940 ولكن في نهاية المطاف أننا سنصل إلى النقطة حيث كانت القائمة فارغة، 377 00:18:53,940 --> 00:18:55,310 وهذا هو الحال لدينا قاعدة. 378 00:18:55,310 --> 00:18:57,010 >> لذلك دعونا نلقي نظرة على هذا، وكيف يمكن أن تعمل. 379 00:18:57,010 --> 00:18:59,759 حتى هنا قائمتنا، هو نفسه قائمة كنا نتحدث فقط عن، 380 00:18:59,759 --> 00:19:00,980 وهناك خطوات. 381 00:19:00,980 --> 00:19:04,200 هناك الكثير من النصوص هنا، ولكن نأمل أن التصور سوف تساعد. 382 00:19:04,200 --> 00:19:08,557 >> لذلك نحن have-- وأنا سحبت أيضا حتى لدينا إطارات كومة التوضيح 383 00:19:08,557 --> 00:19:10,890 من لدينا شريط فيديو على أكوام المكالمة، ونأمل كل هذا 384 00:19:10,890 --> 00:19:13,260 معا سوف تظهر لك ما يحدث. 385 00:19:13,260 --> 00:19:14,510 حتى هنا كود شبة الكود لدينا. 386 00:19:14,510 --> 00:19:17,830 اذا وصلنا الى فارغة مؤشر، ووقف، وإلا، 387 00:19:17,830 --> 00:19:21,320 حذف بقية القائمة، ثم تحرير العقدة الحالية. 388 00:19:21,320 --> 00:19:25,700 حتى الآن، list-- مؤشر أننا 389 00:19:25,700 --> 00:19:28,410 يمر في لتدمير النقاط إلى 12. 390 00:19:28,410 --> 00:19:33,340 12 ليس مؤشر فارغة، لذلك نحن الذهاب إلى حذف بقية القائمة. 391 00:19:33,340 --> 00:19:35,450 >> ما هو حذف بقيتنا المعنية؟ 392 00:19:35,450 --> 00:19:37,950 كذلك، فهذا يعني اتخاذ دعوة لتدمير قائلا 393 00:19:37,950 --> 00:19:42,060 أن 15 هو بداية لل بقية القائمة نريد التخلص منه. 394 00:19:42,060 --> 00:19:47,480 وبالتالي فإن الدعوة لتدمير 12 هو نوع من معلقة. 395 00:19:47,480 --> 00:19:52,690 المجمدة عليه هناك، والانتظار ل الدعوة إلى تدمير 15، لإنهاء مهمتها. 396 00:19:52,690 --> 00:19:56,280 >> حسنا، 15 ليس مؤشر فارغة، و لذلك يحدث أن أقول، كل الحق، 397 00:19:56,280 --> 00:19:58,450 كذلك، حذف بقية القائمة. 398 00:19:58,450 --> 00:20:00,760 تبدأ بقية القائمة في 9، وذلك سنقوم فقط 399 00:20:00,760 --> 00:20:04,514 الانتظار حتى تقوم بحذف كل ما الاشياء، ثم أعود وحذف لي. 400 00:20:04,514 --> 00:20:06,680 حسنا 9 ذاهب الى القول، أيضا، أنا لست مؤشر فارغة، 401 00:20:06,680 --> 00:20:09,020 لذلك حذف بقية القائمة من هنا. 402 00:20:09,020 --> 00:20:11,805 وذلك في محاولة وتدمير 13. 403 00:20:11,805 --> 00:20:15,550 13 يقول: أنا لست مؤشر فارغة، نفس الشيء، فإنه يمر باك. 404 00:20:15,550 --> 00:20:17,930 10 ليس مؤشر فارغة، 10 يحتوي على مؤشر فارغة، 405 00:20:17,930 --> 00:20:20,200 ولكن 10 ليس في حد ذاته لاغية مؤشر في الوقت الراهن، 406 00:20:20,200 --> 00:20:22,470 وهكذا يمر رهيبة جدا. 407 00:20:22,470 --> 00:20:25,560 >> والآن قائمة نقطة هناك، حقا أن أشير إلى some-- 408 00:20:25,560 --> 00:20:28,710 إذا كان لي مساحة أكبر في الصورة، ذلك أن أشير إلى بعض المساحة عشوائي 409 00:20:28,710 --> 00:20:29,960 أننا لا نعرف ما هو عليه. 410 00:20:29,960 --> 00:20:34,680 انها مؤشر فارغة على الرغم من قائمة حرفيا الآن تعيينها من القيم الخالية. 411 00:20:34,680 --> 00:20:36,820 انها لافتا الحق داخل هذا المربع الأحمر. 412 00:20:36,820 --> 00:20:39,960 وصلنا مؤشر فارغة، لذلك نحن يمكن أن تتوقف، وننتهي. 413 00:20:39,960 --> 00:20:46,230 >> وبحيث إطار الأرجواني هو now-- في أعلى stack-- هذا الإطار النشط، 414 00:20:46,230 --> 00:20:47,017 ولكن انها فعلت. 415 00:20:47,017 --> 00:20:48,600 إذا كنا قد وصلت مؤشر فارغة، ووقف. 416 00:20:48,600 --> 00:20:51,290 لم نفعل أي شيء، نحن لا يمكن تحرير مؤشر فارغة، 417 00:20:51,290 --> 00:20:55,070 نحن لم malloc أي الفضاء، وحتى ننتهي. 418 00:20:55,070 --> 00:20:57,590 بحيث إطار وظيفة ودمرت، ونحن 419 00:20:57,590 --> 00:21:00,930 resume-- نلتقط حيث غادرنا قبالة مع المقبل أعلى واحد، والتي 420 00:21:00,930 --> 00:21:02,807 هو هذا الإطار الأزرق الداكن هنا. 421 00:21:02,807 --> 00:21:04,390 لذلك نحن التقاط الحق حيث توقفنا. 422 00:21:04,390 --> 00:21:06,598 حذفنا بقية قائمة بالفعل، لذلك نحن الآن 423 00:21:06,598 --> 00:21:08,000 الذهاب لتحرير العقد الحالي. 424 00:21:08,000 --> 00:21:12,920 وحتى الآن نستطيع أن نحرر هذه العقدة، والآن لقد وصلنا إلى نهاية الدالة. 425 00:21:12,920 --> 00:21:16,810 وهكذا يتم تدمير هذا الإطار وظيفة، ونلتقط في واحدة الأزرق الفاتح. 426 00:21:16,810 --> 00:21:20,650 >> لذلك says-- لقد done-- بالفعل حذف بقية القائمة، لذلك 427 00:21:20,650 --> 00:21:23,140 تحرير العقدة الحالية. 428 00:21:23,140 --> 00:21:26,520 والآن الإطار الأصفر هو مرة أخرى في أعلى المكدس. 429 00:21:26,520 --> 00:21:29,655 وهكذا كما ترون، نحن الآن تدمير القائمة من اليمين إلى اليسار. 430 00:21:29,655 --> 00:21:33,710 431 00:21:33,710 --> 00:21:37,280 >> ماذا كان سيحدث، على الرغم من إذا كان علينا القيام به الأشياء بطريقة خاطئة؟ 432 00:21:37,280 --> 00:21:39,410 تماما مثل عندما حاولنا لإضافة عنصر. 433 00:21:39,410 --> 00:21:41,909 إذا كنا افسدت السلسلة، إذا نحن لا ربط مؤشرات 434 00:21:41,909 --> 00:21:44,690 بالترتيب الصحيح، واذا كنا الافراج فقط العنصر الأول، 435 00:21:44,690 --> 00:21:47,420 إذا كان لنا أن تحررت للتو رئيس القائمة، ونحن الآن 436 00:21:47,420 --> 00:21:49,642 ليس هناك طريقة للإشارة إلى بقية القائمة. 437 00:21:49,642 --> 00:21:51,350 وهكذا سيكون لدينا كل شيء اليتامى، 438 00:21:51,350 --> 00:21:53,880 سيكون لدينا ما هو دعا تسرب الذاكرة. 439 00:21:53,880 --> 00:21:56,800 إذا كنت تذكر من لدينا شريط فيديو على تخصيص الذاكرة الديناميكية، 440 00:21:56,800 --> 00:21:58,650 هذا ليس أمرا جيدا للغاية. 441 00:21:58,650 --> 00:22:00,810 >> لذلك كما قلت، هناك هي عدة عمليات 442 00:22:00,810 --> 00:22:04,010 أننا في حاجة إلى استخدامها للعمل مع قائمة مرتبطة على نحو فعال. 443 00:22:04,010 --> 00:22:08,430 وكنت قد لاحظت أنا حذفت واحد، حذف عنصر واحد من مرتبط 444 00:22:08,430 --> 00:22:09,064 القائمة. 445 00:22:09,064 --> 00:22:10,980 السبب في أنني فعلت ذلك هو في الواقع نوع من 446 00:22:10,980 --> 00:22:14,360 صعبة للتفكير في كيفية حذف عنصر واحد من منفردة 447 00:22:14,360 --> 00:22:15,600 قائمة مرتبطة. 448 00:22:15,600 --> 00:22:19,950 نحن بحاجة إلى أن تكون قادرة على تخطي شيء في القائمة التي 449 00:22:19,950 --> 00:22:22,975 يعني نصل إلى أننا point-- تريد حذف هذه node-- 450 00:22:22,975 --> 00:22:25,350 ولكن من أجل جعله لذلك نحن لا تفقد أي معلومات، 451 00:22:25,350 --> 00:22:30,530 نحن بحاجة إلى ربط هذه عقدة أكثر من هنا، هنا. 452 00:22:30,530 --> 00:22:33,390 >> لذلك أنا ربما فعلت ذلك خطأ من منظور البصرية. 453 00:22:33,390 --> 00:22:36,830 لذلك نحن في بداية دينا القائمة، ونحن نمضي قدما من خلال، 454 00:22:36,830 --> 00:22:40,510 نحن نريد لحذف هذه العقدة. 455 00:22:40,510 --> 00:22:43,440 إذا كان لنا أن مجرد حذفه، لقد كسر السلسلة. 456 00:22:43,440 --> 00:22:45,950 هذه العقدة هنا يشير إلى شيء آخر، 457 00:22:45,950 --> 00:22:48,260 أنه يحتوي على سلسلة من اليوم فصاعدا. 458 00:22:48,260 --> 00:22:51,190 >> وذلك ما يتعين علينا القيام به في الواقع بعد أن نصل إلى هذه النقطة، 459 00:22:51,190 --> 00:22:56,670 هو أننا بحاجة إلى خطوة واحدة الى الوراء، و ربط هذه العقدة لأكثر من هذه العقدة، 460 00:22:56,670 --> 00:22:58,590 حتى نتمكن من ثم حذف واحد في الوسط. 461 00:22:58,590 --> 00:23:02,120 ولكن القوائم المرتبطة منفردة لا توفر لنا وسيلة للذهاب إلى الوراء. 462 00:23:02,120 --> 00:23:05,160 لذلك نحن بحاجة إلى إما الاحتفاظ اثنين من المؤشرات، ونقلها 463 00:23:05,160 --> 00:23:09,527 نوع من النزول، واحدة خلف البعض ونحن نمضي، أو الحصول على نقطة 464 00:23:09,527 --> 00:23:11,110 وبعد ذلك ترسل مؤشر آخر من خلال. 465 00:23:11,110 --> 00:23:13,150 وكما ترون، فإنه يمكن الحصول على القليل من الفوضى. 466 00:23:13,150 --> 00:23:15,360 لحسن الحظ، لدينا طريقة أخرى لحل ذلك، 467 00:23:15,360 --> 00:23:17,810 عندما نتحدث عن القوائم المرتبطة على نحو مضاعف. 468 00:23:17,810 --> 00:23:20,720 >> أنا دوغ ويد، وهذا هو CS50. 469 00:23:20,720 --> 00:23:22,298