TRƯỜNG ĐẠI HỌC BÁCH KHOA ĐÀ NẴNG
KHOA CÔNG NGHỆ THÔNG TIN
BÀI BÁO CÁO THỰC HÀNH
CẤU TRÚC DỮ LIỆU
GIÁO VIÊN HƯỚNG DẪN: HỒ PHAN HIẾU
NHÓM THỰC HÀNH: 07B
SINH VIÊN THỰC HIỆN: NGUYỄN TRÍ CÔNG LỚP: 09T3
ĐỖ DUY TƯ LỚP : 09T2
ĐÀ NẴNG, 03/2011
BÀI 14:ĐỀ 3
ĐỀ BÀI 14:
Quản lí thông tin số lượng sinh viên của từng lớp: tên lớp, số lượng sinh viên nam, số
lượng sinh viên nữ. Tổ chức cấu trúc dữ liệu thích hợp để biểu diễn các thông tin trên
và cài đặt các chức năng:
a) Cập nhật thông tin số lượng sinh viên các lớp (thêm, sửa, xóa).
b) Tính số lượng sinh viên tứng lớp = Số lượng nam + Số lượng nữ
c) Tìm thông tin của một lớp (nhập tên lớp).
d) In ra những lớp có số lượng sinh viên >=100
THUẬT TOÁN VÀ CÔNG VIỆC:
-Công việc cần làm, bổ sung thêm 1 số công việc khác.
Viết hàm khởi tạo nhập danh sách.
Viết hàm nhập danh sách.
Viết hàm viết hàm cập nhật danh sách bao gồm các công việc:
• Cập nhật số lượng sinh viên lớp (Số lượng nam, số lượng nữ).
• Sửa tên 1 lớp
Viết hàm liệt kê thông tin tất cả các lớp.
Viết hàm tìm kiếm thông tin lớp(Nhập tên lớp).
Tìm và in ra lớp có tổng số sinh viên >=100.
Viết hàm xóa 1 lớp.
}
3. Viết hàm nhập danh sách từ bàn phím.
•Viết hàm nhập mới danh sách từ bàn phím, có sử dụng hàm chèn phần tử là
hàm “them”, hoặc cũng có thể viết gộp vào trong hàm nhập. Hàm “them” là hàm
vừa thêm phần tử vào danh sách, vừa có thứ tự được sắp xếp trong khi thêm vào.
void them(List &F,infor1 name,infor2 nnam,infor2 nnu)
{
List p,before,after;
p=new LOP;
strcpy((*p).tenlop,name);(*p).slnam=nnu;(*p).slnu=nnam;
after=F;
while((after!=NULL)&&(strcmp((*after).tenlop,name)<0))
{
before=after;
after=(*after).next;
}
(*p).next=after;
if(F==after) F=p;
else (*before).next=p;
}
• Hàm nhập:
void NewCreate(List &F)
{ int k;
F=NULL;
do
{ Nhap:
printf("\nNhap ten Lop: "); fflush(stdin);gets(name);
if(Search(F,name))
{printf("\nTen da co trong danh sach, vui long nhap lai!");
goto Nhap;
Ta bắt đầu tìm kiếm phần tử đầu tiên được chỉ bởi F trở đi cho đến khi tìm được
phần tử cần tìm hoặc đã kiểm tra xong phần tử cuối cùng mà không có thì dừng.
Hàm Search(F,name) kiểu List, tìm và trả về địa chỉ của phần tử đầu tiên tìm
được hoặc trả về giá trị kiểu NULL nếu tìm không có.
5. Hàm cập nhật thông tin Lớp(Sửa tên LỚP hoặc sửa số lượng sinh viên
nam, nữ).
void Update(List &F)
{ char up;
printf("\nNhap ten lop can cap nhat: ");
fflush(stdin);
gets(name);
p=Search(F, name);
if((p!=NULL)&&(strcmp((*p).tenlop,name)==0))
{
strcpy((*p).tenlop,name);
printf("\nBan co muon sua ten LOP (y/n)?"); scanf("%c",&up);
if(up=='y'){ printf("\nNhap ten lop (New)");
fflush(stdin); gets(name);
strcpy((*p).tenlop,name);
}
if(up=='n') printf("\n Huy bo sua ten lop.");
printf("\n so luong nam:");
scanf("%d",&nnam);
(*p).slnam = nnam;
printf("\n so luong nu:");
scanf("%d",&nnu);
(*p).slnu=nnu;
printf("\n Da cap nhat thanh cong !");
}
else printf("KO ton tai LOP ");
{ printf("\nDanh sach lop va thong tin");
printf("\n Ten LOP |so luong NAM|So luong NU");
}
while(p!=NULL)
{
printf("\n%10s %10d %10d", (*p).tenlop, (*p).slnam, (*p).slnu);
p=(*p).next;
}
printf("\nNhan ENTER de ve menu chinh");getch();
}
• Ta liệt kê các phần tử kể từ phần tử đầu tiên được chỉ bởi con trỏ F và dựa
vào trường lien kết next để lần lượt liệt kê các phần tử tiếp theo.
• Biến con trỏ p lần lượt chỉ đến từng phần tử trong danh sách, nếu
p==NULL thì thông báo danh sách rỗng! . Còn không thì liệt kê danh sách gồm
các cột: “Ten LOP |so luong NAM|So luong NU”.
8. Các hàm thực hiện một số yêu cầu bài tập.
• Hàm menu dung để in ra thực đơn lựa chọn công việc cần làm, tùy thuộc số
lượng công việc sử dụng lệnh ghép switch(n)
{case 0: <Công việc 0>
case 1: <Công việc 1>
case 2: <Công việc 2>
case k: <Công việc k>
case m:<Công việc m>
}
và hàm do{ công việc cần làm
} while(điều kiện);
void menu()
{ printf("\n MENU LUA CHON ");
printf("\nLua chon cong viec thuc hien quan ly so luong sinh vien:");
p=F;
printf("\n Ten LOP | Tong so");
while(p!=NULL)
{ if((*p).slnu+(*p).slnam>=100)
printf("\n%10s %17d", (*p).tenlop,(*p).slnu+(*p).slnam);
p=(*p).next;
}
printf("\nNhan ENTER de ve menu chinh");
getch();
}
9. Hàm xóa 1 LỚP.
void DeleteLop(List &F,List name)
{ List before,after;
after=F;
while((after!=NULL)&&(after!=name))
{ before=after;
after=(*after).next;
}
if(after!=NULL)
{ if(F==name) F=(*name).next;
else (*before).next=(*name).next;
delete name;
}
}
• Biến before đứng trước ngay trước phần tử cần xóa, biến con trỏ after chỉ
đến phần tử đứng ngay sau phần tử chỉ bởi biến before.
10. Hàm main()
• Chương trình chính:
main()
{ char k;
printf("\n%10s %10d %10d %10d", (*p).tenlop, (*p).slnam, (*p).slnu,
(*p).slnam+(*p).slnu);
printf("\nBan Co muon xoa (y/n)?");scanf("%c",&k);
if(k=='y')
{DeleteLop(F,p); printf("\nXoa thanh cong!");}
if(k=='n') printf("\n Ban da huy XOA") ;
}
break;
}
}while(cv!=0);
getch();
}
• Kết quả màn hình hiện lênh như hình dưới đây:
• Hàm thực hiện các công việc từ 0 -> 7.
• Trong khi nhập vào không phải là một số trong bảng thực đơn MENU lựa
chọn thì tiếp tục gọi hàm menu(); còn không thì gọi các hàm đã có sẵn trong
chương trình để thực hiện công việc cần làm.