Professional Documents
Culture Documents
Câu 2: Cấu trúc dữ liệu nào thích hợp cho thao tác theo cơ chế FIFO
(vào trước ra trước)?
🡪 Queue (hàng đợi)
Câu 3: Cho cấu trúc dữ liệu danh sách liên kết sau, hàm insert bổ sung
thêm phần tử x vào vị trí thứ p của danh sách list với chiều dài len:
struct Node {
int data;
Node *pNext;
};
struct danhsach
{
Node *pHead;
};
void insert(int x, int p, danhsach *list)
{
int i;
if(p<1 || p>list->len)
printf(“\n Vị trí phần tử cần bổ sung không hợp lệ”);
else …
printf(“\n Danh sách đã đầy !”);
else {
for(i=list->len;i>=p;i--)
list->v[i]=list->v[i-1];
list->v[p-1]=x; list->len++;
}
}
Điền code vào dấu …
=>if (full(list))
Câu 4: Cho cấu trúc dữ liệu danh sách liên kết sau, Hàm Getv để lấy giá
trị của phần tử thứ p trong danh sách list
struct Node
{
int data;
Node *pNext;
};
struct danhsach
{
Node *pHead;
};
int Getv(int p, danhsach list)
{
…
{
printf(“p không hợp lệ”);
return -1;
}
else
if(empty(&list))
{ printf(“Danh sách rỗng”); return -2;}
else
return list.v[p-1];
}
Điền lệnh vào dấu …
=>if(p<1 || p>list->len)
Câu 5: Độ dài của danh sách được đo bằng gì?
=> Độ dài của danh sách được đo bằng số phần tử có trong danh sách đó.
Câu 6:
Tìm mô tả đúng cho hàm sau:
int SC (int M[], int Len, int CM[])
{ for (int i = 0; i < Len; i++)
CM[i] = M[i];
return (Len);
}
=>Hàm thực hiện việc sao chép nội dung mảng M có chiều dài Len về mảng
CM có cùng chiều dài. Hàm trả về chiều dài của mảng CM sau khi sao chép.
Câu 7: Cấu trúc dữ liệu mảng có các ưu điểm nào?
=>Có thể truy xuất ngẫu nhiên; Dễ sắp xếp; Dễ tìm kiếm
Câu 8: Cấu trúc dữ liệu cho kiểu dữ liệu sinh viên như sau
typedef struct tagSV{
char MSSV[8];
char Ten[30];
char NgaySinh[11];
float DTB;
}SV;
Nếu khai báo: SV sv1, *sv2;
Để gán giá trị “Nguyen Van A” cho mã sinh viên của sv1 và “Nguyen Van
B” sv2 ta thực hiện như thế nào ?
=>strcpy(sv1.Ten,”Nguyen Van A”);
strcpy(sv2->Ten,”Nguyen Van B”);
Câu 9: Cho cấu trúc dữ liệu quản lý sinh viên như sau:
struct SinhVien
{
char ma[10];
char ten[150];
bool gioitinh;
};
Hàm tìm sinh viên theo mã sinh viên:
SinhVien * TimSinhVienTheoMa(SinhVien dsSV[],int siso,char matim[])
{
for(int i=0;i<siso;i++)
{
if(...)
{
return &dsSV[i];
}
}
return NULL;
}
Điền vào dấu…
=> if(strcmp(matim,dsSV[i].ma)==TRUE)
Câu 10: cho đoạn lệnh:
int[,]A=new int[2,3] {{3,-1,-4},{-9,0,5}};
int count = 0;
for (int i = 0; i <2; i ++)
for (int j = 0; j <3; j ++)
if (A[i,j] > 0) count ++;
cout<<count;
Cho biết giá trị được in ra màn hình là gì?
=>2
3 -1 -4
-9 0 5
PHẦN BÀI TẬP:
Bài 1: Cài đặt các tác vụ trên danh sách đặc:
1. Nhập danh sách
2. Xuất danh sách
3. Thêm 1 phần tử vào danh sách
4. Xóa 1 phần tử ra khỏi danh sách
5. Tìm kiếm 1 phần tử trong danh sách
6. Ghép 2 danh sách thành 1 danh sách
7. Tách 1 danh sách thành 2 danh sách
#include <stdio.h>
#include <conio.h>
#include <string.h>
//Khoi tao
void Init(List &plist){
plist.num=0;
}
// Xac dinh so nut cua danh sách:
int ListSize(List plist){
return plist.num;
}
// Kiem tra danh sách rong:
int IsEmpty(List plist){
return (plist.num==0);//Ham tra ve mot gia tri, neu =1 tuc la ds
rong, =0 la ds khong rong
}
// Kiem tra danh sách day
int IsFull(List plist){
return (plist.num==MAXLIST);
}
//Nhap danh sach
void Input(List &plist)
{
int i;
do
{
printf("\nNhap so phan tu: ");
scanf("%d",&plist.num); //1D array: scanf("%d",&n);
} while (plist.num<0);// neu so phan tu <0 thi yeu cau nhap lai
//INSERT
void Insert(List &plist, int pos, int x)
{ int i;
if (pos<0||pos>plist.num){ printf("Vi tri chen khong hop le !");
return; }
else{ if(IsEmpty(plist) ){
else {
for (i=plist.num-1;i>pos;i-- )
{ plist.nodes[i]=plist.nodes[i-1]; }
plist.nodes[pos]=x;
plist.num++; }
}
//truy xuat mot phan tu trong danh sach
int Retrieve(List plist, int pos){
if(pos<0 || pos>=ListSize(plist))
{ printf("Vi tri %d khong hop le",pos); return 0;}
else
{ if(IsEmpty(plist))
else
return plist.nodes[pos];
}
//xoa mot phan tu ra khoi danh sach
int Remove(List &plist, int pos){
int i;
int x;
if(pos <0 || pos>=ListSize(plist))
else{
x=plist.nodes[pos];
for(i=pos;i<ListSize(plist)-1;i++){
plist.nodes[i]=plist.nodes[i+1];
}
plist.num--;
return x;
}
}
//tim kiem 1 phan tu trong danh sach
int Search(List plist, int x){
int vitri=0;
while(plist.nodes[vitri]!=x && vitri<plist.num) vitri++;
if(vitri==plist.num) return -1;
return vitri;
}
//sap xep danh sach
void Sort1(List &plist){
int tam,i,j;
for(i=0;i<plist.num-1;i++)
for(j=i+1;j<plist.num;j++)
if(plist.nodes[i]>plist.nodes[j]) // Doi cho 2 phan tu nay
{
tam=plist.nodes[i];
plist.nodes[i]=plist.nodes[j];
plist.nodes[j]=tam;
}
}
//sap xep danh sach 2
void SelectionSort(List &plist){
int i,j,vitrimin,min;
for(i=0;i<plist.num-1;i++){
min=plist.nodes[i];
vitrimin=i;
for(j=i+1;j<plist.num;j++){
if(min >plist.nodes[j]){
min=plist.nodes[j];
vitrimin=j;
}
}
plist.nodes[vitrimin]=plist.nodes[i];
plist.nodes[i]=min;
}
}
//Hàm chính
int main(int argc, char** argv) {
Bài 2: Viết chương trình quản lý sinh viên cài đặt bằng danh sách đặc.
Chương trình gồm các chức năng:
- Thêm danh sách SV
- Thêm 1 SV vào danh sách
- Xóa 1 SV khỏi danh sách
- Hiệu chỉnh sinh viên
- Sắp xếp danh sách SV theo mã sinh viên
- Tìm kiếm SV theo mã SV
- Xóa toàn bộ danh sách SV
#include<stdio.h>
#include<conio.h>
#include<string.h>
if(plist.sinhvien[i].MSSV>plist.sinhvien[j].MSSV){
tam = plist.sinhvien[i];
plist.sinhvien[i] = plist.sinhvien[j];
plist.sinhvien[j]= tam;
}
}
}
}
int main(){
int key,pos,n,ms,found;
float diem;
SV sv;
List plist;
Init(plist);
printf("nhap danh sach sinh vien :");
InputList(plist);
printf("Danh sach nhap co so luong %d SV",plist.num);
while(true){
printf("**************************\n");
printf("**Chuong trinh quan li sinh vien**\n");
printf("** 1. In danh sach sinh vien **\n");
printf("** 2. Them du lieu 1 sinh vien **\n");
printf("** 3. Xoa du lieu 1 sinh vien **\n");
printf("** 4. Hieu chinh diem sinh vien **\
n");
printf("** 5. Sap xep DS theo ma SV **\n");
printf("** 6. Tim kiem SV theo ma SV **\n");
printf("** 7. Thoat **\n");
printf("**************************\n");
printf("Nhap lua chon cua ban vao day !!\n");
scanf("%d",&key);
if(key==1){
printf("\nBan da chon in DSSV");
PrintList(plist);
printf("\nBam phim bat ky de tiep tuc !");
getch();
}
else if(key==2){
printf("\nBan da chon nhap them 1 SV");
printf("\nBan nhap vi tri muon chen vao danh
sach");
scanf("%d",&pos);
InputSinhVien(sv);
Insert(plist,pos,sv);
printf("\nBan da nhap thanh cong !");
printf("\nNhap phim bat ki de tiep tuc !");
getch();
}
else if(key==3){
printf("\nBan da chon xoa 1 sv!");
printf("\nBan da xoa thanh cong!");
getch();
}
else if(key==4){
printf("\nBan da chon hieu chinh diem sinh
vien");
printf("\nBan nhap SV muon hieu chinh:");
scanf("%d",&pos);
printf("\nBan nhap diem muon hieu chinh");
scanf("%f",&diem);
UpdateDiem(plist,pos-1,diem);
printf("\nBan nhap diem thanh cong");
printf("\nNhap phim bat ky de tiep tuc");
getch();
}
else if (key == 5){
printf("\nBan chon sap xep DS sinh vien");
SortDSSV(plist);
printf("\nBan sap xep thanh cong");
printf("\nNhap phim bat ky de tiep tuc");
getch();
}
else if(key==6){
printf("\n Ban chon tim kiem SV theo MSSV");
printf("\nNhap MSSV tim kiem : ");
scanf("%d",&ms);
found = Search(plist,ms);
if(found>0){
printf("\nBan da tim kiem thanh cong");
PrintSinhVien(plist.sinhvien[found]);
}
else{
printf("\nBan da tim kiem that bai");
}
printf("\n Press key to countineu");
getch();
}
}
}
Bài 3: Cài đặt các tác vụ bổ sung trên danh sách liên kết đơn
1. Nhập/xuất danh sách
2. Thêm phần tử vào đầu/cuối danh sách.
3. Tìm 1 phần tử trong danh sách
4. Sắp xếp danh sách tăng/giảm
5. Tìm kích thước của danh sách
6. Đếm số phần tử/số phần tử chẵn/ số phần tử lẻ trong danh sách
7. Thêm phần tử x vào ds đã có thứ tự (tăng) sao cho sau khi thêm vẫn
có thứ tự (tăng).
8. Thêm một phần tử có khoá x vào vị trí pos trong danh sách
9. Xóa 1 phần tử trong danh sách
#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>
InsertFirst(ds,5);
InsertFirst(ds,7);
InsertFirst(ds,3);
printf("\n cac node trong danh sach sau khi InsertFirst la: ");
ShowList(ds);
InsertLast(ds,8);
InsertLast(ds,9);
InsertLast(ds,3);
printf("\n cac node trong danh sach sau khi insertlast la: ");
ShowList(ds);
InsertAfter(ds->next->next,8);
printf("\n cac node trong danh sach sau khi insertafter la: ");
ShowList(ds);
DeleteFirst(ds);
printf("\n cac node trong danh sach sau khi deletefirst la: ");
ShowList(ds);
DeleteX(ds->next,2);
printf("\n cac node trong danh sach sau khi deleteX la: ");
ShowList(ds);
DeleteXX(ds,5);
printf("\n cac node trong danh sach sau khi deleteXX la: ");
ShowList(ds);
//tim so
int x;
printf("\n nhap so can tim: ");
scanf("%d",&x);
NODEPTR f;
f=Search(ds,x);
if(f!=NULL)
{
printf("\n da tim duoc %d trong danh sach",x);
ShowList(ds);
}
else printf("\n khong tim thay %d trong danh sach",x);
//sap xep danh sach
Sort(ds);
printf("\n danh sach da duoc sap xep: ");
ShowList(ds);
}
Bài 4: Viết chương trình quản lý danh sách sinh viên sử dụng danh sách
liên kết đơn, thông tin mỗi sv gồm: Mã sv - chuỗi tối đa 10 kí tự, Họ tên -
chuỗi tối đa 40 kí tự, Điểm trung bình - số thực. Chương trình có các
chức năng sau:
1. Tạo 1 danh sách gồm n sinh viên (n nhập từ bàn phím, thông tin của
mỗi sv nhập từ bàn phím).
2. Xuất danh sách sinh viên.
3. Xuất thông tin các sv có điểm TB>5.
4. Tìm sinh viên có tên là X.
5. Tìm sinh viên có điểm TB lớn nhất
6. Sắp xếp danh sách tăng dần theo điểm trung bình.
7. Thêm 1 sinh viên vào cuối danh sách
8. Xóa SV đầu danh sách
9. Xóa SV cuối danh sách
10.Xóa toàn bộ danh sách
Bài 5: Hiện thực Stack và các tác vụ của Stack bằng mảng
Bài 6: Viết chương trình đổi một số thập phân sang cơ số 2 sử dụng
Stack.