void DeleteNode(PNode &Head, PNode OldNode) { PNode q = Head; if (Head == OldNode) Head = OldNode->next; //birinchi elementni o’chiramiz
else { while (q && q->next != OldNode) // elementni qidirish
q = q->next; if (q == NULL ) return; // agar topilmasa, chiqish
q->next = OldNode->next; } delete OldNode; // xotirani tozalash
} Chegaralarni aniqlash. Yuqorida ko’rib o’tilgan variantga e’tibor bersak, ro’yxatning boshi va oxirgi tugunini qayta ishlashda, chegara elementlarini almashtirish alohida masala sifatida qaralishi kerak. Agarda ro’yxat boshi va oxirgi tugunlarini chegara sifatida o’rnatib olsak, qolgan tugunlarni qayta ishlash hech qanday muammolarni keltirib chiqarmaydi.
2. Ikki bog’lamli ro’yxat Bir bog’lamli ro’yxatlar bilan ishlashda ba’zi muammolar paydo bo’ladi. Masalan, ro’yxat tugunidan oldin turgan tugunga qaytish imkoni yo’q. Shuning uchun ro’yxat tuguni uchun xotirada faqat keyingi tugunga ko’rsatkich emas, balki oldingi tugunga qayta ko’rsatkichni ham saqlash mumkin. Ro’yxatga kirish uchun ham ikkita ko’rsatkichni qo’llaymiz, ya’ni ro’yxat boshiga (Head) va ro’yxatning oxiridan kirish (Tail) ko’rsatkichlaridan foydalanmiz (6-rasm).
Ikki bog’lamli ro’yxat
Har bir tugun (chegar tugunlardan tashqari) o’zidan keyingi tugunga (next) va o’zidan oldingi tugunga (prev) ko’rsatkichlarni saqlab turadi. Oxirgi elementning next maydoni va birinchi elementning prev maydoni NULL ga ega. Bunday ro’yxatning tugunini quyidagicha e’lon qilish mumkin:
struct Node { char word[40]; // ma’lumot maydoni
int count; Node *next, *prev; // qo’shni tugunlarga ko’rsatkichlar
}; typedef Node *PNode; //«ko’rsatkich» turidagi ma’lumot
Keyingi o’rinlarda Head ro’yxat boshi tuguniga, Tail ro’yxatning oxiri tuguniga ko’rsatkich deb qaraymiz:
PNode Head = NULL, Tail = NULL;
Bo’sh ro’yxatning ikkala ko’rsatkichi ham NULL ga teng bo’ladi.