DANH SÁCH LIÊN KẾT VÒNG Danhsáchliênkếtvònglàcấutrúcdữliệugồm 1 tậpcácphầntử , trongđómỗiphầntửlà 1 phầncӫa 1 nútcóchӭamộtliênkếttớinútkếtiếp. Nói “mỗiphầntửlà 1 phầncӫa 1 nút” bởivìmỗinútngoàiviệcchӭathông tin vềphầntửcònchӭathông tin vềliênkếttớinúttiếptheotrongdanhsách. Trongdanhsáchliênkếtđơn, nútcuốicùngcӫadanhsáchsẽliênkếttrỏđếnmộtgiátrị NULL chobiếtdanhsáchđãkếtthúc. Nhưngở danhsáchliênkếtvòngnàykhôngtrỏđến NULL màtrỏvềnútđầutiên. Ưuđiểmcủadanhsáchliênkếtvònglàbấtkỳnútnàocũngcóthểcoilàđầucӫadanhsách.Cónghĩalàtừmộtnútbấtkỳ, ta cóthểtiếnhànhduyệt qua toànbộcácphầntửcӫadanhsáchmàkhôngcầntrởvềnútđầutiênnhưtrongdanhsáchliênkếtthôngthường.Tuynhiên, nhѭợcđiểmcӫadanhsáchnàylàcóthểkhôngbiếtkhinàothìđãduyệt qua toànbộphầntửcủadanhsách.Điềunàydẫnđếnmộtquátrìnhduyệtvôhạn, khôngcóđiểmdừng.Đểkhắcphụcnhượcđiểmnày, trongquátrìnhduyệtluônphảikiểmtraxemđãtrởvềnút ban đầu hay chưa.Việckiểmtranàycóthểdựatrêngiátrịphầntửhoặcbằngcáchthêmvàomộtnútđặcbiệt.Quyước: Dùng con trỏ Last quảnlýdanhsáchliênkếtvòng, con trỏnàychỉtớiphầntửcuốicùngtrongdanhsách. Nếudanhsáchrỗng: Last = NULL Nếudanhsáchcó 1 phầntử: Last = Last>Next Khaibáo: Struct node { Int Item; Struct node Next; }; Sauđây, chúng ta sẽxétviệcsửdụngdanhsáchliênkếtvòngđểgiảiquyếtbàitoánnhưsau: Cho mộtdanhsáchlưutrữcácsốnguyên.Viếtchươngtrìnhtạomột Menu thựchiệncáccôngviệcsau (Sửdụngdanhsáchliênkếtvòng): 1. Khởitạodanhsách, quátrìnhnhậpsẽdừnglạikhinhậpdấu “” 2. Kiểmtraxemtạivịtríthứ 5 cóphảilàsốnguyêntố hay không? Nếuđúnghãyxóabỏphầntửnày. 3. Tínhtíchcácsốchẵn, dương, chia hếtcho 5 (khôngkểsố 0). 4. Sắpxếpdanhsáchtheothứtựtăngdần. 5. Xóabỏnhữngphầntửtrùngnhautrongdanhsách (chỉgiữlạimộtphầntử). 6. Đếmsốlượngcácsốhoànhảotrongdanhsách. Cácsốhoànhảonằm ở nhữngvịtrínào? 7. Xóatấtcảcácsố 0 trongdanhsách. 8. Nhậpvàomộtsố k, đếmcácsố = k, sốlượngđếmđượclàsốchẵn hay lẻ?
BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC TÀI NGUYÊN VÀ MÔI TRƯỜNG HÀ NỘI KHOA: CÔNG NGHỆTHÔNG TIN BÀI TẬP LỚN Cấu Trúc Dữ Liệu Và Giải Thuật Giáo Viên Hướng Dẫn: CôPhíThịHảiYến Nhóm Sinh Viên Thực Hiện: Nhóm 2 LêĐìnhThành NguyễnThịYến Chu ThịThắm LưuThịNhậtLệ PhạmThịTrang NguyễnThịThùy ĐàoĐứcTrung DANH SÁCH LIÊN KẾT VÒNG Danhsáchliênkếtvònglàcấutrúcdữliệugồm tậpcácphầntử , trongđómỗiphầntửlà phầncӫa nútcóchӭamộtliênkếttớinútkếtiếp Nói “mỗiphầntửlà phầncӫa nút” bởivìmỗinútngoàiviệcchӭathông tin vềphầntửcònchӭathông tin vềliênkếttớinúttiếptheotrongdanhsách Trongdanhsáchliênkếtđơn, nútcuốicùngcӫadanhsáchsẽliênkếttrỏđếnmộtgiátrị NULL chobiếtdanhsáchđãkếtthúc Nhưngở danhsáchliênkếtvòngnàykhôngtrỏđến NULL màtrỏvềnútđầutiên Ưuđiểmcủadanhsáchliênkếtvònglàbấtkỳnútnàocũngcóthểcoilàđầucӫadan hsách.Cónghĩalàtừmộtnútbấtkỳ, ta cóthểtiếnhànhduyệt qua toànbộcácphầntửcӫadanhsáchmàkhôngcầntrởvềnútđầutiênnhưtrongdanh sáchliênkếtthôngthường.Tuynhiên, nhѭợcđiểmcӫadanhsáchnàylàcóthểkhôngbiếtkhinàothìđãduyệt qua toànbộphầntửcủadanhsách.Điềunàydẫnđếnmộtquátrìnhduyệtvôhạn, khôngcóđiểmdừng.Đểkhắcphụcnhượcđiểmnày, trongquátrìnhduyệtluônphảikiểmtraxemđãtrởvềnút ban đầu hay chưa.Việckiểmtranàycóthểdựatrêngiátrịphầntửhoặcbằngcáchthêmvàomộ tnútđặcbiệt.Quyước: Dùng trỏ Last quảnlýdanhsáchliênkếtvòng, trỏnàychỉtớiphầntửcuốicùngtrongdanhsách Nếudanhsáchrỗng: Last = NULL Nếudanhsáchcó phầntử: Last = Last->Next Khaibáo: Struct node { Int Item; Struct node *Next; }; Sauđây, sẽxétviệcsửdụngdanhsáchliênkếtvòngđểgiảiquyếtbàitoánnhưsau: Cho mộtdanhsáchlưutrữcácsốnguyên.Viếtchươngtrìnhtạomột Menu thựchiệncáccôngviệcsau (Sửdụngdanhsáchliênkếtvòng): Khởitạodanhsách, quátrìnhnhậpsẽdừnglạikhinhậpdấu “#” Kiểmtraxemtạivịtríthứ cóphảilàsốnguyêntố hay không? Nếuđúnghãyxóabỏphầntửnày Tínhtíchcácsốchẵn, dương, chia hếtcho (khôngkểsố 0) Sắpxếpdanhsáchtheothứtựtăngdần Xóabỏnhữngphầntửtrùngnhautrongdanhsách (chỉgiữlạimộtphầntử) Đếmsốlượngcácsốhoànhảotrongdanhsách Cácsốhoànhảonằm nhữngvịtrínào? Xóatấtcảcácsố trongdanhsách Nhậpvàomộtsố k, đếmcácsố = k, sốlượngđếmđượclàsốchẵn hay lẻ? Tínhtrungbìnhcộngcácsốlẻdѭơngtrongdanhsách ChươngTrình #include #include using namespace std; struct Node{ int data; Node *next; }; struct List{ Node *head; Node *tail; }; voidInit(List &l){ // khoitao l.head = l.tail = NULL; } Node *creatNode(int x ){ Node *p = new Node; p->next = NULL; p->data = x; return p; } boolisEmpty(List l ){ if(l.head == NULL ) return true; return false; } intlen(List l){ int count=0; Node *p=l.head; do{ count+=1; p=p->next; }while(p!=l.head); return count; } voidaddHead(List &l, int x ){ Node *p = creatNode(x); if(isEmpty(l)) l.head = l.tail = p; else{ p->next = l.head; // tro next cua p trotoidia chi cua node head(ban dau) l.head = p; // cap nhat node head(lucsau ) } l.tail->next = l.head; // khepvong don } voidaddTail(List &l, int x ){ Node *p = creatNode(x); if(isEmpty(l)) addHead(l,x); else{ l.tail->next = p; l.tail = p; } l.tail->next = l.head; // khepvong don } Node *search(List l, int k ){ Node *p = l.head; { if( p->data == k ) return p; else p = p->next; } while( p != l.head ); return NULL; } voidaddMid(List &l, int x, int k ){ // chen node co data = x vaosau node co data = k; Node *p = search(l,k); if(p!=NULL){ Node *q= creatNode(x); Node *r = p->next; p->next = q; q->next = r; } elsecoutnext = l.head; } elsel.head = NULL; } else return; } voiddelTail(List &l ){ if(!isEmpty(l)){ if(l.head != l.tail ){ Node *p = l.head; Node *q = new Node; while(p->next != l.tail ) p = p->next; // tim node ngaytruoc tail q = p; // gan node cho node q p = p->next; // p chinh la node tail can xoa l.tail = q; // cap nhatl.tail l.tail->next = l.head; delete p; } else l.head = NULL; } else return; } voiddelAtK(List &l, int index ){ if(index == 1) delHead(l); else if( index == len(l) ) delTail(l); else{ if(!isEmpty(l)){ Node *p = l.head; Node *q = new Node; for(int i=1;inext; } q->next = p->next; // cho node next cua node k-1 trotoi node k+1; delete p; } } } // xuat thong tin man hinh voidxuat(List l ){ if(l.head){ cout