Professional Documents
Culture Documents
Cau Truc Du Lieu 1+2
Cau Truc Du Lieu 1+2
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
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 .
Trang 3
5 . Kiểm tra danh sách rỗng
int is_empty()
{
return (n==-1);
}
7 . In danh sách
void in_ds()
{
int i;
for(i=0;i<n-1;i++)
printf("%3d",ds[i]);
}
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ị
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;
}
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 .
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.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;
}
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;
}
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;
}
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
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;
}
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;
}
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;
}
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);
}
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.
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;
}
}
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);
}
}
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;
}
Trang 15
{
return (top==max);
}
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ó
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 ;
}
}
2 . Khởi tạo
void khoitao_queue()
{
front=rear=0;
queue_size=0;
}
Trang 17
{
return (queue_size==max);
}
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;
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;
}
}
Trang 19
}
mang[j+1]=x;
}
}
Trang 20
if (l<j) quicksort(l,j);
if(i<r) quicksort(i,r);
}
void sort()
{
quicksort(0,n-1);
}
Trang 21
}
}
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();
}
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;
}
}
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();
}
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();
}
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
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.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.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ự
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);
}
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