Академический Документы
Профессиональный Документы
Культура Документы
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