ĐỀ THI CẤU TRÚC DỮ LIỆU & GIẢI THUẬT ( Có đáp án)
CẤU TRÚC DỮ LIỆU & GIẢI THUẬT
/*DE SO 1*/
/*DUNG DANH SACH LIEN KET*/
Câu a. Định
nghĩa danh sách liên kết đơn dùng để quản lý danh sách các học sinh, với cấu
trúc mỗi học sinh gồm có hai phần dữ liệu chính:
-
Họ tên học sinh, là một
chuỗi không quá 80 ký tự.
-
Ngày tháng năm sinh của học
sinh, theo cấu trúc dữ liệu thể hiện ngày DATE gồm có 3 trường ngày,
tháng, và năm được định nghĩa riêng.
Câu b. Viết
hàm nhập vào một danh sách các học sinh từ bàn phím, với quá trình nhập kết
thúc khi người dùng không nhập tên học sinh mới nữa. Danh sách học sinh này được
lưu vào danh sách liên kết đã định nghĩa. Chú ý thêm: Chương trình không kiểm
tra tính chính xác của ngày tháng năm sinh, và mặc định là dữ liệu nhập đúng.
Câu c. Viết
hàm sắp xếp danh sách học sinh theo thứ tự alphabet họ tên, và viết các hàm hỗ
trợ thao tác khởi tạo danh sách rỗng, in danh sách học sinh hiện hành,
cũng như hàm hủy toàn bộ học sinh.
Câu d. Sử dụng các hàm đã viết viết hàm main thực
hiện việc nhập vào một danh sách học sinh từ bàn phím, in danh sách đó ra, sắp
xếp các học sinh theo họ tên, và in lại danh sách đã sắp xếp ra màn hình. Cuối
cùng huỷ danh sách học sinh và kết thúc chương trình.
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>
struct date
{
unsigned
int ngay;
unsigned
int thang;
unsigned
int nam;
};
typedef struct
sv
{
char
hoten[80];
struct
date ngaysinh;
}sv;
typedef struct
nodesv
{
sv info;
struct
nodesv *next;
}nodesv;
typedef struct
list
{
nodesv *dau;
nodesv *cuoi;
}list;
/*---------khai bao
cac ham---------- */
void taolist(list &l);
nodesv *taosv();
void nhapsv(list &l);
void xuat(list l);
void huy(list &l);
void sapsep(list &l);
/*-------------------------------------*/
main()
{
int a;
list l;
taolist(l);
nodesv *p;
for(;;)
{
printf("\n1nhap
sinh vien");
printf("\n2xuat
sinh vien");
printf("\n3.huy");
printf("\n4.sap
xep");
printf("\n0.thoat");
printf("\nnhap
lua chon: ");
scanf("%d",&a);
switch(a)
{
case 1:
{
nhapsv(l);
break;
}
case 2:
{
xuat(l);
break;
}
case 3:
{
huy(l);
break;
}
case 4:
{
sapsep(l);
xuat(l);
break;
}
case 0: return 0;
default: break;
}
system("cls");
}
getch();
}
void taolist(list &l)
{
l.dau=NULL;
l.cuoi=NULL;
}
nodesv *taosv()
{
nodesv *p;
sv t;
p=new nodesv;
if(p==NULL)
exit(1);
printf("\nnhap
ten sinh vien: ");fflush(stdin);
gets(t.hoten);
strcpy(p->info.hoten,t.hoten);
printf("ngay
sinh (dd mm yy): ");
scanf("%d
%d %d",&t.ngaysinh.ngay,&t.ngaysinh.thang,&t.ngaysinh.nam);
p->info.ngaysinh.ngay=t.ngaysinh.ngay;
p->info.ngaysinh.thang=t.ngaysinh.thang;
p->info.ngaysinh.nam=t.ngaysinh.nam;
p->next=NULL;
return
p;
}
void themdau(list
&l,nodesv *p)
{
if(l.dau==NULL)
{
l.dau=p;
l.cuoi=l.dau;
}
else
{
p->next=l.dau;
l.dau=p;
}
}
void nhapsv(list &l)
{
int a,i;
nodesv *p;
printf("so
sinh vien can nhap: ");
scanf("%d",&a);
for(i=0;i<a;i++)
{
printf("\nsinh
vien thu %d",i+1);
themdau(l,taosv());
}
}
void xuat(list l)
{
nodesv *p;
p=l.dau;
printf("\n+---------------------+-------------------+");
printf("\n|TEN
SINH VIEN | NGAY SINH |");
printf("\n+---------------------+-------------------+");
while(p)
{
printf("\n|%-20s
| %-2d-%-2d-%-4d |",p->info.hoten,p->info.ngaysinh.ngay,p->info.ngaysinh.thang,p->info.ngaysinh.nam);
p=p->next;
}
printf("\n+---------------------+-------------------+");
getch();
}
void huy(list &l)
{
nodesv *p;
while(l.dau!=NULL)
{
p=l.dau;
l.dau=p->next;
delete
p;
}
}
void sapsep(list &l)
{
sv t;
for
(nodesv *p=l.dau;p!=NULL;p=p->next)
for (nodesv *q=p->next; q!= NULL;q=q->next)
if (stricmp(p->info.hoten,q->info.hoten)> 0)
{
t
= p->info;
p->info
= q->info;
q->info
= t;
}
}
/*DE 2*/
/*cay nhi phan tim kiem*/
Viết chương trình thực hiện các việc sau:
1.
Tạo cây
nhị phân tìm kiếm
2.
Duyệt cây
nhị phân tìm kiếm theo thứ tự giảm dần
Ví dụ: Nhập cây nhị phân tìm kiếm
như sau:
Kết quả xuất ra màn hình là: 18 15 14 12 10 8 6 2
3.
Đếm số nút
lá trên cây nhị phân tìm kiếm
4.
Xóa tất cả
các node có giá trị là số nguyên tố trên cây
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
typedef struct
node
{
int key;
struct node *trai;
struct node *phai;
}node;
typedef node *tree;
/*-------------khai
bao cac ham------------*/
void taocay(tree &t);
int themnode(tree &t,int x);
void RNL(tree t);
void nhap(tree &t);
void huynode(tree &t,int x);
void thaythe(tree &p,tree
&t);
int SNT(int x);
void huySNT(tree &t);
void demla(tree t,int &count);
/*------------------------------------------*/
main()
{
int
a,count=0;
tree t;
taocay(t);
for(;;)
{
printf("\n1.nhap
node");
printf("\n2.xuat
theo chieu giam dan");
printf("\n3.huy
cac so nguyen to trong cay");
printf("\n4.dem
la");
printf("\n0.thoat");
printf("\nnhap lua chon: ");
scanf("%d",&a);
switch(a)
{
case 1:
{
nhap(t);
break;
}
case 2:
{
RNL(t);
getch();
break;
}
case 3:
{
huySNT(t);
RNL(t);
getch();
break;
}
case 4:
{
demla(t,count);
printf("\nso la cua cay la : %d",count);
getch();
}
case 0: return 0;
default: break;
}
system("cls");
}
getch();
}
void taocay(tree &t)
{
t=NULL;
}
int themnode(tree &t,int x)
{
if(t!=NULL)
{
if(t->key==x)
return 0;
if(t->key>x)
return themnode(t->trai,x);
else return themnode(t->phai,x);
}
t=new node;
if(t==NULL) return
-1;
t->key=x;
t->trai=t->phai=NULL;
return 1;
}
void RNL(tree t)
{
if(t)
{
RNL(t->phai);
printf("%4d",t->key);
RNL(t->trai);
}
}
void nhap(tree &t)
{
int n,x;
printf("so node can nhap: ");
scanf("%d",&n);
for(int
i=0;i<n;i++)
{
printf("so
thu %d: ",i+1);
scanf("%d",&x);
themnode(t,x);
}
}
int SNT(int x)
{
int i;
for(i=2;i<x;i++)
{
if(x%i==0)
return 0;
}
return
1;
}
void huynode(tree &t,int x)
{
if(t)
{
if(t->key<x)
huynode(t->phai,x);
else
{
if(t->key>x)
huynode(t->trai,x);
else
{
node *p;
p=t;
if(t->trai==NULL)
t=t->phai;
else
{
if(t->phai==NULL)
t=t->trai;
else
thaythe(p,t->phai); //tim nho nhat ben nhanh
phai
}
delete
p;
}
}
}
else printf("\nkhong
tim thay so can tim ");
}
void thaythe(tree &p,tree
&t)
{
if(t->trai)
thaythe(p,t->trai);
else
{
p->key=t->key;
p=t;
t=t->phai;
}
}
void huySNT(tree &t)
{
if(t)
{
huySNT(t->trai);
huySNT(t->phai);
if(SNT(t->key)==1)
huynode(t,t->key);
}
}
void demla(tree t,int &count)
{
if(t)
{
if(t->phai==NULL&&t->trai==NULL)
count++;
else
{
demla(t->trai,count);
demla(t->phai,count);
}
}
}
ĐỀ THI CẤU TRÚC DỮ LIỆU & GIẢI THUẬT ( Có đáp án)
Reviewed by thanhtranminh
on
June 29, 2014
Rating: