Professional Documents
Culture Documents
Phần định nghĩa danh sách liên kết đơn. Danh sách lưu
các số nguyên. Nếu muốn lưu dữ liệu khác thì ta định
Ví dụ 1 DANH SÁCH LIÊN KẾT ĐƠN nghĩa lại. Ví dụ muốn thông tin về sinh viên thì ta định
#include<iostream.h> nghĩa như sau:
#include<conio.h>
#include<stdlib.h> typedef struct Node
typedef struct Node {
{ char ten[50];
int data; char que[20];
Node *next; float diemTB;
}; Node *next;
};
void themdau(Node *&L, int x)
{
//buoc 1
Node *p=new Node;
p->data=x; p->next=L; Thêm 1 phần tử giá trị x vào đầu danh sách L.
// buoc 2 1. Tạo node mới p và gán dữ liệu x vào p và gắn L vào sau p
L=p; 2. Cho L trỏ đến p
}
void duyet(Node *L)
{ In nội dung danh sách được trỏ bởi L
Node *p=L; Cho P trỏ đến L.
cout<<"--->"; Trong khi P khác rỗng thì { in nội dung của P và cho P trỏ đến nốt sau P }.
while (p!=NULL) Lưu ý : Lệnh cout dùng để in, tương tự như lệnh printf
{
cout<<p->data<<"--> "; // nhớ có lệnh #include<iostream.h>
p=p->next;
}
cout<<" NULL";
}
// tao danh sach lien ket gom co n node
void taods(Node *&L, int n)
Đoạn lệnh bên thực hiện việc tạo ra danh sách
{
gồm có n nốt. Hàm nhận đối số n là số nốt cần
L=NULL;
tạo, sau đó sẽ yêu cầu nhập n số để chèn vào.
for(int i=1; i<=n; i++)
Các nốt được chèn vào danh sách theo thứ theo
{ int x;
thứ tự ngược, nghĩa là phần tử nào chèn vào
cout<<"nhap so can them:"; cin>>x;
trước sẽ ở cuối danh sách.
themdau(L,x);
}
}
void tao(Node *&L)
{
Đoạn lệnh bên thực hiện việc tạo ra danh sách
L=NULL; int x;
do gồm các nốt khác 0. Khi nhập số 0 sẽ kết thúc
{ việc chèn.
cout<<"nhap so can them:"; cin>>x;
if (x!=0)themdau(L,x);
} while(x!=0);
} Hàm bên tính tổng giá trị các nốt trong danh
int tong(Node *L) sách liên kết.
{ Thuật toán
int t=0; Node *p=L; 1. Cho t=0 và con trỏ P trỏ đầu danh sách
while (p!=NULL)
{ 2. Trong khi p khác rỗng thì cộng giá trị hiện tại
t=t+p->data; p=p->next; của P vào t và cho p trỏ đến nốt kế tiếp
}
return t; 3. Trả về giá trị của t
dieuhb@gmail.com
Bài tập Cấu trúc dữ liệu và thuật toán Trang 2
void main() // hàm main gọi lại các hàm đã định nghĩa ở trên.
{
Node *L=NULL;
//int n; cout<<"\n nhap so not can tao:"; cin>>n;
Có thể gọi hàm tạo n nốt hoặc
//taods(L,n);
tao(L); gọi hàm tạo như bên.
cout<<"\n Noi dung danh sach:\n"; duyet(L);
cout<<"\n tong cac so="<<tong(L);
getch();
}
Ví dụ 2 !!! Mỗi dòng include viết trên 1 dòng như bài 1
#include<iostream.h> #include<conio.h> #include<stdio.h> #include<stdlib.h>
typedef struct Node
{
int data;
Node *next;
};
Node *L;
void themdau(Node *&L, int x)
{
Node *p=new Node; p->data=x; p->next=L; L=p;
}
void duyet(Node *L)
{
Node *p=L;
cout<<"--->";
while (p!=NULL) { cout<<p->data<<"--> "; p=p->next; }
cout<<" NULL";
Thuật toán chèn nút có giá trị x vào vị trí k trong danh
}
sách
Các trường hợp có thể xảy ra:
void tao(Node *&L)
Nếu k< 1 thì không chèn được
{
Nếu như k=1 thì tương ứng với chèn nút x vào đầu danh
L=NULL;
int x; sách
do Nếu k lớn hơn 1 thì cho con trỏ p trỏ đến nút k -1
{ Nếu p rỗng thì báo là ko chèn được
cout<<"nhap so can them:"; cin>>x; Ngược lại thì tạo một nút mới và gắn liền sau p.
if (x!=0) themdau(L,x);
} while(x!=0);
}
void chenthuk(Node *&L, int x, int k)
{
if (k<1) printf("\n vi tri chen ko hop le!");
else
if (k==1){ Node *t=new Node; t->data=x; t->next=L; L=t; }
else // k>1
{
int vt=1; Node *p=L;
while (p!=NULL && vt<k-1) { vt++; p=p->next;}
if (p==NULL) printf("\n Vi tri chen khong hop le!");
else // chen not t sau p
{
Node *t=new Node; t->data=x; t->next= p->next;
p->next=t;
}
}
}
dieuhb@gmail.com
Bài tập Cấu trúc dữ liệu và thuật toán Trang 3
void main()
{
clrscr();
L=NULL;
tao(L);
cout<<"\n Noi dung danh sach:\n";
duyet(L);
int k;
printf("\nhap vi tri not can in:"); scanf("%d", &k);
inthuk(L,k);
chenthuk(L,100,4);
cout<<"\n Noi dung danh sach sau khi chen 100 vao vt thu 4:\n";
duyet(L);
xoathuk(L,3);
cout<<"\n Noi dung danh sach sau khi xoa pt thu 3:\n";
duyet(L);
getch();
}
dieuhb@gmail.com
Bài tập Cấu trúc dữ liệu và thuật toán Trang 4
Ví dụ 3
#include<iostream.h> #include<conio.h> #include<stdio.h> #include<stdlib.h>
typedef struct Node
{
int data;
Node *next;
};
// khai bao L la danh sach lien ket
Node *L;
void duyet(Node *L)
{
Node *p=L; cout<<"--->";
while (p!=NULL) { cout<<p->data<<"--> "; p=p->next; }
cout<<" NULL";
} Thuật toán tạo danh sách liên kết đơn, thứ tự các nút trong
void tao1(Node *&L) danh sách đúng với thứ tự nhập vào.
{ Danh sách được quản lý bởi hai con trỏ đầu và cuối. Ban đầu
Node *dau=NULL,*cuoi=NULL; khi thêm một phần tử vào danh sách, con trỏ đầu và cuối đều
int x; trỏ đến nút vừa được tạo. Các phần tử được thêm vào sau đều
do được thêm vào sau con trỏ cuối. Sau cùng gán L= con trỏ đầu
{
cout<<"nhap so can them:"; cin>>x;
if (x!=0)
{
Node *p=new Node; p->data=x; p->next=NULL;
if (dau==NULL) dau=cuoi=p;
else {cuoi->next=p; cuoi=p;}
}
} while(x!=0);
L=dau;
}
void sapxep(Node *&L) Sắp xếp các giá trị trong danh sách theo thứ tự tăng dần.
{ Vị trí các nút không thay đổi nhưng thay đổi giá trị trong các nút
Node *p=L;
while (p!=NULL)
{
Node *q=p->next;
while (q!=NULL)
{
if (p->data>q->data)
{ int t=p->data; p->data= q->data ; q->data=t;}
q=q->next;
}
p=p->next; Cho trước danh sách L đã có thứ tự tăng dần. Chèn nốt có giá trị x
} vào danh sách sao cho danh sách cũng tăng dần.
} Nếu danh sách rỗng hoặc phần tử đầu tiên trong danh sách có giá
trị > x thì chèn vào đầu danh sách, ngược lại thì cho con trỏ p trỏ
void chentang(Node *&L, int x) đến nốt mà nốt sau nó (q) có giá trị > x hoặc q = NULL và chèn
{ nốt t vào giữa vị trí p và q
Node *t, *p,*q;
if (L==NULL|| L->data>=x) { t=new Node; t->data=x; t->next=L; L=t;}
else
{
p=L; q=p->next;
while (q!=NULL && q->data<x) { p=q; q=q->next;}
t=new Node; t->data=x; t->next=q; p->next=t;
}
}
dieuhb@gmail.com
Bài tập Cấu trúc dữ liệu và thuật toán Trang 5
void main()
{
clrscr();
L=NULL;
tao1(L);
cout<<"\n Noi dung danh sach:\n"; duyet(L);
sapxep(L);
cout<<"\n Noi dung danh sach sau khi sap xep:\n"; duyet(L);
int x; cout<<"\nnhap gia x can chen:"; cin>>x;
chentang(L,x);
cout<<"\n Noi dung danh sach sau khi chen gia tri x:\n"; duyet(L);
getch();
}
Ví dụ 4
#include<iostream.h> #include<conio.h> #include<stdio.h> #include<stdlib.h>
typedef struct Node
{
int data;
Node *next;
};
void chentangkotrung(Node *&L, int x)
{
Node *t=new Node; t->data=x; t->next=NULL;
if (L==NULL) L=t;
else
if (L->data>x) { t->next=L; L=t; }
else
if (L->data==x) cout<<" Da co trong danh sach \n";
else
{
Node *p=L, *q=L->next;
while (q!=NULL && q->data<x) { p=q; q=q->next;}
if (q!=NULL && q->data==x)
cout<<"\n Da co trong danh sach\n";
else
{
t->next=q; p->next=t;
}
}
}
dieuhb@gmail.com
Bài tập Cấu trúc dữ liệu và thuật toán Trang 6
void main()
{
clrscr();
Node *L1=NULL;
cout<<"\n Tao danh sach L1:\n"; taotangkotrung(L1);
cout<<"\n Noi dung danh sach L1:\n";
inds(L1);
Node *L2=NULL;
cout<<"\n Tao danh sach L2:\n"; taotangkotrung(L2);
cout<<"\n Noi dung danh sach L2:\n";
inds(L2);
Node *L=NULL;
tron(L,L1,L2);
cout<<"\n Noi dung danh sach L = L1 + L2:\n";
inds(L);
getch();
dieuhb@gmail.com
Bài tập Cấu trúc dữ liệu và thuật toán Trang 7
dieuhb@gmail.com
Bài tập Cấu trúc dữ liệu và thuật toán Trang 8
dieuhb@gmail.com
Bài tập Cấu trúc dữ liệu và thuật toán Trang 9
dieuhb@gmail.com
Bài tập Cấu trúc dữ liệu và thuật toán Trang 10
}
if(yes==1) printf("\n Co gia tri %d trong danh sach o vi tri %d!!!",x,vt);
else printf("\n Khong co gia tri %d trong danh sach!!!",x);
}
// tim phan phu x co trong danh sach hay khong, neu co thi in vi tri cua x
void tim_xdq(Node *L,int x, int &vt)
{
if (L==NULL) printf("\n Khong co gia tri %d trong danh sach!!!",x);
else
if (L->data==x)
printf("\n Co gia tri %d trong danh sach o vi tri %d!!!",x,vt);
else { vt++; tim_xdq(L->next,x,vt);}
}
// cho con tro p tro den phan tu thu k trong danh sach
void nhayden_k(Node *&L, int k,Node *&p)
{
p=NULL;
if(k<1) printf("Khong the nhay den vi tri <1 ?!");
else
if (L==NULL) printf("Danh sach rong, khong the nhay !!!");
else
{
int vt=1;
p=L;
while (p!=NULL && vt<k)
{
p=p->next; vt++;
}
if (p==NULL) printf("\n Danh sach khong du %d phan tu !!!",k);
else printf("\n Gia tri phan tu thu %d = %d",k,p->data);
}
}
// xoa phan tu dau danh sach
void xoapt_dau(Node *&L)
{
if (L==NULL) printf("\n Danh sach rong, khong the xoa!!!");
else L=L->next;
}
// xoa phan tu cuoi danh sach
void xoapt_cuoi(Node *&L)
{
if (L==NULL) printf("\n Danh sach rong, khong the xoa!!!");
else
if( L->next==NULL) L=NULL;
else
{
Node *q=L,*p=q->next;
while(p->next!=NULL) { q=p; p=p->next; }
q->next=NULL;
}
}
// xoa phan tu cuoi danh sach theo phuong an de qui
void xoapt_cuoidq(Node *&L)
{
if (L==NULL) printf("\n Danh sach rong, khong the xoa!!!");
else
if( L->next==NULL) L=NULL;
else xoapt_cuoidq(L->next);
}
dieuhb@gmail.com
Bài tập Cấu trúc dữ liệu và thuật toán Trang 11
dieuhb@gmail.com
Bài tập Cấu trúc dữ liệu và thuật toán Trang 12
dieuhb@gmail.com
Bài tập Cấu trúc dữ liệu và thuật toán Trang 13
getch();
}
dieuhb@gmail.com
Bài tập Cấu trúc dữ liệu và thuật toán Trang 14
}
int timxv(CNode *L, int x) //kiểm tra giá trị x có trong danh sách
{
if(L==NULL) return 0;
else
{
CNode *p=L;
int yes=0;
do
{
if (p->data==x) {yes=1; break;}
else p=p->next;
} while (p!=L);
return yes;
}
dieuhb@gmail.com
Bài tập Cấu trúc dữ liệu và thuật toán Trang 15
void main()
{
L=NULL;
int x; taodsv(L);
cout<<"\n Noi dung danh sach:\n"; duyetv(L);
cout<<"\n nhap gia tri can tim:"; cin>>x;
if (timxv(L,x)==1) cout<<"\n Co gia tri x trong danh sach";
else cout<<"\n Khong co gia tri x trong danh sach";
getch();
}
void main()
{
int n; cout<<"\n nhap so dia:"; cin>>n;
thaphn1(n,'A','B','C');
getch();
}
}
void main()
{
int n;
clrscr();
cout<<"\n nhap n:"; cin>>n;
//cout<<"\n phan tu thu n ( 0-->n) cua day la:"<<fib(n);
cout<<"\ n day fib tu 0 den n la:\n";
//for(int i=0; i<=n; i++) cout<<fib(i)<<" ";
lietkefib(n);
getch();
}
dieuhb@gmail.com
Bài tập Cấu trúc dữ liệu và thuật toán Trang 16
dieuhb@gmail.com
Bài tập Cấu trúc dữ liệu và thuật toán Trang 17
void main()
{
DNode *L;
clrscr();
taodsd(L);
indsd(L);
int x;
cout<<"\n nhap gia tri x can tim:"; cin>>x;
int k= timx1dsd(L,x);
if (k==0) cout<<"\n khong co gia tri "<<x<<" trong danh sach";
else cout<<"\n co gia tri "<<x<<" trong danh sach o vi tri "<<k;
cout<<"\n so phan tu co gia tri =x trong danh sach la:"<<demx1dsd(L,x);
getch();
}
Ví dụ 9 CHÈN XÓA CÁC NỐT TRÊN DANH SÁCH LIÊN KẾT ĐÔI
#include<iostream.h> #include<conio.h> #include<stdlib.h>
dieuhb@gmail.com
Bài tập Cấu trúc dữ liệu và thuật toán Trang 18
cout<<"\n danh sach sau khi chen 100 vao vi tri k:\n"; indsd(L);
getch();
dieuhb@gmail.com
Bài tập Cấu trúc dữ liệu và thuật toán Trang 19
void main()
{
Stack1 S;
CreateS(S);
int i,x;
for(i=1; i<=5; i++)
{
cout<<"nhap so thu "<<i<<":"; cin>>x;
PushS(S,x);
}
cout<<"\n Cac so vua them vao ngan xep: ";
while (!EmptyS(S))
{
PopS(S,x);
cout<<x<<" ";
}
getch();
dieuhb@gmail.com
Bài tập Cấu trúc dữ liệu và thuật toán Trang 20
Ví dụ 11 ỨNG DỤNG NGĂN XẾP PHÂN TÍCH SỐ N SANG HỆ NHỊ PHÂN và IN ĐẢO
#include<iostream.h> #include<conio.h> #include<stdlib.h>
#define MAXSIZE 1000
typedef struct Stack1 { int a[MAXSIZE+1];
int top;
};
void CreateS(Stack1 &S)
{
S.top=0;
}
int EmptyS(Stack1 S)
{
if (S.top==0) return 1;
else return 0;
}
void PushS(Stack1 &S,int x)
{
S.top=S.top+1; S.a[S.top]=x;
}
void PopS(Stack1 &S,int &x)
{
if (S.top>0) {x=S.a[S.top]; S.top=S.top-1;}
else cout<<"\Danh sach rong,khong lay duoc!";
}
void bieudiennhiphan(int n)
{
Stack1 S; CreateS(S);
int x;
while(n>0)
{ x=n%2; PushS(S,x); n=n/2; }
while (!EmptyS(S))
{ PopS(S,x); cout<<x<<" "; }
}
void dao(int n)
{
Stack1 S; CreateS(S);
int x;
while(n>0) { x=n%10; PushS(S,x); n=n/10; }
Stack1 t; CreateS(t);
// bo vao ngan xep tam
while (!EmptyS(S))
{ PopS(S,x); PushS(t,x); }
// lay ra tu ngan xep tam de in
while (!EmptyS(t))
{ PopS(t,x); cout<<x; }
}
void main()
{
int n;
cout<<"\nnhap so nguyen can bieu dien sang nhi phan:"; cin>>n;
bieudiennhiphan(n);
cout<<"\n So n in theo chieu nguoc la:”;
dao(n);
getch();
}
dieuhb@gmail.com
Bài tập Cấu trúc dữ liệu và thuật toán Trang 21
dieuhb@gmail.com
Bài tập Cấu trúc dữ liệu và thuật toán Trang 22
dieuhb@gmail.com
Bài tập Cấu trúc dữ liệu và thuật toán Trang 23
void main()
{
char st[100]; clrscr();
cout<<"\n nhap chuoi can kiem tra:"; gets(st);
if(kiemtrachuan(st)==1) cout<<"\n day la chuan";
else cout<<"\n khong phai chuoi chuan";
getch();
dieuhb@gmail.com
Bài tập Cấu trúc dữ liệu và thuật toán Trang 24
void main()
{
Queue q;
CreateQ(q);
//AddQ(q,3); AddQ(q,2); AddQ(q,7); AddQ(q,6); AddQ(q,9);
int x,n;
cout<<"nhap so phan tu can them:"; cin>>n;
for(int i=1; i<=n; i++)
{
cout<<"\n nhap so thu "<<i<<":"; cin>>x;
AddQ(q,x);
}
while(!EmptyQ(q))
{
RemoveQ(q,x);
cout<<x<<" ";
}
getch();
}
dieuhb@gmail.com
Bài tập Cấu trúc dữ liệu và thuật toán Trang 25
dieuhb@gmail.com
Bài tập Cấu trúc dữ liệu và thuật toán Trang 26
dieuhb@gmail.com
Bài tập Cấu trúc dữ liệu và thuật toán Trang 27
Ví dụ 18 ỨNG DỤNG NGĂN XẾP VÀ HÀNG ĐỢI KIỂM TRA CHUỖI ĐỐI XỨNG
#include<iostream.h> #include<conio.h> #include<stdlib.h> #include<stdio.h>
#include<string.h>
typedef struct Stack { char data; Stack *next; };
typedef struct Node { char data; Node *next;};
typedef struct Queue
{
Node *head,*tail;
};
void CreateS(Stack *&S)
{
S=NULL;
}
int EmptyS(Stack *S)
{
if (S==NULL) return 1; else return 0;
}
dieuhb@gmail.com
Bài tập Cấu trúc dữ liệu và thuật toán Trang 28
void main()
{
int n;
clrscr();
char s[100];
cout<<"nhap chuoi s:"; fflush(stdin); gets(s);
if(doixung(s)==1) cout<<"Chuoi doi xung";
else cout<<"\n chuoi khong doi xung";
getch();
}
Ví dụ 19 KIỂM TRA CHUỖI CHUẨN HAY KHÔNG (KHÔNG DÙNG NGĂN XẾP)
#include<iostream.h> #include<conio.h> #include<stdio.h> #include<string.h>
#include<stdlib.h>
int chuan(char *st)
{
// b1
int dem=0;
// b2
for(int i=0; i<strlen(st); i++)
{
if (st[i]=='(') dem++;
else
if (st[i]==')')
if (dem==0) return 0;
else dem--;
else return 0; // cac ky tu khac {'(', ')'}
}
// b3
if (dem==0) return 1;
else return 0;
}
void main()
{
char st[100];
clrscr();
cout<<"\n nhap chuoi can kiem tra:"; gets(st);
if(chuan(st)==1) cout<<"\n day la chuan";
else cout<<"\n khong phai chuoi chuan";
getch();
}
dieuhb@gmail.com
Bài tập Cấu trúc dữ liệu và thuật toán Trang 29
dieuhb@gmail.com
Bài tập Cấu trúc dữ liệu và thuật toán Trang 30
dieuhb@gmail.com
Bài tập Cấu trúc dữ liệu và thuật toán Trang 31
}
// dem so not co gia tri le trong cay
int sonotle(Tree *T)
{
if(T==NULL) return 0;
else
if (T->data%2==1) return 1+ sonotle(T->left)+sonotle(T->right);
else return sonotle(T->left)+sonotle(T->right);
}
// tinh tong cac not co gia tri chan trong cay
int tongchan(Tree *T)
{
if(T==NULL) return 0;
else
if (T->data%2==0) return T->data+ tongchan(T->left)+tongchan(T->right);
else return tongchan(T->left)+tongchan(T->right);
}
// dem so la cua cay
int demla(Tree *T)
{
if(T==NULL) return 0;
else
if (T->left==NULL && T->right==NULL)
return 1+ demla(T->left)+demla(T->right);
else return demla(T->left)+demla(T->right);
}
// dem so not co day du hai con
int haicon(Tree *T)
{
if(T==NULL) return 0;
else if (T->left!=NULL && T->right!=NULL)
return 1+ haicon(T->left)+haicon(T->right);
else return haicon(T->left)+haicon(T->right);
}
// dem so not co dung mot con
int motcon(Tree *T)
{
if(T==NULL) return 0;
else
if ((T->left!=NULL && T->right==NULL)||(T->left==NULL && T->right!=NULL))
return 1;
else return motcon(T->left)+motcon(T->right);
}
dieuhb@gmail.com
Bài tập Cấu trúc dữ liệu và thuật toán Trang 32
dieuhb@gmail.com
Bài tập Cấu trúc dữ liệu và thuật toán Trang 33
void main()
{
//clrscr();
Tree *T=NULL;int x=-1;
do
{
printf("nhap mot so:");
scanf("%d",&x);
if (x>=0) nhapcay(T,x);
}
while(x>=0);
printf("\n duyet cay theo tien tu:\n");
duyettientu(T);
printf("\n");
/*
printf("\n duyet cay theo trung tu:\n");
duyettrungtu(T);
printf("\nduyet cay theo hau tu:\n");
duyethautu(T);
printf(" \nso not co trong cay la:%d",sonot(T));
printf("\n so not le co trong cay la:%d",sonotle(T));
printf(" \nso la co trong cay la:%d",demla(T));
printf("\n tong not chan co trong cay la:%d",tongchan(T));
printf(" \nso not co mot con trong cay la:%d",motcon(T));
printf(" \nso not co hai con trong cay la:%d",haicon(T));
*/
getch();
}
dieuhb@gmail.com
Bài tập Cấu trúc dữ liệu và thuật toán Trang 34
dieuhb@gmail.com