پشته و صف پیوندی Give qualifications of instructors: DAP teaching computer architecture at Berkeley since 1977 Co-athor of textbook used in class Best known for being one of pioneers of RISC currently author of article on future of microprocessors in SciAm Sept 1995 RY took 152 as student, TAed 152,instructor in 152 undergrad and grad work at Berkeley joined NextGen to design fact 80x86 microprocessors one of architects of UltraSPARC fastest SPARC mper shipping this Fall
رئوس مطالب مشکل: چه کار کنیم که لیستهای پیوندی کارآمدتر شوند؟ لیستهای دو پیوندی پیادهسازی لیست پیوندی پشته پیادهسازی لیست پیوندی صف دقت کنید که قبلاً نسخه ی آرایه ای صف و پشته را دیدهایم.
مشکلات لیست تک پیوندی tail head node1 node2 node3 فقط در یک جهت می توان حرکت کرد. در هنگام حذف یا اضافه کردن باید نود قبلی را به خاطر داشته باشیم. در کدنویسی باید حواسمان به ابتدا و انتهای لیست باشد که منجر به تولید if های زیادی می شود.
هر نود دو ارجاع دارد. یک نود در لیست دوپیوندی Node next prev previous following Node value
نود ساختگی اعمال حذف و افزودن راحتتر خواهند بود. چون همیشه در وسط لیست اتفاق می افتند. dummy head node dummy tail node null null value null null
ایجاد یک لیست پیوندی دوپیوندی نودهای head و tail را ایجاد کنید. آنها را به هم پیوند دهید. tNode.prev = hNode hNode.next = tNode null null null null null null hNode tNode null null null null hNode tNode
ادامه ... (ایجاد لیست دو پیوندی)) ادامه ... (ایجاد لیست دو پیوندی)) مقدار head را برابر hNode و tail را برابر tNode قرار دهید. tail head null null null null hNode tNode
اضافه کردن نود جدید بعد از نود p. افزودن یک نود جدید اضافه کردن نود جدید بعد از نود p. p tail head null node null null item null null New node
ادامه ... (افزودن یک نود جدید) مقدار پیوند prev نود جدید را برابر p قرار دهید. null item New node node head tail p
ادامه ... (افزودن یک نود جدید) مقدار next نود جدید را برابر p.next قرار دهید. New node node null head item p tail
ادامه ... (افزودن یک نود جدید) مقدار p.next.prev را برابر نود جدید قرا دهید. p tail head null node null null item
ادامه ... (افزودن یک نود جدید) مقدار p.next را برابر نود جدید قرار دهید. p tail head null node null null item
کد مربوط به افزودن نود جدید public void Insert(DNode p, Object item) { DNode newNode = new Dnode(p, p.next, item); newNode.next.prev = newNode; p.next = newNode; count ++; }
حذف یک نود حذف نود p node null head tail p
مقدار p.next.prev را برابر p.prev قرار دهید. ادامه ... (حذف یک نود) مقدار p.next.prev را برابر p.prev قرار دهید. node null head tail p
مقدار p.prev.next را برابر p.next قرار دهید. ادامه ... (حذف یک نود) مقدار p.prev.next را برابر p.next قرار دهید. node null head tail p
حال می توانید نود p را حذف کنید. ادامه ... (حذف یک نود) حال می توانید نود p را حذف کنید. null head tail
کد حذف نود Object remove(DNode p) { Object item = p.value; p.next.prev = p.prev; p.prev.next = p.next; count --; return item; }
آخرین لینک به اولین لینک بر می گردد. لیست مدور آخرین لینک به اولین لینک بر می گردد. یعنی پیوند آخرین لینک به اولین نود اشاره می کند. current node1 node2 node3
پیاده سازی لیست پیوندی پشته push pop پشته همراه با افزودن یا حذف بزرگ و کوچک می شود. D دیگر نیازی به دانستن حداکثر اندازه ی پشته نداریم. هر جا لازم شد به نود جدید حافظه تخصیص می دهیم. top E B … A stack
پیادهسازی لیست پیوندی پشته نودها به ابتدا اضافه می شوند. نودها از ابتدا برداشته می شوند. top a b c null push pop
اضافه کردن یک عنصر به ابتدای پشته عمل Push اضافه کردن یک عنصر به ابتدای پشته top a b c null
عمل Push (ادامه ...) New node top New node ایجاد نود جدید با مقدار d. پیوند دادن نود جدید به ابتدای پشته. New node d null top a b c null New node d
عمل Push (ادامه ...) top New node top a b c null d a b c null d
عمل Pop حذف یک عنصر از پشته top a b c null top a b c null a
LinkedStack Implementation public class LinkedStack implements StackPT { //instance variables //private methods, classes //public methods //… }
پیاده سازی لیست پیوندی صف دو عملکرد اساسی: Enqueue: اضافه کردن به tail صف. Dequeue: حذف از head صف. عملکردهای دیگر: isEmpty isFull نداریم. Size
خلاصه لیست پیوندی حافظه ی مصرفی به اندازه ی مورد نیاز است. کار با داده ها (مثل افزودن و حذف) کارآمدتر است. از آرایه بهتر است. کار با لیست دوپیوندی راحتتر است. می توان پشته و صف را با لیست پیوندی پیاده کرد.