1. Trang chủ
  2. » Công Nghệ Thông Tin

Bài giảng Ngôn ngữ lập trình C: Chương 5 - TS. Nguyễn Thị Hiền

31 51 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 31
Dung lượng 533,17 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Bài giảng Ngôn ngữ lập trình C - Chương 5: Dữ liệu kiểu cấu trúc cung cấp cho người học các kiến thức: Khái niệm, khai báo cấu trúc, các thao tác trên biến cấu trúc, mảng cấu trúc, con trỏ cấu trúc và địa chỉ cấu trúc,... Mời các bạn cùng tham khảo.

Trang 1

Chương 5 Dữ liệu kiểu cấu trúc

Trang 2

Chương 5 Dữ liệu kiểu cấu trúc

 Khái niệm

 Khai báo cấu trúc

 Các thao tác trên biến cấu trúc

 Mảng cấu trúc

 Con trỏ cấu trúc và địa chỉ cấu trúc

 Truyền biến cấu trúc cho hàm

 Cấu trúc tự trỏ và ứng dụng

Trang 3

Khái niệm

 Cấu trúc là tập hợp của một hoặc nhiều biến ,

chúng có thể có kiểu dữ liệu khác nhau, được

nhóm lại dưới một tên duy nhất để tiện xử lý

 Cấu trúc còn gọi là bản ghi trong một số ngôn ngữ lập trình khác, chẳng hạn như PASCAL.

Trang 4

Khái niệm

Một số ví dụ về cấu trúc:

Phiếu ghi lương, gồm có: tên, địa chỉ, lương, phụ

cấp, … một số trong các thuộc tính này lại có thể làmột cấu trúc bởi trong nó có thể chứa nhiều thành

phần: Tên ( Họ, đệm, tên ), Địa chỉ ( Phố, số nhà ),

Danh sách sinh viên, gồm có: mã sinh viên, họ tên, ngày sinh, điểm toán, điểm lý, điểm hóa…; trong đó, ngày sinh có thể chứa nhiều thành phần ngày, tháng, năm

 Những dạng như vậy  sử dụng cấu trúc.

Trang 5

Định nghĩa kiểu cấu trúc

 Định nghĩa cấu trúc bằng struct:

thành phần của cấu trúc có thể là: biến, mảng, cấu trúc khác

đã được định nghĩa trước đó

Trang 6

Định nghĩa kiểu cấu trúc

 Định nghĩa cấu trúc bằng typedef

typedef <type definition> <tên_cấu_trúc>;

Trang 7

Khai báo biến cấu trúc

 Giống như khai báo biến thông thường

struct ngay ngaydi, ngayden;

Chú ý: Các biến kiểu cấu trúc được khai báo

theo mẫu trên sẽ được cấp phát bộ nhớ một

cách đầy đủ cho tất cả các thành phần của nó.

Trang 8

Khai báo biến cấu trúc

Có thể khai báo biến cấu trúc đồng thời với định nghĩa cấu trúc

Trang 9

Các thao tác trên biến cấu trúc

Truy cập đến các thành phần của cấu trúc:

 Sử dụng dấu . để truy cập đến thành phần của cấu trúc

Trang 10

Các thao tác trên biến cấu trúc

Truy cập đến các thành phần của cấu trúc:

Chú ý:

 Có thể sử dụng phép toán lấy địa chỉ đối với các thành phần của cấu trúc để nhập số liệu trực tiếp vào các thành phần của cấu trúc Ví dụ như ta viết:

Trang 11

Các thao tác trên biến cấu trúc

Trang 12

 Không dùng toán tử địa chỉ với các thành phần của

mảng cấu trúc: không cho phép viết &nhom1[i].luong

Trang 13

p1=&nc1; /* Gán địa chỉ nc1 cho p1 */

p2=&ds[4]; /* Gán địa chỉ ds[4] cho p2 */

p=ds; /* Gán địa chỉ ds[0] cho p */

Trang 17

Cấu trúc tự trỏ

 Một số danh sách liên kết sử dụng cấu trúc tự trỏ:

Stack (ngăn xếp): hoạt động theo phương thức Last

In – First Out (LIFO)

Queue (hàng đợi): hoạt động theo phương thức First

In – First Out (FIFO)

Binary tree (cây nhị phân):

 Là một cây, trong đó mỗi node cha có 2 node con

 Node con trái có giá trị nhỏ hơn node cha

 Node con phải có giá trị lớn hơn node cha

Trang 18

 Liên kết đến node tiếp theo

(địa chỉ của node tiếp theo)

Trang 19

Ứng dụng: DSLK đơn

 Ưu điểm:

 DSLK là cấu trúc động, các node được cấp phát/giải

phóng khi chương trình đang chạy -> Kích thước danh

sách không cần phải khai báo trước

 DSLK thích hợp khi thực hiện các phép toán trên những

danh sách (tập hợp) thường bị biến động như chèn,

xóa phần tử

 Hạn chế:

Mỗi node của DSLK phải chứa thêm trường next nên

tốn thêm bộ nhớ

 Tìm kiếm trên DSLK chậm do ta không thể truy xuất được

ngẫu nhiên, chỉ truy xuất được tuần tự từ đầu danh sách

Trang 20

struct node {

Trang 21

Ứng dụng: DSLK đơn

 Khai báo 1 DSLK

 Khởi tạo DS: void Init(List*);

 Tạo một node có nội dung x: struct node* NewNode(int);

 Tìm một node có nội dung x: struct node* FindNode(List ,int);

 Thêm một node vào đầu DS: int InsertFirst(List*, int);

 Thêm một node vào cuối DS: int InsertAfter(List*, int);

 Thêm một node vào giữa DS: int Insert(List*, int);

 Xóa một node đầu DS: int DeleteFirst(List*);

 Xóa một node cuối DS: int DeleteAfter(List*);

 Xóa một node giữa DS: int Delete(List*);

 Duyệt DS: void Travel(List);

struct node {

Trang 23

Ứng dụng: DSLK đơn

 Tạo 1 node mới có nội dung x:

struct node* NewNode(int x)

{

struct node *p;

p = (struct node *)malloc(sizeof(struct node);

if (p!=NULL) {p -> data = x;

p -> next = NULL;}

return (p) }

newNode

NULL

Trang 24

Ứng dụng: DSLK đơn

Thêm một node vào DSLK:

Thêm vào đầu danh sách:

 Tạo node mới có nội dung x; (newNode = NewNode(x))

 Phần next của node trỏ tới đầu DSLK.

 Trỏ First tới newNode

NULL

L

newNode x

Trang 25

Ứng dụng: DSLK đơn

Thêm một node vào DSLK (.t):

Thêm vào cuối danh sách

 Tìm con trỏ trỏ tới node cuối cùng (temp)

 Tạo node mới newNode(x)

 Phần next của node temp tới newNode

Trang 26

Ứng dụng: DSLK đơn

Thêm một node vào DSLK (.t):

Thêm vào giữa danh sách:

 Tìm con trỏ (temp) trỏ tới node trước vị trí cần thêm

 Tạo node mới newNode(x)

 Trỏ phần next của newNode tới node sau temp

 Trỏ phần next của temp tới newNode

NULL

L

…v

newNode

…temp x

Trang 27

Ứng dụng: DSLK đơn

Xóa một node trong DSLK:

Xóa node ở đầu danh sách:

 Tạo một con trỏ temp trỏ vào node đầu danh sách

 Trỏ First tới node thứ 2 trong danh sách

 Thu hồi vùng nhớ node đầu tiên (được trỏ bởi temp)

NULL

…temp

L

Trang 28

Ứng dụng: DSLK đơn

Xóa một node trong DSLK (t.):

Xóa node ở cuối danh sách:

 Tìm con trỏ p trỏ tới node áp cuối, con trỏ temp trỏ tới node cuối cùng

 Phần next của p trở tới NULL

 Thu hồi vùng nhớ của node cuối (được trỏ bởi temp)

Trang 29

Ứng dụng: DSLK đơn

Xóa một node trong DSLK (t.):

Xóa node ở giữa danh sách:

 Trỏ temp tới node cần xóa, p tới node trước node cần xóa

 Phần next của p tới node sau node temp

 Giải phóng vùng nhớ của node cần xóa (được trỏ bởi temp)

L

Trang 31

if (p->Info == x) return p;

p = p->Next;

} return (p) }

Ngày đăng: 15/05/2020, 22:26

TỪ KHÓA LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm