1. Trang chủ
  2. » Giáo Dục - Đào Tạo

BÀI TẬP LỚN Cấu Trúc Dữ Liệu Và Giải Thuật

20 437 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 20
Dung lượng 34,59 KB

Nội dung

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ẻ?

Trang 1

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

1 LêĐìnhThành

2 NguyễnThịYến

3 Chu ThịThắm

4 LưuThịNhậtLệ

5 PhạmThịTrang

6 NguyễnThịThùy

7 ĐàoĐứcTrung

Trang 2

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 a 1 nútcóchӭamộtliênkếttớinútkếtiếp amộtliênkếttớinútkếtiếp Nói “mỗiphầntửlà 1 phầncӫa 1 nútcóchӭamộtliênkếttớinútkếtiếp a 1 nút” bởivìmỗinútngoàiviệcchӭamộtliênkếttớinútkếtiếp athông tin vềphầntửcònchӭamộtliênkếttớinútkếtiếp athông tin vềliênkếttớinúttiếptheotrongdanhsách Trongdanhsáchliênkếtđơn,

nútcuốicùngcӫa 1 nútcóchӭamộtliênkếttớinútkếtiếp 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ӫa 1 nútcóchӭamộtliênkếttớinútkếtiếp 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ӫa 1 nútcóchӭamộtliênkếttớinútkếtiếp 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 ợcđiểmcӫa 1 nútcóchӭamộtliênkếttớinútkếtiếp 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

Trang 3

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ẻ?

Trang 4

9 Tínhtrungbìnhcộngcácsốlẻdѭợcđiểmcӫadanhsáchnàylàcóthểkhôngbiếtkhinàothìđãduyệt qua ơngtrongdanhsách.

ChươngTrình

#include<conio.h>

#include<stdio.h>

using namespace std;

struct Node{

int data;

Node *next;

};

struct List{

Node *head;

Node *tail;

};

voidInit(List &l){ // khoitao

l.head = l.tail = NULL;

Trang 5

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);

Trang 6

if(isEmpty(l)) l.head = l.tail = p;

else{

p->next = l.head; // con 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;

do {

if( p->data == k ) return p;

else p = p->next;

} while( p != l.head );

return NULL;

}

Trang 7

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;

}

elsecout<<"\nKhongtimthay node co data = k.";

}

voiddelHead(List &l ){

if(!isEmpty(l)){

if(l.head != l.tail ){

Node *p = l.head;

l.head = l.head->next; // cap nhatl.head

delete p; // xoabo node head ban dau

l.tail->next = l.head;

}

elsel.head = NULL;

}

else return;

}

voiddelTail(List &l ){

Trang 8

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 nay 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;i<index;i++){

q = p;

p= p->next;

}

Trang 9

q->next = p->next; // cho node next cua node k-1 trotoi node k+1; delete p;

}

}

}

// xuat thong tin ra man hinh

voidxuat(List l ){

if(l.head){

cout<< "\nDanhsachcacphantu:"<<endl;

Node *p = l.head;

do{

cout<<" " << p->data;

p = p->next;

}while( p != l.head );

}

elsecout<< "\nChuanhapdanhsach!";

cout<<endl;

}

//cau 1

voidkhoiTao(List &l){

intsoNguyen;

cout<<"NhapVaodanhsach(Bam # dung lai):"<<endl;

while(scanf("%d",&soNguyen)){

addTail(l,soNguyen);

Trang 10

}

}

//cau 2

voidcheckSNTandDelete(List &l,int index){

if (l.head==NULL) cout<<"Khong co phantu de kiemtra!";

else{

int i;

bool flag=true;

Node *p = l.head;

Node *q = new Node;

for(i=1;i<index;i++){

q = p;

p= p->next;

}

for (i=2;i<=p->data/2;i++){

if (p->data%i==0){

flag=false;

break;

}

}

if (flag){

cout<<"Phantuthu "<<index<<" la "<<p->data<<": la so nguyen to"<<endl;

if (p==l.head){

delHead(l);

cout<<"Da xoaphantu nay!!";

Trang 11

}

else if (p==l.tail){

delTail(l);

cout<<"Da xoaphantu nay!!";

}

else{

q->next = p->next; // cho node next cua node k-1 trotoi node k+1;

delete p;

cout<<"Da xoaphantu nay!!";

}

}

else

cout<<"Phantuthu "<<index<<" la "<<p->data<<": khongphai la so nguyen to"<<endl; }

}

//cau 3

void chanDuongchia5(List l){

if(l.head==NULL) cout<<"\nKhong co phantu de tinh!";

else{

intTich=1;

Node *p = l.head;

do{

if(p->data>0 && p->data%10==0) Tich*=p->data;

p=p->next;

Trang 12

cout<<"Tich can tinh la "<<Tich<<endl;

}

}

//cau 4

voidsapXep(List &l){

Node *p,*q;

for(p=l.head;p!=l.tail;p=p->next)

for(q=p->next;q!=l.head;q=q->next){

if (p->data>q->data){

int temp=p->data;

p->data=q->data;

q->data=temp;

}

}

}

//cau 5

voidonlyOne(List &l){ // thuattoan: duyet 2 vong for, duyentungphantuvoicacphantu con lai neutrungthibo di

Node *p=l.head,*q,*temp;

do{

q=p->next;

temp=p; // cho temp ngaytruoc q

do{

if(q->data==p->data){

Trang 13

delete q;

q=temp->next;

}

temp=temp->next;

q=q->next;

}while(q!=l.head);

p=p->next;

}while(p!=l.head);

}

//cau 6

boollaSoHoanHao(int x){ // dieukien la so hoanhao int sum=0;

for(int i=1;i<=x/2;i++){

if(x%i==0) sum+=i;

}

if(sum==x) return true;

else return false;

}

voidcheckSoHoanHao(List l){

cout<<"\nCac so hoanhao la: "<<endl;

int k=0,index=0,flag=0;

Node *p=l.head;

do{

Trang 14

if(laSoHoanHao(p->data)){

flag++;

cout<<p->data<<" o vi tri thu "<<index<<endl;

}

p=p->next;

}while(p!=l.head);

if(flag==0) cout<<"\nKhong co so hoanhaonao "<<endl;

}

//cau 7

void xoaSo0(List &l){

intbienChay=1;

int temp=len(l);

Node *p=l.head,*q;

while(bienChay<=temp){

if(p==l.head&& p->data==0){

delHead(l);

delete p;

p=l.head;

continue; // check truong hop co cac so 0 dung o daungaycanhnhau }

else if(p->data==0){

q->next=p->next;

delete p;

p=q->next;

Trang 15

}

q=p; // cho q chaysau p

p=p->next;

++bienChay;

}

}

//cau 8

voidtimSoBangK(List l){

cout<<"Nhapvao so k: ";

int k=0,count=0;

scanf("%d",&k);

Node *p=l.head;

do{

if(p->data==k){

count+=1;

}

p=p->next;

}while(p!=l.head);

cout<<"Co tat ca "<<count<<" so bang k"<<endl; if(count%2==0)

cout<<"So luongdemduoc la so chan"<<endl; else

cout<<"So luongdemduoc la so le"<<endl; }

Trang 16

//cau 9

voidTBCsoLeDuong(List l){

int count=0;

int Sum=0;

Node *p=l.head;

do{

if(p->data%2>0){

count+=1; // tinh so cac so le duongtrongdanhsach

Sum+=p->data;

}

p=p->next;

}while(p!=l.head);

cout<<"Co tat ca "<<count<<" so le duongtrongdanhsachva co tong la "<<Sum<<endl; cout<<"Trungbinhcongcac so le duongtrongdanhsach la "<<Sum/count<<endl;

}

void menu()

{

List l;

Init (l);

int index=0;

charlc;

while (1)

{

cout<<"\n MENU \n0.In danhsach\n1.Khoi taodanhsach.\n2.Kiem traphantu "

Trang 17

<<"bat ki la so nguyen to.\n3.Tinh tichcac so chan,duong, chia "

<<"het cho 5.\n4.Sap xepdanhsachtheothutu tang dan.\n5.Xoa "

<<"bonhungphantutrungnhautrongdanhsach.\n6.Dem so luongva "

<<"chi ra vi tri cac so hoanhao.\n7.Xoa tat ca so 0 trongdanhsach."

<<"\n8.Dem cac so bang k, va chi ra so luong la chan hay le.\n9."

<<"Tinhtrungbinhcac so le duongtrongdanhsach.\nBam ESC de thoatra\n"<<endl; fflush(stdin);

lc = getch();

if (lc=='0')

{ xuat(l);

getch();

}

else if (lc=='1')

{ khoiTao(l);

xuat(l);

}

else if (lc=='2')

{ cout<<"Nhap vi tri phantu can kiemtra:";

scanf("%d",&index);

checkSNTandDelete(l,index);

xuat(l);

getch();

}

Trang 18

else if (lc=='3')

{ chanDuongchia5(l);

xuat(l);

getch();

}

else if (lc=='4')

{ sapXep(l);

cout<<"Da sap xepdanhsach"<<endl; xuat(l);

getch();

}

else if (lc=='5')

{ onlyOne(l);

cout<<"Da xoacacphantutrungnhau"<<endl; xuat(l);

getch();

}

else if (lc=='6')

{ checkSoHoanHao(l);

getch();

}

else if (lc=='7')

Trang 19

{ xoaSo0(l);

cout<<"Da xoacac so 0!!"<<endl; xuat(l);

getch();

}

else if (lc=='8')

{ timSoBangK(l);

getch();

}

else if (lc=='9')

{ TBCsoLeDuong(l);

getch();

}

else if (lc==27)

{ break;

}

}

}

int main()

{

menu();

Trang 20

return 0; }

Ngày đăng: 16/07/2017, 22:41

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w