Tải bản đầy đủ (.docx) (68 trang)

ĐỀ CƯƠNG ôn tập học PHẦN cấu TRÚC dữ LIỆU và GIẢI THUẬT

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (919.3 KB, 68 trang )

ĐỀ CƯƠNG ÔN TẬP HỌC PHẦN CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT
A. Đề:
Câu 1
a) Ngăn xếp là gì? Trình bày cách tổ chức ngăn xếp bằng mảng, danh sách
liên kết đơn?
b) Viết phép toán đẩy một phần tử vào ngăn xếp (Push), lấy ra (Pop) cho một
ngăn xếp được tổ chức dạng mảng, danh sách liên kết đơn, cho ví dụ minh họa?
Câu 2
Cho các xâu ký tự có dạng w $ w’, trong đó w’ là đảo ngược của xâu w,
chẳng hạn nếu w = a c d b thì w’ = b d c a. Hãy thiết kế thuật toán để đoán
nhậncác xâu ký tự trên và cho ví dụ mô phỏng?
Câu 3
Trình bày ý tưởng cho thuật toán sắp xếp chọn trực tiếp (selection sort). Theo
thuật toán này, anh/chị hãy viết hàm sắp xếp n số nguyên theo chiều tăng dần, cho
ví dụ minh họa các bước thực hiện.
Câu 4
a) Danh sách liên kết đơn là gì? Trình bày cách tổ chức.
b) Viết các phép toán bổ sung một phần tử và lấy ra một phần tử trong một
danh sách liên kết đơn, cho ví dụ minh họa.
Câu 5
Cho dãy A gồm n phần tử nguyên a 1, a2, ..., an (các phần tử khác nhau). Hãy xây
dựng thuật toán tìm phần tử lớn thứ k trong dãy A theo các bước sau đây:
1. Biểu diễn cấu trúc dữ liệu;
2. Mô tả thuật toán;
3. Ví dụ mô phỏng.
Câu 6
a) Trình bày cấu trúc dữ liệu danh sách được tổ chức dưới dạng mảng.
b) Viết phép toán bổ sung một phần tử trong một danh sách được tổ chức dạng
mảng, cho ví dụ minh họa.

1




Câu 7
Cho file văn bản bất kỳ. Hãy xây dựng thuật toán tìm từ trong file xuất hiện
nhiều nhất theo các bước sau:
1. Biểu diễn cấu trúc dữ liệu;
2. Mô tả thuật toán;
3. Ví dụ mô phỏng.
Câu 8
a) Trình bày cấu trúc dữ liệu danh sách liên kết đôi.
b) Viết các phép toán lấy ra một phần tử trong một danh sách liên kết đôi, cho
ví dụ minh họa.
Câu 9
Cho hai danh sách móc nối L1 và L2, các phần tử thuộc kiểu số nguyên được sắp
theo thứ tự tăng dần. Hãy thiết kế thuật toán xây dựng danh sách L từ hai danh
sách trên sao cho danh sách L cũng có thứ tự tăng dần.
Câu 10
a) Trình bày cấu trúc dữ liệu danh sách liên kết vòng một chiều?
b) Viết phép toán bổ sung một phần tử trong một danh sách liên kết vòng
một chiều, cho ví dụ minh họa?
Câu 11
Hai từ được gọi là Anagram của nhau nếu từ này có thể nhận được từ từ kia
bằng cách thay đổi trật tự các chữ cái, ví dụ Read, dare là hai từ Anagarm của nhau.
Hãy xây dựng thuật toán kiểm tra xem hai từ có phải là Anagram của nhau hay
không theo các bước sau:

1. Biểu diễn cấu trúc dữ liệu;
2. Mô tả thuật toán;
3.


Ví dụ mô phỏng.

Câu 12
a) Trình bày cấu trúc dữ liệu danh sách liên kết vòng hai chiều.
b) Viết các phép toán bổ sung một phần tử trong một danh sách liên kết vòng
hai chiều, cho ví dụ minh họa.

2


Câu13
Xâu kí tự được gọi là xâu chuẩn nếu thứ tự xuất hiện của các dấu đóng/mở
ngoặc tuân thủ theo nguyên tắc đóng mở của biểu thức toán học.
Ví dụ:

(()()); ()((()())()) : là các xâu chuẩn.
()); (()()))(()

: là các xâu không chuẩn.

Hãy thiết kế thuật toán và viết hàm kiểm tra xem một xâu có phải ở dạng xâu
chuẩn hay không, cho ví dụ minh họa các bước thực hiện.
Câu 14
a) Trình bày cấu cấu trúc dữ liệu hàng đợi (Queue) được tổ chức dưới dạng
mảng, mảng vòng tròn, danh sách liên kết.
b) Hãy viết hàm bổ sung/loại bỏ một phần tử trong hàng đợi theo các cách tổ
chức trong câu a, cho ví dụ minh họa.
Câu 15
Thiết kế thuật toán đổi số ở hệ đếm 10 ra hệ đếm cơ số q (2,8,16) bằng cách sử
dụng một Stack theo các bước sau đây:

1. Biểu diễn cấu trúc dữ liệu;
2. Mô tả thuật toán;
3. Ví dụ mô phỏng.
Câu 16
Cho một stack s, giả sử đã có các phép toán push(s,x) (đẩy phần tử x vào stack s),
pop(s,x) (lấy phần tử x từ đỉnh stack s). Hãy xây dựng thuật toán và viết hàm lấy
phần tử thứ k kể từ đỉnh của stack (được phép sử dụng stack trung gian) sao cho
các phần tử khác vẫn được bảo toàn thứ tự. Cho ví dụ mô phỏng.
Câu 18
Cho file văn bản bất kỳ chứa các số nguyên, giả sử đã có các phép toán bổ sung
phần tử vào cây tìm kiếm nhị phân. Hãy thiết kế thuật toán thuật toán xây dựng
cây tìm kiếm nhị phân có khoá là các số nguyên trong file văn bản đã cho theo các
bước sau đây:

a) Biểu diễn dữ liệu;
b) Biểu diễn thuật toán;
c) Ví dụ mô phỏng.
3


Câu 19

a) Trình bày cấu trúc dữ liệu cây tìm kiếm nhị phân (định nghĩa, cách tổ
chức).

b) Viết các phép toán trong cây tìm kiếm nhị phân, cho ví dụ minh họa.
Câu 20
Cho văn bản P và mẫu Q, hãy xây dựng thuật toán và viết hàm tìm sự xuất
hiện đầu tiên của Q trong P theo cấc bước:
a) Biểu diễn dữ liệu;

b) Hàm tìm kiếm (ngôn ngữ tuỳ chọn, nếu Q xuất hiện trong P thì trả về vị trí
xuất hiện đầu tiên, ngược lại trả về không);
c) Ví dụ mô phỏng.
Câu 21
Cho hai mảng nguyên X,Y các phần tử được sắp theo thứ tự tăng dần. Hãy lập
thuật toán xây dựng dãy Z từ hai dãy đã cho sao cho Z cũng có thứ tự tăng dần
theo các bước sau:
a) Biểu diễn cấu trúc dữ liệu;
b) Mô tả thuật toán;
c) Ví dụ mô phỏng.
Câu 22
a) Các phương pháp duyệt cây theo thứ tự preorder, inorder, posorder.
b) Viết hàm duyệt cây theo thứ tự tương ứng, cho ví dụ mô phỏng.
Câu 23
Cho danh sách liên kết (DSLK) đơn với con trỏ ngoài head trỏ tới đầu DSLK, và P
là con trỏ trỏ tới một thành phần của DSLK đó. Hãy viết ra các mẫu hàm (thuật
toán) thực hiện các nhiệm vụ sau:

1. Xen thành phần mới chứa dữ liệu d vào trước P;
2. Loại thành phần P;
3. Cho ví dụ minh họa.
Câu 24
Cho hai danh sách móc nối (danh sách liên kết đơn) L1 và L2, các phần tử thuộc
kiểu số nguyên được sắp theo thứ tự tăng dần. Hãy thiết kế thuật toán và viết hàm

4


để xây dựng danh sách L từ hai danh sách L1 và L2 sao cho danh sách L cũng có
thứ tự tăng dần. Cho ví dụ mô phỏng.

Câu 25: Cho khai báo sau:
struct Stack {
int data;
node *next;
};
struct

Stack *top;

Hãy sử dụng Stack để xây dựng hàm Daoso có chức năng đảo ngược một số N.
Cho ví dụ minh họa.
Câu 26: Cho một ngăn xếp được khai báo như sau:
struct Stack {
int data;
node *next;
};
struct Stack *s;
Viết các hàm đẩy một phần tử x vào ngăn xếp s (PUSH(s,x)) và lấy ra một
phần tử POP(s) cho ngăn xếp như khai báo ở trên.
Câu 27: Với khai báo như trong câu 26. Hãy sử dụng Stack S để xây dựng hàm
Daoxau có chức năng đảo ngược một xâu ký tự St. Cho ví dụ minh họa.
Ví dụ: St = “abcde” thì xâu đảo ngược là “edcba”.
Câu 28

a) Hãy đưa ra cấu trúc dữ liệu biểu cách biểu diễn cây. Mô tả CTDL biểu
diễn cây theo cách đó bằngcác khai báo trong C, C + + hoặc Java.

b) Cho cây:

5



A

B
a

c

D

E

F

I

G

J

H

K

Hãy viết ra danh sách các đỉnh khi duyệt cây theo các thứ tự preorder,
inorder và postorder.
Câu 29

a) Trình bày ý tưởng và cho ví dụ minh họa thuật toán sắp xếp nhanh

Quicksort.

b) Cài đặt thuật toán sắp xếp nhanh Quicksort.
Câu 30 : Có khai báo sau:
Typedef
{

struct Node
int

data;

// Data là kiểu đã định nghĩa trước

Node * link;

//con trỏ chỉ đến cấu trúc NODE

struct List

// kiểu danh sách liên kết

};
typedef
{

NODE* first;
NODE* last;

} LIST;

Viết hàm chèn một nút mới có giá trị x vào đầu, cuối danh sách liên kết đơn
L. Cho ví dụ minh họa
Câu 31. Các chiến lược thiết kế thuật toán. Áp dụng cho các bài toán thực tế.
Câu 32. Các phương pháp đánh giá độ phức tạp của thuật toán. Bài tập áp
dụng.
Câu 33. Các thuật toán tìm kiếm tuần tự và tìm kiếm nhị phân (ý tưởng, thuật
toán, ví dụ mô phỏng).

6


Câu 34
a) Trình bày các phương pháp biểu diễn đồ thị (ma trận kề, danh sách, ma

trận trọng số), cho ví dụ minh họa.
b) Trình bày thuật toán tìm kiếm trên đồ thị theo chiều sâu, cho ví dụ mô

phỏng các bước thực hiện của thuật toán.
Câu 35: Có khai báo sau:
Typedef
{

struct Node
int

data;

// Data là kiểu đã định nghĩa trước

Node * link;


//con trỏ chỉ đến cấu trúc NODE

struct List

// kiểu danh sách liên kết

};
typedef
{

NODE* first;
NODE* last;

} LIST;
Viết hàm thay thế một nút mới có giá trị x cho nút đang được trỏ bởi con trỏ
P trong danh sách liên kết đơn.
Câu 36: Cho khái báo như sau:
struct Node{
int data;
struct Node *Left, *Right;
};
struct Node *T;
Anh chị hãy viết các hàm:
a) Đếm số node lá trong cây T;
b) Tạo mảng A (các phần tử là các số nguyên) có số phần tử là số node lá của
cây T, mỗi phần tử mang giá trị là giá trị của các node.
Câu 37: Có khai báo sau:
Typedef
{


struct Node
int

data;

// Data là kiểu đã định nghĩa trước

Node * link;

//con trỏ chỉ đến cấu trúc NODE

struct List

// kiểu danh sách liên kết

};
typedef
{

NODE* first;

7


NODE* last;

} LIST;
Trình bày hàm cắt một nút ở cuối danh sách, chuyển nút đó về đầu danh sách
L.

Câu 38: Có khai báo sau:
Typedef
{

struct Node
int

data;

// Data là kiểu đã định nghĩa trước

Node * link;

//con trỏ chỉ đến cấu trúc NODE

};
typedef
{

struct List

// kiểu danh sách liên kết

NODE* first;
NODE* last;

} LIST;
Viết hàm tạo ra một nút mới có giá trị x. Cho ví dụ mô phỏng.
Câu 39: Với cấu trúc danh sách được khai báo như câu 1. Hãy xây dựng một
hàm xóa một nút ở sau con trỏ P trong danh sách liên kết đơn L.

Câu 40:

a) Áp dụng thủ tục xen vào cây bắt đầu từ cây rỗng, hãy xây dựng cây tìm kiếm nhị
phân, bằng cách xem vào các đỉnh mới có khóa lần lượt là 5, 1, 6, 8, 4, 9, 7.

b) Từ cây đã xây dựng, hãy dưa ra dãy các khóa theo các thứ tự: preoder, inorder và
postorder.
Câu 41: Có khai báo sau:
Typedef
{

struct Node
int

data;

// Data là kiểu đã định nghĩa trước

Node * link;

//con trỏ chỉ đến cấu trúc NODE

struct List

// kiểu danh sách liên kết

};
typedef
{


NODE* first;
NODE* last;

} LIST;

8


Trình bày hàm tạo một danh sách liên kết L có n phần tử được nhập từ bàn
phím theo nguyên tắc FIFO (First In First Out).
Câu 42: Cho danh sách sinh viên. Mỗi sinh viên được mô tả bởi các thuộc tính họ
tên, mã sinh viên, điểm.
a) Hãy cài đặt danh sách sinh viên bởi mảng.
b) Viết hàm tìm kiếm một sinh viên theo mã.
Câu 43: Có khai báo sau:
Typedef
{

struct Node
int

data;

// Data là kiểu đã định nghĩa trước

Node * link;

//con trỏ chỉ đến cấu trúc NODE

struct List


// kiểu danh sách liên kết

};
typedef
{

NODE* first;
NODE* last;

} LIST;
Trình bày hàm tạo một danh sách liên kết L có n phần tử được nhập từ bàn
phím theo nguyên tắc LIFO (Last In First Out).
Câu 44 : Cho danh sách các số nguyên được cài đặt bằng mảng, các phần tử được
sắp xếp theo thứ tự tăng dần.
a) Hãy khai báo CTDL biểu diễn dánh sách đó.
b) Hãy viết thủ tục xen vào sanh sách một số nguyên mới n sao cho danh sách
nhận được vẫn còn được sắp theo thứ tự tăng dần.
Câu 45: Có khai báo sau:
Typedef
{

struct Node
int

data;

// Data là kiểu đã định nghĩa trước

Node * link;


//con trỏ chỉ đến cấu trúc NODE

};
typedef
{

struct List

// kiểu danh sách liên kết

NODE* first;
NODE* last;

} LIST;

9


Viết hàm xóa một nút ở đầu danh sách liên kết đơn.
Câu 46:Cho danh sách tên của mỗi lớp. Mỗi sinh viên được biểu diễn bởi 2 trường:
ten, diem. Danh sách được cài đặt bởi danh sách liên kết.
a) Hãy khai báo CTDL cài đặt danh sách đó.
b) Viết thủ tục tính điểm trung bình của lớp đó.
Câu 47: Cho danh sách các số nguyên được sắp xếp theo thứ tự giảm dần với danh
sách được cài đặt bởi mảng.
a) Hãy khai báo CTDL biểu diễn dánh sách đó.
b) Hãy viết thủ tục xem vào sanh sách một số nguyên mới n sao cho danh sách
nhận được vẫn còn được sắp theo thứ tự giảm dần.
Câu 48: Cho một dãy các số sau: 25,35, 20, 14, 27, 42, 10, 40, 23.

a) Hãy xây dựng cây nhị phân tìm kiếm từ dãy khóa trên.
b) Giải thích và vẽ cây kết quả sau khi tiến hành thực hiện liên tiếp các thao tác:
xóa nút có giá trị 10, bổ sung nút có khóa là 33 và xóa nút có khóa là 35.
Câu 49: Định nghĩa thuật toán đệ quy tuyến tính, cho ví dụ minh họa.
Câu 50: Viết thuật toán đệ quy tìm ước số lẻ lớn nhất của số nguyên dương n. Cho
ví dụ mô phỏng các bước thực hiện của thuật toán.
Câu 51:Thuật toán đệ quy sau có dừng hay không vì sao?
function S(n)
begin
If (n=0 or n =1) the S= 1
else
if (n mod 2 =0) S= S(n/2)
else S = S(3*n+1)
endif
endif
end
Câu 52 Viết thuật toán đệ quy tính tổng các chữ số của số nguyên dương n. Cho ví
dụ mô phỏng các bước thực hiện của thuật toán.

Câu 53:Viết thuật toán đệ quy tính tổng các chữ số của số nguyên dương n.
Chuyển thuật toán đệ quy sang dạng lặp tương ứng.
10


Câu 54:Viết thuật toán đệ quy tính Tính S(n) = 1 + 2 + 3 + ... + n - 1 + n. Chuyển thuật
toán đệ quy sang dạng lặp tương ứng. Cho ví dụ mô phỏng.
Câu 55: Áp dụng phương pháp quay lui để thiết kế thuật toán giải quyết bài toán
sau:
Tìm tất cả các hoán vị của {1,2,..,n}.
Câu 56: Áp dụng phương pháp quay lui để thiết kế thuật toán giải quyết bài toán

sau:
Tìm tất cả các chuối nhị phân độ dài n.

A. TL:
Câu 1
a) Ngăn xếp là gì? Trình bày cách tổ chức ngăn xếp bằng mảng, danh sách
liên kết đơn?
Ngăn xếp : vật chứa các đối tượng làm việc theo cơ chế“vào sau ra trước” (Last In
First Out)
Tổ chức ngăn xếp bằng mảng:
+ Khai báo mảng 1 chiều với kích thước tối đa N.
+ t làđịa chỉ của phần tửđỉnh của ngăn xếp → t sẽ thay đổi khi ngăn xếp hoạt động.
(ngăn xếp rỗng thì giá trị của t =0)
Tổ chức dang sách liên kết đơn:
+ Phần tử đầu DSLK sẽ là phần tử đầu hàng đợi.
+ Phần tử cuối DSLK sẽ là phần tử cuối hàng đợi
+Mỗi Node sẽ lưu trữ 2 thông tin:
- Thông tin dữ liệu: Lưu trữ các thông tìn về chính Node đó.
- Thông tin liên kết: Lưu trữ địa chỉ của phần tử kế tiếp trong danh sách, hoặc lưu
trữ giá trị NULL nếu phần tử đó nằm cuối danh sách.
b) Viết phép toán đẩy một phần tử vào ngăn xếp (Push), lấy ra (Pop) cho
một ngăn xếp được tổ chức dạng mảng, danh sách liên kết đơn, cho ví
dụ minh họa?
Push với Mảng
void push(int stack[], int value)
{
if(stack[0] < MAXSIZE-1)

11



{
stack[0] = stack[0] + 1;
stack[stack[0]] = value;
}
Else
{
printf("Khong the them vao STACK\n");
getch();
}
}
Pop với Mảng
int pop(int stack[], int *value)
{
if(stack[0] > 0 )
{
*value = stack[stack[0]];
stack[0] = stack[0] - 1; return 1;
}
else return 0;
}
Push với DSLK đơn
void Push ( Stack &s, DataType x )
{
Node *p = new Node;
if ( p==NULL ) { cout<<“Khong du bo nho”; return; }
p->data = x;
p->next = NULL;
if (s.top==NULL) // if (isEmpty(s))
s.top = p;

else{

12


p->next = s.top;
s.top = p;
}
}
Pop với DSLK đơn
DataType Pop ( Stack &s )
{
if ( s.top==NULL ){
cout<<"Stack rỗng"; return 0;
}
DataType x;
Node *p = s.top;
s.top = s.top->next;
x = p->data;
delete p;
return x;
}
VÍ DỤ
- thêm vào thì tăng t lên 1 đơn vị, lấy ra thì giảm t 1 đơn vị (t là chỉ số
mảng)
- thêm vào node p thì dùng p->next trỏ tới đầu đang trỏ và cập nhật lại
con trỏ đầu= p, lấy ra thì đầu sẽ trỏ tới đầu->next (đau=đau->netx)
Câu 2
Cho các xâu ký tự có dạng w $ w’, trong đó w’ là đảo ngược của xâu w,
chẳng hạn nếu w = a c d b thì w’ = b d c a. Hãy thiết kế thuật toán để đoán

nhậncác xâu ký tự trên và cho ví dụ mô phỏng?
- sử dụng stack đưa xâu w vào và trả xâu ra một xâu, xâu đó chính là w’.
THUẬT TOÁN:
int main(int argc, char *argv[])
{
char s[100];

13


char *p;
char **a;
fflush(stdin);
gets(s);
int j,i=0;
p=strtok(s,' ');
while(p!=NULL)
{
a[i]=p;
i++;
p=strtok(NULL,' ');
}
VÍ DỤ:
#include <string.h>
#include <stdio.h>
int main()
{
char hoten[80];
printf("nhap ho ten: ");
gets(hoten);

int len = strlen(hoten);
for(int i=len-1;i>=0;i--){
printf("%c",hoten[i]);
}
return(0);
}
Câu 3
Trình bày ý tưởng cho thuật toán sắp xếp chọn trực tiếp (selection sort).
Theo thuật toán này, anh/chị hãy viết hàm sắp xếp n số nguyên theo chiều tăng
dần, cho ví dụ minh họa các bước thực hiện.
+ Hàm sắp xếp n số nguyên theo chiều tăng dần :
void SelectionSorting(int a[], int n)

14


{

int tmp;
for (int i=0;iint min_index = i;
for (int j=i+1;jif (a[min_index]>a[j])
in_index = j;
}
tmp=a[min_index];
a[min_index] = i;
a[i]=tmp;
}
}

}

Ý tưởng:
- Giải thuật “selection sort” sắp xếp một danh sách các giá trị bằng cách lặp lại việc
đặt một giá trị cụ thể vào đúng vị trí thích hợp cho nó trong dãy sắp xếp. (Nói cách
khác, với mỗi vị trí trong danh sách, giải thuật đi tìm giá trị phù hợp cho vị trí đó).
Hàm:
void SelectionSorting(int a[], int n)
{

int tmp;
for (int i=0;iint min_index = i;
for (int j=i+1;jif (a[min_index]>a[j])
in_index = j;
}
tmp=a[min_index];
a[min_index] = i;
a[i]=tmp;
}
}

15


}
Ví dụ các bước:
sắp xếp một dãy các số nguyên theo trật tự tăng dần, ta làm như sau:
- Ở bước thứ i, chọn phần tử nhỏ nhất trong dãy a[i], a[i+1], …, a[n]

- Đổi chỗ phần tử này với phần tử a[i]
Câu 4
c) Danh sách liên kết đơn là gì? Trình bày cách tổ chức.
Danh sách liên kết đơn: là một cấu trúc dữ liệu bao gồm một tập các nút, mà mỗi
nút bao gồm:
-

Dữ liệu cần lưu trữ

-

Liên kết đến nút tiếp theo, hoặc lưu trữ giá trị NULL nếu phần tử đó nằm
cuối danh sách.

Tổ chức dang sách liên kết đơn :
+ Phần tử đầu DSLK sẽ là phần tử đầu hàng đợi.
+ Phần tử cuối DSLK sẽ là phần tử cuối hàng đợi
d) Viết các phép toán bổ sung một phần tử và lấy ra một phần tử trong một
danh sách liên kết đơn, cho ví dụ minh họa.
- thêm phần tử: vd thêm phần tử p ta lam như sau:

p->next=đầu; đầu= p;

- lấy ra: lấy ra lưu vào biến x: gán x= đầu->data và thay đổi vị trí con trỏ
đầu: đầu=đầu->next;
A. Thêm một phần tử vào DSLKĐ: Có 3 vị trí thêm
1. Gắn vào đầu DSLKĐ:
-

Nếu DS rỗng thì : pHead = pTail = new_node;


-

Ngược lại:

new_node->pNext = pHead;
pHead = new_node;

VÍ DỤ
Thêm một số nguyên vào đầu ds:
// Nhập dữ liệu cho X
int x;
cout<<“Nhap X=”;

16


cin>>x;
// Tạo nút mới
Node* new_node = getNode(x);
// Gắn nút vào đầu ds
if (new_node != NULL)
addHead(l, new_node);
2. Gắn vào cuối DSLKĐ:
-

Nếu DS rỗng thì: pHead = pTail = new_node;

-


Ngược lại:

pTail->pNext = new_node ;
pTail = new_node;

VÍ DỤ
Thêm một số nguyên vào cuối ds:
// Nhập dữ liệu cho X
int x;
cout<<“Nhập X=”;
cin>>x;
// Tạo nút mới
Node* p = getNode(x);
// Gắn nút vào cuối DS
if (p != NULL)
addTail(l, p);
3. Chèn vào sau nút q trong DSLKĐ:
-

Nếu (q != NULL) thì: new_node -> pNext = q -> pNext;
q -> pNext = new_node ;
Nếu ( q == l.pTail) thì: l.pTail = new_node;

-

Ngược lại
Thêm new_node vào đầu danh sách

• ( Chú ý trường hợp danh sách ban đầu rỗng: pHead=pTail=new_node;)
B. Lấy ra một phần tử trong DSLKĐ:

Câu 5

17


Cho dãy A gồm n phần tử nguyên a 1, a2, ..., an (các phần tử khác nhau). Hãy xây
dựng thuật toán tìm phần tử lớn thứ k trong dãy A theo các bước sau đây:
1. Biểu diễn cấu trúc dữ liệu;
2. Mô tả thuật toán;
3. Ví dụ mô phỏng.
1. Biểu diễn: 1 mảng gồm n phần tử
2. Mô tả:
- Khai báo 1 mảng int, một biến MAX
- Gắn MAX=a[i]
- Cho vòng lặp for i=2;i<=n;i++
- Nếu a[i]>MAX thì gắn MAX=a[i]
- In MAX ra
3. Ví dụ:
int MAX(int A[], int n)
{
Int SMAX;
SMAM=A[0];
for (int i=1;i{
if(SMAXSMAX=A[i];
}
return SMAX;
}
Câu 6

c) Trình bày cấu trúc dữ liệu danh sách được tổ chức dưới dạng mảng.
-

Là danh sách có các phần tử có cùng kiểu dữ liệu được xếp kế tiếp nhau
trong bộ nhớ

18


-

Đặc điểm: d: chiều dài mỗi phần tử trong danh sách
l0: địa chỉ của phần tử đầu tiên
địa chỉ của phần tử thứ i là: li=l0+(i-1)d

-

Cách khai báo mảng 1 chiều: <Kiểu dữ liệu> tên_mảng []; (VD: int N[], float
a[10])

-

Cách khai báo mảng 2 chiều: <Kiểu dữ liệu> tên_mảng [][]; (VD: int a[10][15])

d) Viết phép toán bổ sung một phần tử trong một danh sách được tổ chức
dạng mảng, cho ví dụ minh họa.
-

HÀM:


-

VÍ DỤ

void Insert_Middle(listnode *p, int position, int x){
int count=1, found=0;
listnode q, r;
r = *p;
while ((r != NULL)&&(found==0)){
if (count == position){
q = (listnode)malloc(sizeof(struct node));
q-> item = x;
q-> next = r-> next;
r-> next = q;
found = 1;
}
count ++;
r = r-> next;
}
if (found==0)
printf(“Khong tim thay vi tri can chen !”);
}

19


Câu 7
Cho file văn bản bất kỳ. Hãy xây dựng thuật toán tìm từ trong file xuất hiện
nhiều nhất theo các bước sau:
1. Biểu diễn cấu trúc dữ liệu;

2. Mô tả thuật toán;
3. Ví dụ mô phỏng.
#include <stdio.h>
#include <string.h>
main()
{
char s[100];
gets(s);
int dem;
int i,j,k;
int max=0;
for(i=0;i{
dem=1;
for(j=i+1;j{
if(s[j]==s[i]&&dem>max)
{
max=dem;
dem++;
k=j;
}
}
}
printf ("tu xuat hien nhieu nhat la: %c",s[k]);
}

20



Câu 8
c) Trình bày cấu trúc dữ liệu danh sách liên kết đôi.
- Danh sách liên kết đôi: Là danh sách mà mỗi phần tử trong danh sách có 2 liên kết
với một phần tử đứng trước (Prev) và một phần tử đứng sau nó (Next).
d) Viết các phép toán lấy ra một phần tử trong một danh sách liên kết đôi, cho
ví dụ minh họa.
- đầu bằng đầu trỏ tien. vd: đau=đau->tien
Có 5 vị trí lấy ra:
1. Đầu DSLK2
int removeHead (DList &l)
{
if ( l.pHead == NULL)

return 0;

DNode *p = l.pHead;
l.pHead = l.pHead->pNext;
l.pHead->pPrev = NULL;
delete p;
if (l.pHead == NULL)
else

l.pTail = NULL;

l.pHead->pPrev = NULL;

return 1;
}
2. Cuối DSLK2
int removeTail (DList &l)

{
if (l.pTail == NULL) return 0;
DNode *p = l.pTail;
l.pTail = l.pTail->pPrev;
l.pTail->pNext = NULL;
delete p;
if (l.pHead == NULL) l.pTail = NULL;
else

l.pHead->pPrev = NULL;

21


return 1;
}
3. Sau q
int removeAfter (DList &l, DNode *q)
{
if (q == NULL) return 0;
DNode *p = q ->pNext ;
if (p != NULL)
{
q->pNext = p->pNext;
if (p == l.pTail) l.pTail = q;
else

p->pNext->pPrev = q;

delete p;

return 1;
}
else return 0;
}
4. Trước q:
int removeBefore (DList &l, DNode *q)
{
if (q == NULL) return 0;
DNode *p = q ->pPrev;
if (p != NULL)
{
q->pPrev = p->pPrev;
if (p == l.pHead) l.pHead = q;
else

p->pPrev->pNext = q;

delete p;
return 1;
}

22


else return 0;
}
5. Có khóa k:
int removeNode (DList &l, int k)
{
DNode *p = l.pHead;

while (p != NULL)
{
if (p->data== k) break;
p = p->pNext;
}
if (p == NULL) return 0; // Không tìm thấy k
DNode *q = p->pPrev;
if (q != NULL)

// Xóa nút p sau q

return removeAfter (l, q);
else

// Xóa p là nút đầu ds

return removeHead (l);
}
Câu 9
Cho hai danh sách móc nối L1 và L2, các phần tử thuộc kiểu số nguyên được
sắp theo thứ tự tăng dần. Hãy thiết kế thuật toán xây dựng danh sách L từ hai
danh sách trên sao cho danh sách L cũng có thứ tự tăng dần.
- cho hai dãy :
x=1,5,7,8
y=2,3,4,10
cho i=0, j=0 với i chạy theo chỉ số mảng x và j chạy theo chỉ số mảng y
tiến hàng kiểm tra nếu x[i]thêm y[j] vào mảng z tăng j; lặp lại cho đến khi j hoặc i bằng n-1 với n là kích thước
mảng x, y.


23


Câu 10
a) Trình bày cấu trúc dữ liệu danh sách liên kết vòng một chiều?
- Danh sách liên kết vòng: Là một danh sách liên kết đơn (hoặc đôi) mà phần
tử cuối danh sách, thay vì mang giá trị NULL, trỏ tới phần tử đầu danh sách.
b) Viết phép toán bổ sung một phần tử trong một danh sách liên kết vòng
một chiều, cho ví dụ minh họa?
vd: đau->next=p; p->next=đau
Có 3 vị trí bổ sung
1. Đầu DSLKV:
void addHead (List &l, Node *new_node)
{
if (l.pHead == NULL)
{
l.pHead = l.pTail = new_node;
l.pTail->pNext = l.pHead;
}
else
{

24


new_node->pNext = l.pHead;
l.pTail->pNext = new_node;
l.pHead = new_node;
}
}

2. Cuối DSLKV:
void

addTail (List &l, Node *new_node)

{
if (l.pHead == NULL)
{
l.pHead = l.pTail = new_node;
l.pTail->pNext = l.pHead;
}
else
{
new_node->pNext = l.pHead;
l.pTail->pNext = new_node;
l.pTail = new_node;
}
}
3. Sau nút q:
void addAfter (List &l, Node *q, Node *new_node)
{
if (l.pHead == NULL)
{
l.pHead = l.pTail = new_node;
l.pTail->pNext = l.pHead;
}
else
{

25



×