Вы находитесь на странице: 1из 30

CẤU TRÚC DỮ LIỆU

Phần I : DANH SÁCH .......................................................................3


I . Danh sách liên tục ..........................................................................................................................................3
1 . Định nghĩa .................................................................................................................................................3
2 . Khai báo dữ liệu mảng ..............................................................................................................................3
3 . Phép khởi tạo danh sách.............................................................................................................................3
4 . Kiểm tra danh sách đầy .............................................................................................................................3
5 . Kiểm tra danh sách rỗng ...........................................................................................................................4
6 . Nhập dữ liệu vào danh sách ......................................................................................................................4
7 . In danh sách...............................................................................................................................................4
8 . Thêm 1 phần tử ở vị trí bất kỳ...................................................................................................................4
9 . Xoá 1 phần tử ở vị trí bất kỳ......................................................................................................................4
II . Danh sách liên kết đơn .................................................................................................................................5
1 . Định nghĩa .................................................................................................................................................5
2 . Khai báo kiểu dữ liệu ................................................................................................................................5
3 . Phép khởi tạo ............................................................................................................................................5
4 . Kiểm tra danh sách rỗng ...........................................................................................................................5
5 . Tạo 1 danh sách n phần tử ........................................................................................................................5
6 . In danh sách ..............................................................................................................................................6
7 . Thêm 1 phần tử vào đầu danh sách ...........................................................................................................6
8 . Thêm 1 phần tử vào cuối danh sách ..........................................................................................................7
9 . Chèn 1 phần tử vào vị trí bất kỳ ................................................................................................................7
10 . Xoá 1 phần tử ở đầu danh sách ...............................................................................................................8
11 . Xoá 1 phần tử ở cuối hoặc ở sau con trỏ bất kỳ ......................................................................................9
12 . Tìm 1 phần tử ..........................................................................................................................................9
III . Danh sách liên kết vòng ..............................................................................................................................9
1 . Khái niệm ..................................................................................................................................................9
2 . Khởi tạo ....................................................................................................................................................9
3 . Tạo danh sách n phần tử .........................................................................................................................10
4 . In danh sách ............................................................................................................................................10
5 . Bổ sung 1 phần tử ở đầu hoặc bất kỳ ......................................................................................................11
6 . Tìm kiếm 1 giá trị cho trứơc....................................................................................................................11
7 . Xoá phần tử .............................................................................................................................................12
IV . Danh sách liên kết đôi................................................................................................................................12
1 . Định nghĩa ...............................................................................................................................................12
2 . Khai báo kiểu dữ liệu ..............................................................................................................................12
3 . Khởi tạo ...................................................................................................................................................12
4 . Tạo danh sách..........................................................................................................................................13
5 . In danh sách.............................................................................................................................................13
6 . Thêm phần tử bất kỳ ...............................................................................................................................13
7 . Tìm kiếm .................................................................................................................................................14
8 . Xoá vị trí bất kỳ .....................................................................................................................................15
Phần II : NGĂN XẾP _ STACK .......................................................15
I . Định nghĩa ...................................................................................................................................................15
II . Ngăn xếp liên tục ........................................................................................................................................15
1 . Khai báo kiểu dữ liệu ..............................................................................................................................15

Trang 1
2 . Khởi tạo ...................................................................................................................................................15
3 . Kiểm tra stack rỗng..................................................................................................................................15
4 . Kiểm tra stack đầy...................................................................................................................................15
5 . Thêm dữ liệu vào stack ...........................................................................................................................16
6 . Lấy dữ liệu ra khỏi stack .........................................................................................................................16
III . Ngăn xếp liên kết ......................................................................................................................................16
1 . Khái niệm ................................................................................................................................................16
2 . Khai báo kiểu dữ liệu ..............................................................................................................................16
3 . Khởi tạo stack rỗng .................................................................................................................................16
4 . Tạo ngăn xếp ...........................................................................................................................................16
5 . In ngăn xếp ..............................................................................................................................................17
Phần III : HÀNG ĐỢI _ QUEUE .....................................................17
I . Định nghĩa ...................................................................................................................................................17
II . Hàng đợi liên tục ........................................................................................................................................17
1 . Khai báo kiểu dữ liệu ..............................................................................................................................17
2 . Khởi tạo ...................................................................................................................................................17
3 . Kiểm tra queue đầy .................................................................................................................................17
4 . Kiểm tra queue rỗng ................................................................................................................................18
5 . Thêm phần tử ..........................................................................................................................................18
6 . Xoá phần tử .............................................................................................................................................18
III . Queue liên kết ...........................................................................................................................................18
1 . Khai báo kiểu dữ liệu ..............................................................................................................................18
2 . Các thao tác trên queue ...........................................................................................................................19
Phần IV : SẮP XẾP ........................................................................ 19
I . Sắp xếp kiểu chèn trực tiếp : Insertion Sort .................................................................................................19
II . Sắp xếp kiểu chọn trực tiếp : Selection Sort ..............................................................................................20
III . Sắp xếp nhanh : Quick Sort ......................................................................................................................20
IV . Sắp xếp kiểu nổi bọt : Buble Sort .............................................................................................................21
V . Sắp xếp kiểu nhị phân : Binary Sort ..........................................................................................................21
VI . Sắp xếp kiểu đổi chỗ : Interchange Sort ...................................................................................................22
Phần V : TÌM KIẾM ........................................................................ 22
I . Tìm kiếm tuần tự .........................................................................................................................................22
II . Tìm kiếm nhị phân .....................................................................................................................................22
Phần VI : ĐỆ QUI ........................................................................ 23
I . Bài toán tháp Hà Nội ...................................................................................................................................23
1 . Bài toán ...................................................................................................................................................23
2 . Cài đặt .....................................................................................................................................................23
3 . Khử đệ qui đuôi ......................................................................................................................................23
II . Bài toán giai thừa .......................................................................................................................................24
1 . Cài đặt......................................................................................................................................................24
2 . Khử giai thừa...........................................................................................................................................24
III . Bài toán fibonacci .....................................................................................................................................24
1 . Bài toán :..................................................................................................................................................24
2 . Cài đặt :....................................................................................................................................................25
3 . Khử fibonacci bằng vòng lặp for ............................................................................................................25

Trang 2
Phần VII cây ................................................................................ 26
I . Định nghĩa ...................................................................................................................................................26
1 . Định nghĩa 1.............................................................................................................................................26
2 . Định nghĩa 2 :...........................................................................................................................................26
3 . Các định nghĩa về cây .............................................................................................................................26
II . Khai báo kiểu dữ liệu .................................................................................................................................26
III . Khởi tạo cây ..............................................................................................................................................26
IV . Tạo cây nhị phân tìm kiếm n nút ..............................................................................................................27
1 . Định nghĩa................................................................................................................................................27
2 . Tạo cây tìm kiếm nhị phân ......................................................................................................................27
V . Duyệt cây ...................................................................................................................................................28
1 . Duyệt theo thứ tự trứơc (preoder)............................................................................................................28
2 . Duyệt theo thứ tự giữa (trung tự _ inorder).............................................................................................28
3 . Duyệt sau ................................................................................................................................................29
VI . Tạo cây cân bằng hoàn toàn.......................................................................................................................29
1 . Định nghĩa................................................................................................................................................29
2 . Cài đặt......................................................................................................................................................29

PHẦN I : DANH SÁCH


I . Danh sách liên tục

1 . Định nghĩa
Danh sách liên tục là tập hợp nhiều phần tử có cùng 1 cấu trúc . Khi biết được 1
phần tử thứ i nào đó ta sẽ biết được phần tử ở vị trí thứ i+1 .

2 . Khai báo dữ liệu mảng


#define max 100
int ds[max];
int n;

3 . Phép khởi tạo danh sách


void khoitao_ds()
{
n=0;
}

4 . Kiểm tra danh sách đầy


int is_full()
{
return (n==max);
}

Trang 3
5 . Kiểm tra danh sách rỗng
int is_empty()
{
return (n==-1);
}

6 . Nhập dữ liệu vào danh sách


void nhap_ds(int value)
{
ds[n++]=value;
}

7 . In danh sách
void in_ds()
{
int i;
for(i=0;i<n-1;i++)
printf("%3d",ds[i]);
}

8 . Thêm 1 phần tử ở vị trí bất kỳ

8.1 Ý tưởng
Dùng vòng lặp để dịch chuyển phần tử cuối cùng của danh sách sang n+1
Vòng lặp sẽ dừng lại khi đã dịch chuyển đến phần tử thứ vitri
Thêm phần tử value vào vị trí vitri.
Tăng số phần tử có trong dãy lên 1 đơn vị

8.2 Cài đặt


void insert(int value,int vitri, int ds[])
{
int i;
for(i=n;i>=vitri;i--)
ds[i+1]=ds[i];
ds[vitri]=value;
n++;
}

9 . Xoá 1 phần tử ở vị trí bất kỳ

9.1 Ý tưởng
Dùng vòng lặp để dịch chuyển phần tử thứ vitri+1 sang vị trí thứ vitri
Vòng lặp sẽ dừng lại khi đã dịch chuyển đến phần tử cuối cùng
Giảm số phần tử có trong dãy đi 1 đơn vị .

Trang 4
9.2 Cài đặt
int xoa(int vitri)
{
int i , so;
so=ds[vitri];
for(i=vitri;i<n;i++)
ds[i] =ds[i+1];
n--;
return so;
}

II . Danh sách liên kết đơn

1 . Định nghĩa
Danh sách liên kết đơn là 1 danh sách mà các phần tử được kết nối với nhau nhờ
vào vùng liên kết giữa chúng .

2 . Khai báo kiểu dữ liệu


typedef struct pp
{
int value;
struct pp *link;
}pointer;
pointer *pd,*pc,*q ;

3 . Phép khởi tạo


void khoitao()
{
pd=NULL;
}

4 . Kiểm tra danh sách rỗng


int is_empty()
{
return (pd==NULL);
}

5 . Tạo 1 danh sách n phần tử


void taods()
{
int i,n,x ;
pointer *p;
printf("\n Nhap so phan tu : "); scanf("%d",&n);
for(i=1;i<=n;i++)

Trang 5
{
printf("\n Gia tri phan tu %d :",i);
scanf("%3d",&x);
p=(pointer*)malloc(sizeof(pointer));
p->value=x;
p->link=NULL;
if (pd==NULL)
{
pd=p;
pc=p;
}
else
pc->link=p;
pc=p;
}
}

6 . In danh sách
void inds()
{
pointer *p;
p=pd;
while (p!=NULL)
{
printf(" %5d ",p->value);
p=p->link;
}
}

7 . Thêm 1 phần tử vào đầu danh sách

7.1 Ý tưởng
Ta p chỉ vào vùng liên kết của first , sau đó cho con trỏ first chỉ vào phần tử
của p

first

Trang 6
7.2 Cài đặt
void themdau()
{
pointer *p;
int value;
printf("\n Gia tri them : ");scanf("%d",&value);
p=(pointer*)malloc(sizeof(pointer));
p->value=value;
p->link=pd;
pd=p;
}

8 . Thêm 1 phần tử vào cuối danh sách


Duyệt danh sách đến cuối dãy sau đó gán p là phần tử cuối cùng của danh
sách
Tạo con trỏ mới p->link sau đó gán giá trị value cho nó , cho vùng liên kết
của nó bằng null

void themcuoi()
{
pointer *p;
int value;
printf("\n Gia tri them : ");scanf("%d",&value);
if(pd==NULL)
{
pd=(pointer*)malloc(sizeof(pointer));
p=pd;
}
else
{
p=pd;
while(p->link!=NULL)
p=p->link;
p->link=(pointer*)malloc(sizeof(pointer));
p=p->link;
}
p->value=value;
p->link=NULL;
}

9 . Chèn 1 phần tử vào vị trí bất kỳ


Phần tử p được thêm vào giữa danh sách liên kết .Ta gọi q là phần tử đứng ngay
trước p
Ta cho vùng liên kết của p trỏ vào vùng liên kết của q
Sau đó vùng liên kết của q chỉ vào p

Trang 7
pd

void chen()
{
pointer *p,*q;
int value, vitri,i=1;
printf("\n Gia tri chen : "); scanf("%d",&value);
printf("\n Vi tri chen : ") ; scanf("%d",&vitri);
q=pd;
while (i<vitri-1)
{
q=q->link ;
i++;
}
p=(pointer*)malloc(sizeof(pointer));
p->value=value;
p->link=q->link;
q->link=p;
}

10 . Xoá 1 phần tử ở đầu danh sách


Khi danh sách có phần tử ta cho con trỏ pd chỉ vào liên kết của p sau đó xoá
p
void xoadau()
{
pointer *p;
if(pd!=NULL)
{
p=pd;
pd=p->link;
free(p);
}
else
printf("\n Danh sach rong ");
}

Trang 8
11 . Xoá 1 phần tử ở cuối hoặc ở sau con trỏ bất kỳ
Phần tử p ở giữa hoặc cuối danh sách liên kết . Gọi q là phần tử đứng trứơc p
, ta cho vùng liên kết của q chỉ vào liên kết của p

pd

q p

void xoasau(pointer *q)//hoac o cuoi


{
pointer *p;
p=q->link;
if(p!=NULL)
{
q->link=p->link;
free(p);
}
}

12 . Tìm 1 phần tử
pointer tim(int value)
{
pointer *p;
int kq=0;
p=pd;
while(p!=NULL && kq==1)
{
if (p->value==value)
kq=1;
else
p=p->link;
}
return *p;
}

III . Danh sách liên kết vòng

1 . Khái niệm
Là 1 danh sách liên kết có nút cuối cùng trỏ vào nút đầu tiên của danh sách , là 1
vòng tròn khép kín .
Trong đó ta gọi r là nút gốc (nút cuối) và h là nút đầu của danh sách

2 . Khởi tạo
void khoitao()

Trang 9
{
r=NULL;
h=NULL;
}

3 . Tạo danh sách n phần tử


void taods()
{
pointer *p;
int i=0,n,value;
printf("Nhap so phan tu : "); scanf("%d",&n);
r->link=h;
while (i<n)
{
scanf("%d",&value) ;
p=(pointer*)malloc(sizeof(pointer));
p->value=value;
p->link=NULL;
if (h==NULL)
{
r=p;
h=p;
}
else
p->link=h;
r->link=p;
r=p;
i++;
}
}

4 . In danh sách
void inds()
{
pointer *p;
p=h;
do
{
printf("%5d",p->value);
p=p->link;
}
while (p!=h);
printf("\n h: %3d , r : %3d ",h->value,r->value);
}

Trang 10
5 . Bổ sung 1 phần tử ở đầu hoặc bất kỳ
void bosung(int value)
{
pointer *p,*q;
int vitri,i=1;
printf("Vi tri can bo sung : "); scanf("%d",&vitri);
p=(pointer*)malloc(sizeof(pointer));
p->value=value;
q=r->link;
if(vitri==1)//bo sung dau danh sach
{
p->link=r->link;
r->link=p;
}
else
{
while (i<vitri-1)
{
q=q->link;
i++;
}
p->link=q->link;
q->link=p;
}

6 . Tìm kiếm 1 giá trị cho trứơc


pointer tim(int value)
{
pointer *p;
int vitri=1,kq=0;
p=h;
do
{
if(p->value==value)
kq=1;
else
{
p=p->link;
vitri++;
}
}
while (p!=h && kq==0) ;
if(kq==1) printf(" Tim thay o vi tri %d",vitri);
printf("p : %3d",p->value);

Trang 11
return *p;
}

7 . Xoá phần tử
void xoa(pointer *q)
{
pointer *p;
p=q->link;
if(p==r)
{
p=r;
r=p->link;
}
else if(p==h)
{
p=h;
h=p->link;
}
else
q->link=p->link;
printf("\n Gia tri bi xoa : %3d",p->value);
free(p);
}

IV . Danh sách liên kết đôi

1 . Định nghĩa
Là 1 danh sách mà trên mỗi nút của danh sách có 2 vùng liên kế pre và next . Vùng
pre trỏ tới vùng trứơc nó và next chỉ vùng sau nó
Danh sách được quản lí bởi 2 con trỏ pc ,pd.

2 . Khai báo kiểu dữ liệu


typedef struct contro
{
int value;
struct contro *pre, *next ;
}pointer;
pointer *pd,*pc,*q;

3 . Khởi tạo
void khoitao()
{
pd=NULL;
}

Trang 12
4 . Tạo danh sách
void taods()
{
pointer *p;
int i=0, x,n;
printf("So phan tu : "); scanf("%d",&n);
while (i<n)
{
printf("Gia tri cua tung phan tu : ");
scanf("%d",&x);
p=(pointer*)malloc(sizeof(pointer));
p->value=x;
p->pre=NULL;
p->next=NULL;
if(pd==NULL)
{
pd=p;
pc=p;
}
else
{
p->pre=pc;
pc->next=p;
pc=p;
}
i++;
}
}

5 . In danh sách
void inds()
{
pointer *p;
p=pd;
while (p!=NULL)
{
printf("%7d",p->value);
p=p->next;
}
}

6 . Thêm phần tử bất kỳ


void them(int value)//them dau va them o vi tri bat ky
{
pointer *p,*q;
int vitri ,i=1 ;

Trang 13
printf("\n Vi tri chen : "); scanf("%d",&vitri);
p=(pointer*)malloc(sizeof(pointer));
p->value=value;
if(vitri==1)
{
p->next=pd;
pd->pre=p;
p->pre=NULL;
pd=p;
}
else
{
q=pd ;
while (i<vitri-1)
{
q=q->next;
i++;
}
p->next=q->next;
q->next=p;
p->pre=q;
q=p;
p=p->next;
p->pre=q;
}
}

7 . Tìm kiếm
pointer tim (int value)
{
pointer *p;
int kq=0;
p=pd;
while(p!=NULL && kq==0)
{
if(p->value==value)
kq=1;
else
p=p->next;
}
if (kq==1) printf("\n Tim thay " );
else printf("\n Khong tim thay ") ;
return *p;
}

Trang 14
8 . Xoá vị trí bất kỳ
void xoa (pointer *q)
{
pointer *p;
p=q->next;
if (p!=NULL)
{
q->next=p->next;
p->next->pre=q;
printf("\nGia tri phan tu bi xoa %3d",p->value);
free(p);
}
}

PHẦN II : NGĂN XẾP _ STACK


I . Định nghĩa
Hàng đợi là 1 danh sách mà việc thêm vào và loại bỏ phần tử đều thực hiện ở đầu
danh sách
Nguyên lý hoạt động : vào sau ra trước (LIFO) .

II . Ngăn xếp liên tục

1 . Khai báo kiểu dữ liệu


#define max 100
int stack[max];
int top;//bien chi phan tu nam tren cung

2 . Khởi tạo
Giả sử stack có n phần tử . Ta dùng biến top để chỉ phần tử nằm trên cùng của
stack .Như vậy lúc đầu stack rỗng thì top=0.
void khoitao_stack()
{
top=0;
}

3 . Kiểm tra stack rỗng


int is_empty() //kiem tra stack rong
{
return (top==0);
}

4 . Kiểm tra stack đầy


int is_full() //kiem tra stack day

Trang 15
{
return (top==max);
}

5 . Thêm dữ liệu vào stack


int push(int value)
{
if(top<max)
{
stack[++top]=value;
return top;
}
}

6 . Lấy dữ liệu ra khỏi stack


int pop()
{
if(top>0)
return stack[top--];
}

III . Ngăn xếp liên kết

1 . Khái niệm
Ngăn xếp con trỏ : con trỏ pd trỏ vào nút cuối , nút đầu tiên trỏ vào con trỏ null ,
nút sau sẽ trỏ vào nút trước nó

2 . Khai báo kiểu dữ liệu


typedef struct contro
{
int value ;
struct contro *link;
}stack;
stack *pd;

3 . Khởi tạo stack rỗng


void khoitao()
{
pd=NULL;
}

4 . Tạo ngăn xếp


Khởi tạo giá trị rỗng cho con trỏ pd trỏ vào đỉnh . Do ngăn xếp rỗng : tạo nút
mới và cho pd trỏ vào nút này , tạo 1 nút mới và cho phần liên kết của nút mới tạo
trỏ vào nút đầu tiên . Quá trình cứ tiếp tục cho đến khi ngăn xếp đầy .

Trang 16
void push(int value )
{
stack *p;
p=(stack*)malloc(sizeof(stack));
p->value=value;
p->link=pd->link;
pd->link=p;

5 . In ngăn xếp
void pop()
{
stack *p;
while (pd->link!=NULL)
{
p=pd->link;
printf("%5d",p->value);
pd->link=pd->link->link ;
}
}

PHẦN III : HÀNG ĐỢI _ QUEUE


I . Định nghĩa
Hàng đợi là 1 danh sách mà việc thêm vào được thực hiện ở 1 đầu và loại bỏ đựơc
thực hiện ở 1 đầu khác .
Nguyên tắc hoạt động : vào trứơc ra trứơc (FIFO)

II . Hàng đợi liên tục

1 . Khai báo kiểu dữ liệu


#define max 100
int queue[max];
int front ,rear,queue_size ;

2 . Khởi tạo
void khoitao_queue()
{
front=rear=0;
queue_size=0;
}

3 . Kiểm tra queue đầy


int is_full()

Trang 17
{
return (queue_size==max);
}

4 . Kiểm tra queue rỗng


int is_empty()
{
return (queue_size==0);
}

5 . Thêm phần tử
int push(int value)
{
if(queue_size<max)
{
queue_size++;
queue[++rear]=value;
if (rear==max)
rear=0;
}
return rear;
}

6 . Xoá phần tử
int pop(int *value)
{
if(queue_size>0)
{
*value=queue[++front];
queue_size--;
if(front>max)
front=0;
}
return front;

III . Queue liên kết

1 . Khai báo kiểu dữ liệu


typedef struct contro
{
int value;
struct contro *link;
} queue;
queue *pd,*pc;

Trang 18
2 . Các thao tác trên queue
Các thao tác như khởi tạo , thêm ,xoá ,tìm kiếm, sắp xếp đều giống như danh
sách liên kết đơn
void khoitao()
{
pd=NULL;
}
void push(int value)
{
queue *p;
p=(queue*)malloc(sizeof(queue));
p->value=value;
p->link=NULL;
if(pd==NULL)
{
pd=p;pc=p;
}
else
pc->link=p;
pc=p;
}
void pop()
{
queue *p;
p=pd;
while (p!=NULL)
{
printf("%5d",p->value);
p=p->link;
}
}

PHẦN IV : SẮP XẾP


I . Sắp xếp kiểu chèn trực tiếp : Insertion Sort
void insertsort()
{
int i,j,x;
for(i=1;i<n;i++)
{
x=mang[i];
j=i-1;
while(x<mang[j] && j>=0)
{
mang[j+1]=mang[j];
j--;

Trang 19
}
mang[j+1]=x;
}
}

II . Sắp xếp kiểu chọn trực tiếp : Selection Sort


void selectsort()
{
int i,j,k,x,mx;
for(i=0;i<max-1;i++)
{
mx=mang[i];
k=i;
for(j=i+1;j<max;j++)
if (mang[j]<mx)
{
mx=mang[j];
k=j;
}
x=mang[i];
mang[i]=mang[k];
mang[k]=x;
}
}

III . Sắp xếp nhanh : Quick Sort


void quicksort(int l,int r)
{
int i,j,m,tmp;
i=l;
j=r;
m=mang[(l+r)/2];
do
{
while (mang[i]<m) i++;
while (m<mang[j]) j--;
if (i<=j)
{
tmp=mang[i];
mang[i]=mang[j];
mang[j]=tmp;
i++;
j--;
}
}
while(i=<j);

Trang 20
if (l<j) quicksort(l,j);
if(i<r) quicksort(i,r);
}
void sort()
{
quicksort(0,n-1);
}

IV . Sắp xếp kiểu nổi bọt : Buble Sort


void buble_sort()
{
int i,j,x;
for(i=1;i<max;i++)
for(j=max-1;j>=i;j--)
if(mang[j-1]>mang[j])
{
x=mang[j-1];
mang[j-1]=mang[j];
mang[j]=x;
}
}

V . Sắp xếp kiểu nhị phân : Binary Sort


void binarysort()
{
int i, j, x, l, r, m;
for (i=1; i<n; i++)
{
x = mang[i];
l = 0;
r = i-1;
while (l <= r)
{
m = (l + r) / 2;
if (x < mang[m])
r = m - 1;
else
l = m + 1;
}
if (x < mang[l])
{
for (j=i-1; j>=l; j--)
mang[j+1] = mang[j];
mang[l] = x;
}
}

Trang 21
}

VI . Sắp xếp kiểu đổi chỗ : Interchange Sort


void interchange()
{
int i,j,tmp;
for(i=0;i<max-1;i++)
for(j=i+1;j<max;j++)
if(mang[i]>mang[j])
{
tmp=mang[i];
mang[i]=mang[j];
mang[j]=tmp;
}
}

PHẦN V : TÌM KIẾM


I . Tìm kiếm tuần tự
int tim_tuan_tu(int x )
{
int i=0;
while (i<max && x!=mang[i])
i++;
return i;
}

II . Tìm kiếm nhị phân


int tim_nhi_phan(int x)
{
int l=0,r=max, m;
do
{
m=(l+r)/2;
if (x<mang[m]) r=m-1;
if (x>mang[m]) l=m+1;

}
while (r>=l && x!=mang[m]);
if(x==mang[m]) return m;
else return 0;
}

Trang 22
PHẦN VI : ĐỆ QUI
I . Bài toán tháp Hà Nội

1 . Bài toán
Có một tháp n đĩa xếp từ đĩa lớn đến nhỏ , đĩa nhỏ nằm trên cùng ở cột A cần
chuyển đến cột C .Khi di chuyển cho phép dùng 1 cột trung gian , mỗi lần di chuyển
chỉ 1 đĩa , đĩa nhỏ phải nằm trên đĩa lớn .
Trình bày cách di chuyển đĩa từ cột A sang C theo từng bước

2 . Cài đặt
#include<stdio.h>
#include<conio.h>
#define A 0
#define B 1
#define C 2
void thaphn(int n , int from,int to ,int temp)
{
if (n>0)
{
thaphn(n-1,A,C,B);
printf(“\n Chuyen 1 dia o tang thu %d tu cot %c sang
cot %c ”,n,’A’+from,’A’+to);
thaphn(n-1,B,A,C);
}
}
void main()
{
int n ;
do
{
printf(“\n Moi ban nhap so dia:”);
scanf(“%d”,&n);
}
while (n<1||n>6);
thaphn(n,A,B,C);
getch();
}

3 . Khử đệ qui đuôi

void thaphn(int n , int from,int to ,int temp)


{
int swap;
while (n>0)

Trang 23
{
thaphn(n-1,A,C,B);
printf(“\n Chuyen 1 dia o tang %d tu cot %c sang cot
%c ”,n,’A’+from,’A’+to);
n--;
swap=from;/* khu de qui “thaphn(n-1,B,A,C)”*/
from=temp;
temp=swap;
}
}

II . Bài toán giai thừa

1 . Cài đặt
#include <stdio.h>
#include <conio.h>
long int giaithua(int n)
{
if(n==0)
return 1;
else
return n*giaithua(n-1) ;
}
void main()
{
int n ;
printf(“\n Moi ban nhap so :”);scanf(“%d”,&n);
printf(“\n Giai thua cua %d la %ld”,n,giaithua(n));
getch();
}

2 . Khử giai thừa


long int khugt(int n)
{
int i;
long int s=1;
for(i=1;i<=n;i++)
s*=i;
return s;
}

III . Bài toán fibonacci

1 . Bài toán :
Cho 1 số n , hãy viết dãy số Fibonacci gồm n số có dạng
F0 =0; F1=1;Fn=fn-1+fn-2 nếu n>2

Trang 24
2 . Cài đặt :
#include<stdio.h>
#include<conio.h>
int fibonacci(int n)
{
if (n<0)return 0;
else if(n==1)
return 1;
else return fibonacci(n-1)+fibonacci(n-2);
}
void main()
{
int n,i;
printf("\n Nhap so :");
scanf("%d",&n);
printf("\n Day fibonacci :\n");
for(i=2;i<=n+1;i++)
printf("%5d ",fibonacci(i));
getch();
}

3 . Khử fibonacci bằng vòng lặp for


int khufibonacci(int n)
{
int f,f1,f2,i;
if(n<0)return 0;
else
if(n==1) return 1;
else
{
f1=0;
f2=1;
for(i=2;i<=n+1;i++)
{
f=f2+f1;
f2=f1;
f1=f;
}
return f;
}
}

Trang 25
PHẦN VII CÂY
I . Định nghĩa

1 . Định nghĩa 1
Cây là tập hợp hữu hạn T gồm 1 hoặc nhiều nút trong đó có 1 nút đặc biệt là gốc , giữa
các nút có mối quan hệ phân cấp gọi là quan hệ cha con

2 . Định nghĩa 2 :
Định nghĩa đệ qui
1 nút là 1 cây . nút đó là gốc của cây
Nếu T1,T2 ,..Tk là 1 cây với các gốc lần lượt là n1,n2,n3 …,nk là 1 nút và n có quan hệ
cha con với n1,n2,nk thì lúc đó cây mới T sẽ được tạo lập

3 . Các định nghĩa về cây


Cấp của 1 nút là số con của nút đó
1 nút có cấp bằng 0 là lá (nút tận cùng)
1 nút có cấp khác 0 là nút nhánh
Cấp cao nhất của nút là cấp của cây . Cây có cấp n là cây n phân
Mức chiều cao của cây
Gốc của cây có mức là 1 , nếu nút cha có mức là i , con có mức là i+1
Chiều cao (sâu ) của cây là mức cao nhất của nút trên cây
Đường đi từ n1 đến nk là dãy các nút n1,nk trong đó ni là nút cha , ni+1 với 1<=i<=k
Độ dài đừơng đi =số nút -1= số cạnh đừơng đi
Cây nhị phân là cây có số cây con lớn nhất là 2

II . Khai báo kiểu dữ liệu


#include<stdio.h>
#include<conio.h>
#include<alloc.h>
typedef struct node
{
int data;
struct node *left,*right;
} tree;
tree *t,*t2;

III . Khởi tạo cây


void khoitao(tree **t)
// truyen bien la kieu tham bien de luu tru gia tri cua t
{
*t=NULL; // khi sd trong than chuong trinh tham bien phai
them *
}

Trang 26
IV . Tạo cây nhị phân tìm kiếm n nút

1 . Định nghĩa
Cây nhị phân tìm kiếm thoả điều kiện
Giá trị của các nút thuộc 1 tập quan hệ , giá trị của nút gốc >= nút con trái và nút
gốc cha<=nút con phải

2 . Tạo cây tìm kiếm nhị phân

2.1Thuật toán
Bổ sung lần lượt các nút vào 1 cây , nếu cây rỗng nút bổ sung là nút gốc
So sánh giá trị bổ sung tiếp theo với nút gốc . nếu nó < thì bổ sung vào cây con trái
, và ngược lại
Tiếp tục quá trình để được cây cần tạo

2.2Cài đặt
void chen(int x, tree **t)
{
if (*t==NULL)
{
*t=(tree*)malloc(sizeof(tree));
(*t)->data=x;
(*t)->left=NULL;
(*t)->right=NULL;
}
else
if (x > (*t)->data)
chen(x,&(*t)->right);
else
chen(x,&(*t)->left);
}
void taocay(tree **t)
{
int n,i,x;
printf("\n Nhap so nut : "); scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&x);
chen(x,t);
}
}

Trang 27
V . Duyệt cây

1 . Duyệt theo thứ tự trứơc (preoder)

1.1Thuật toán
Nếu cây rỗng thì không làm gì (phần neo)
Nếu cây không rỗng
Thăm nút gốc
Duyệt cây con trái theo tiền tự
Duyệt cây con phải theo tiền tự

1.2 Cài đặt


void duyettruoc(tree *t)
{
if (t!=NULL)
{
printf("%3d",t->data); printf("\n ");
duyettruoc(t->left);
printf("\t");
duyettruoc(t->right);
printf("\t");
}
}

2 . Duyệt theo thứ tự giữa (trung tự _ inorder)

2.1Thuật toán
Nếu cây rỗng thì không làm gì (neo)
Nếu cây không rỗng thì
Duyệt cây con trái theo trung tự
Thăm nút gốc
Duyệt cây con phải theo trung tự

2.2Cài đặt
void duyetgiua(tree *t)
{
if (t!=NULL)
{
duyetgiua(t->left);
printf("\n");
printf("%5d",t->data);
duyetgiua(t->right);
printf("\n ");
}
}

Trang 28
3 . Duyệt sau
void duyetsau(tree *t)
{
if (t!=NULL)
{
duyetsau(t->left);
duyetsau(t->right);
printf("%5d", t->data);
}

VI . Tạo cây cân bằng hoàn toàn

1 . Định nghĩa
Cây cân bằng hoàn toàn là cây nhị phân thoả
Tại mỗi nút thì số nút ở cây con trái và phải sai khác nhau nhiều nhất là 1

2 . Cài đặt
void caycbht(tree **t, int n)
{
int x,nl,nr;
tree *p;
if (n==0)
*t=NULL;
else
{
scanf("%d",&x);
p=(tree*)malloc(sizeof(tree));
p->data=x;
*t=p;
nl= n/2;
nr=n-nl-1;
caycbht(&p->left,nl);
caycbht(&p->right,nr);
}

}
Chương trình chính
void main()
{
int n;
clrscr();
khoitao(&t);
taocay(&t);
printf("\n Duyet theo thu tu truoc : \n ");

Trang 29
duyettruoc(t);
printf("\n Duyet theo thu tu giua : ");
duyetgiua(t);
printf("\n Duyet theo thu tu sau : ");
duyetsau(t);
printf("\n Tao cay can bang hoan toan \n ");
printf("\n Nhap so nut cua cay : ") ; scanf("%d",&n) ;
caycbht(&t2,n);
printf("\n Duyet truoc cay can bang hoan toan : ");
duyettruoc(t2);
getch();

Trang 30

Вам также может понравиться