You are on page 1of 18

CÂU HỎI VÀ BÀI TẬP CHƯƠNG 3 DANH SÁCH

PHẦN CÂU HỎI:


Câu 1: Cấu trúc dữ liệu nào thích hợp cho thao tác theo cơ chế LIFO
(vào sau ra trước)?
🡪 Stack (ngăn xếp)

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>

#define MAXLIST 100


typedef struct DanhSachDac{
int num;
int nodes[MAXLIST];
}List;

//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

if(IsFull(plist))// tuong duong voi if(IsFull(plist)==1)


{
printf("Danh Sach bi day!!!");
return;// thoat chuong trinh
}
else// danh sách chua day
{ for(i=0; i<plist.num; i++)
{
printf("Nhap phan tu thu %d: ",i+1);
scanf("%d",&plist.nodes[i]); // &A[i]
}
}
}
//Duyet danh sách (Xuat (in)) danh sach
void Output(List plist){
int i;
if(plist.num==0)// hoac su dung lenh: if(ListSize(plist)==0)
{ // hoac if (IsEmpty(list)==1)
printf("\n Danh sach khong co phan tu");
return;// thoát chuong trinh
}
for(i=0;i<plist.num;i++){
printf("%4d", plist.nodes[i]);
}
printf("\n");
}

//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) ){

printf("Danh sach rong !");


return; }

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))

printf("danh sach bi rong");

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))

printf("\n Vi tri xoa khong phu hop");

else{

if(IsEmpty(plist)) printf("\n Danh sach rong");


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) {

//khai báo các bien quan lý danh sách


List plist; //bien tro den nút dau tiên trong danh sách
Init(plist); //khoi tao danh sách liên ket ban dau chua có nút
nào
printf("CHUONG TRINH CUA LE TU QUYNH NHI");
//nhap danh sach ke
printf("Nhap danh sach:");
Input(plist);
//Xuat danh sách
printf("Hien thi (xuat) danh sach: ");
Output(plist);
int m,n;
printf("nhap vi tri va gia tri muon chen: ");
scanf("%d%d",&m,&n);
Insert(plist,m,n);
printf("danh sach sau khi chen: ");
Output(plist);
//truy xuat
int b,l;

printf("nhap vi tri can truy xuat: ");


scanf("%d",&l);
printf("phan tu thu %d la: ",&l);
printf("%d",b);

//danh sach sau khi xoa


Remove(plist,2);
printf("danh sach sau khi xoa la: ");
Output(plist);
int found = Search(plist,4);
if(found>0){
printf("tim thay tai vi tri %d",found);
}
else
printf("khong tim thay trong danh sach");
Sort1(plist);
printf("danh sach sau khi sap xep 1: ");
Output(plist);
SelectionSort(plist);
printf("danh sach sau khi sap xep 2: ");
Output(plist);
return 0;
}

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>

#define MAXLIST 100


typedef struct SV{
char Ten[30];
int MSSV;
float Diem;
}SV;

typedef struct DanhSachSV{


int num;
SV sinhvien[MAXLIST];
}List;

void Init(List &plist){


plist.num=0;
}

int ListSize(List plist){


return plist.num;
}
void InputSinhVien(SV &sv){
printf("Nhap MSSV : ");
scanf("%d",&sv.MSSV);
printf("Nhap Ten : ");
fflush(stdin);
gets(sv.Ten);
printf("Nhap Diem : ");
scanf("%d",&sv.Diem);
}

void InputList(List &plist){


int i;
SV svien;
do{
printf("\nNhap so phan tu : ");
scanf("%d",&plist.num);
}while(plist.num<0);
for(i=0;i<plist.num;i++){
printf("\nNhap phan tu SV thu : %d",i+1);
InputSinhVien(svien);
plist.sinhvien[i] = svien;
}
}

void Insert(List &plist,int pos , SV sv){


int i;
if(pos<0||pos>plist.num ){
printf("Vi tri chen khong hop le !");
return;
}
else{
for(i=plist.num-1;i>pos;i--){
plist.sinhvien[i+1]=plist.sinhvien[i];
}
plist.sinhvien[pos] = sv;
plist.num++;
}
}

void Remove(List &plist, int pos){


int i;
if(pos<0||pos>=ListSize(plist)){
printf("\n Vi tri xoa ko phu hop");
}
else {
for(i=pos;i<ListSize(plist)-1;i++){
plist.sinhvien[i]=plist.sinhvien[i+1];
}
plist.num--;
}
}

void UpdateDiem(List &plist,int pos,float diem){


if(pos<0||pos>plist.num){
printf("\nVi tri cap nhat ko hop le !");
return;
}
else{
plist.sinhvien[pos].Diem=diem;
}
}

void PrintSinhVien(SV sv){


printf("\n MSSV : %d", sv.MSSV);
printf("\n Ho ten : %s", sv.Ten);
printf("\n Diem : %.2f\n", sv.Diem);
}

void PrintList(List plist){


printf("\n____________________________\n");
for(int i = 0;i<plist.num;i++){
printf("\nThong tin sv thu %d",i+1);
PrintSinhVien(plist.sinhvien[i]);
}
printf("\n____________________________\n");
}

void SortDSSV(List &plist){


int i,j;
SV tam;
for(i=0;i<plist.num-1;i++){
for(j=i;j<plist.num;j++){

if(plist.sinhvien[i].MSSV>plist.sinhvien[j].MSSV){
tam = plist.sinhvien[i];
plist.sinhvien[i] = plist.sinhvien[j];
plist.sinhvien[j]= tam;
}
}
}
}

int Search(List plist,int mssv){


int vitri=0;
while(plist.sinhvien[vitri].MSSV!=mssv &&
vitri<plist.num){
vitri++;
}
if(vitri==plist.num){
return -1;
}
return vitri;
}

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>

typedef struct node{


int info;
struct node* next;
}Node;
typedef Node* NODEPTR;

void Init(NODEPTR &phead){


phead=NULL;
}

int IsEmpty(NODEPTR phead){


return (phead==NULL);
}

NODEPTR CreateNode(int x){


NODEPTR p=new Node;
p->info=x;
p->next=NULL;
return p;
}
//insertfirst
void InsertFirst(NODEPTR &phead, int x){
NODEPTR p=CreateNode(x);
if(phead==NULL)
phead=p;
else
{
p->next=phead;
phead=p;
}
}
//insertlast
void InsertLast(NODEPTR &phead, int x){
NODEPTR tam=CreateNode(x);
NODEPTR p = phead;
if (phead==NULL)
phead=tam;
else
{
NODEPTR ptemp=phead;
while (ptemp->next!=NULL)
ptemp = ptemp->next;
ptemp->next=tam;
}
}
//insert after
void InsertAfter (NODEPTR q, int x){
NODEPTR p;
if(q!=NULL){
p=CreateNode(x);
p->next=q->next;
q->next=p;
}
}
//xoa nut dau danh sach
void DeleteFirst(NODEPTR&pHead){
NODEPTR p;
if(IsEmpty(pHead))
printf("List is empty!");
else{
p=pHead;
pHead = pHead->next;
delete p;
}
}
//xoa nut sau danh sach
void DeleteAfter(NODEPTR &p)
{
NODEPTR q;
if(IsEmpty(p))
{
printf("Empty");
}
else
{
q=p->next;
p->next=q->next;
delete q;
}
}
//xoa mot nut dung sau p
void DeleteX(NODEPTR &pHead, int x){
if (pHead==NULL)
return;
NODEPTR del=pHead;
NODEPTR pre= NULL;
while(del!=NULL)
{
if(del->info==x) break;
pre=del;
del=del->next;
}
if(pre==NULL) pHead=pHead->next;
else{
pre->next=del->next;
del->info=NULL;
}
}

//xoa mot nut co khoa x


void DeleteXX(NODEPTR &pHead, int x)
{
NODEPTR q;
NODEPTR p = pHead;
while ((p != NULL) && (p->info != x))
{
q = p;
p = p->next;
}
if (q != NULL)
DeleteAfter(q);
else
DeleteFirst(q);
}
//tim kiem tren danh sach
NODEPTR Search(NODEPTR phead, int x){
NODEPTR p=phead;
while(p!=NULL)
{
if(p->info==x)
break;
p=p->next;
}
return p;
}
//sap xep danh sach
void Sort(NODEPTR &phead){
NODEPTR p,q;
int tam;
for(p=phead;p->next!=NULL;p=p->next)
for (q=p->next;q!=NULL;q=q->next)
if(p->info>q->info)
{
tam=p->info;
p->info=q->info;
q->info=tam;
}
}
//showlist
void ShowList(NODEPTR phead)
{
NODEPTR p=phead;
if(p==NULL)
printf("\n Danh sach bi rong");
while(p!=NULL){
printf("%5d",p->info);
p=p->next;
}
}
//hàm main
int main()
{
int i;
//khai bao mot danh sach
NODEPTR ds;
//khoi tao danh sach
Init(ds);
//for(i=1;i<=10;i++) InsertFirst(ds,i);
for(i=1;i<10;i++) InsertLast(ds,i);

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.

You might also like