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

giáo trình cấu trúc dữ liệu và giải thuật ngành công nghệ thông tin trung cấp

49 0 0
Tài liệu đã được kiểm tra trùng lặp

Đ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

Tiêu đề Cấu Trúc Dữ Liệu Và Giải Thuật
Tác giả Trần Thị MÂ
Trường học Trường Cao Đẳng Xây Dựng Số 1
Chuyên ngành Công Nghệ Thông Tin
Thể loại Giáo Trình
Năm xuất bản 2023
Thành phố Hà Nội
Định dạng
Số trang 49
Dung lượng 817,68 KB

Nội dung

Về kiến thức: - Trình bày đ°ợc các khái niám về giÁi thuÁt, các đặc tr°ng của giÁi thuÁt; - Trình bày đ°ợc mát số ngôn ngā dißn đ¿t giÁi thuÁt; - Trình bày đ°ợc mát số ph°¢ng pháp thiết

Trang 1

Bà XÂY DĂNG

TR¯àNG CAO ĐẲNG XÂY DĀNG Sà 1

GIÁO TRÌNH

TRÌNH Đà: TRUNG CÂP

Ban hành kèm theo Quyết định số: 597/QĐ- CĐXD1 ngày 29 tháng 12 năm

2023 cÿa Hiệu trưởng trường CĐXD số 1

Hà Nội, năm 2023

Trang 2

TUYÊN Bà BÀN QUYÀN

Tài liáu này thuác lo¿i sách giáo trình nên các nguồn thông tin có thể đ°ợc phép dùng nguyên bÁn hoặc trích dùng cho các mục đích về đào t¿o và tham khÁo Mọi mục đích khác mang tính lách l¿c hoặc sÿ dụng với mục đích kinh doanh thiếu lành m¿nh sẽ bị nghiêm cÃm

Trang 3

2

LàI NÓI ĐÄU

Giáo trình CÂU TRÚC Dþ LIàU VÀ GIÀI THU¾T được biên soạn nhằm phục

vụ cho giảng dạy và học tập cho trình độ Trung cấp ngành Công nghá thông tin (Āng

dụng phần mềm) ở trường Cao đẳng Xây dựng số 1 Cấu trúc dữ liệu và giải thuật là môn học cơ sở ngành nhằm cung cấp các kiến thāc cơ bản về các kiểu cấu trúc dữ liệu thông dụng và một số giải thuật trên các kiểu cấu trúc dữ liệu đó trong ngành Công nghệ thông tin

Giáo trình này được viết theo đề cương môn học Cấu trúc dữ liệu và giải thuật Nội dung gồm 02 chương như sau:

Chương 1: Giải thuật

Chương 2: Cấu trúc dữ liệu

Mặc dù có nhiều cố gắng, nhưng trong quá trình biên soạn, biên tập và in ấn khó tránh khỏi những thiếu sót Chúng tôi rất mong nhận được sự đóng góp ý kiến từ phía các thầy cô và bạn đọc để hoàn thiện giáo trình hơn!

Xin trân trọng cảm ơn!

Hà Nội, ngày……tháng……năm………

Tham gia biên so¿n Trần Thị M¢ - Chủ biên

Trang 5

4

2.3.1 Biểu dißn cây nhị phân 29

2.3.2 Duyát cây nhị phân 30

2.3.4 Cây nhị phân tìm kiếm 32

2.4 Đồ thị 37

2.4.1 Duyát đồ thị theo chiều ráng 41

2.4.2 Duyát theo chiều sâu 43

Trang 6

5

Tên môn hác: CÂU TRÚC Dþ LIàU VÀ GIÀI THU¾T

luÁn, bài tÁp: 27 giờ; Kiểm tra 03 giờ)

I Vß trí, tính chÃt cÿa môn hác:

- Vị trí: + Môn học đ°ợc bố trí ở kỳ học thứ 02 + Môn học tiên quyết: Không

- Tính chÃt: là môn học c¢ sở ngành, cung cÃp các kiến thức c¢ bÁn về các khái niám c¢ bÁn, các kiểu cÃu trúc dā liáu thông dụng và mát số giÁi thuÁt trên các kiểu cÃu trúc dā liáu đó

1 Về kiến thức: - Trình bày đ°ợc các khái niám về giÁi thuÁt, các đặc tr°ng của giÁi thuÁt; - Trình bày đ°ợc mát số ngôn ngā dißn đ¿t giÁi thuÁt;

- Trình bày đ°ợc mát số ph°¢ng pháp thiết kế giÁi thuÁt; - Trình bày đ°ợc mát số kiểu dā liáu danh sách tuyến tính và thao tác trên kiểu dā liáu đó;

- Trình bày đ°ợc mát số kiểu dā liáu danh sách liên kết và thao tác trên kiểu dā liáu đó;

- Trình bày đ°ợc kiến thức về cây nhị phân, phép duyát và ứng dụng cây nhị phân tìm kiếm;

- Trình bày đ°ợc kiến thức về đồ thị: biểu dißn đồ thị, phép duyát và ứng dụng của đồ thị

2 Về kỹ năng: - VÁn dụng các kiểu dā liáu thông dụng nh° danh sách tuyến tính, cây nhị phân, đồ thị để cài đặt các ch°¢ng trình ứng dụng nhỏ

3 Về năng lăc tă chủ và trách nhiám: Có năng lăc tă định h°ớng, thích nghi với các môi tr°ờng làm viác khác nhau; tă học tÁp, tích lũy kiến thức, kinh nghiám để nâng cao trình đá chuyên môn nghiáp vụ

Trang 7

CH¯¡NG 1: GIÀI THU¾T

1 Cung cÃp cho ng°ời học các kiến thức c¢ bÁn về c¢ bÁn về giÁi thuÁt: các đặc tr°ng giÁi thuÁt, ngôn ngā dißn đ¿t giÁi thuÁt, ph°¢ng pháp thiết kế giÁi thuÁt, đánh giá đá phức t¿p của giÁi thuÁt trong mát số bài toán cụ thể

Trang 8

Để đánh giá mát cÃu trúc dā liáu chúng ta th°ờng dăa vào mát số tiêu chí sau: - CÃu trúc dā liáu phÁi tiết kiám tài nguyên (bá nhớ trong)

- CÃu trúc dā liáu phÁi phÁn Ánh đúng thăc tế của bài toán - CÃu trúc dā liáu phÁi dß dàng trong viác thao tác dā liáu

1.2 Các đặc tr°ng cÿa giÁi thu¿t

- Tính xác định: Mßi b°ớc của thuÁt giÁi cần phÁi đ°ợc mô tÁ mát cách chính

xác, chỉ có mát cách hiểu duy nhÃt Bởi vì, nếu mát b°ớc có thể hiểu theo nhiều cách khác nhau, thì cùng mát dā liáu vào, nhāng ng°ời thăc hián thuÁt giÁi khác nhau có thể cho ra kết quÁ khác nhau Nếu ta mô tÁ thuÁt giÁi bằng ngôn ngā tă nhiên, không có gì đÁm bÁo ng°ời đọc hiểu đúng ý của ng°ời viết thuÁt giÁi, bởi ngôn ngā tă nhiên th°ờng là đa nghĩa Để đÁm bÁo đòi hỏi này, thuÁt giÁi cần đ°ợc mô tÁ trong mát ngôn ngā lÁp trình, chẳng h¿n mát ngôn ngā lÁp trình (Pascal, C ) trong các ngôn ngā này, các mánh

đề đ°ợc t¿o thành theo các qui tắc cú pháp nghiêm nghặt và chỉ có mát ý nghĩa duy nhÃt

- Tính khả thi: TÃt cÁ các phép giÁi có mặt trong các b°ớc của thuÁt giÁi phÁi đủ

đ¢n giÁn Điều đó có nghĩa là các phép giÁi phÁi sao cho, ít nhÃt về nguyên tắc có thể

Trang 9

8

thăc hián đ°ợc bởi con ng°ời trong mát khoÁng thời gian hāu h¿n Chẳng h¿n trong thuÁt giÁi Euclid, ta chỉ cần thăc hián các phép chia các số nguyên, các phép gán và các phép so sánh

- Tính dừng: Với mọi bá dā liáu vào thoÁ mãn điều kián qui định, thuÁt giÁi phÁi

dừng l¿i sau mát số hāu h¿n b°ớc thăc hián Chẳng h¿n đối với thuÁt giÁi Euclid là thuÁt giÁi thoÁ mãn điều kián này Bởi vì số d° r luôn nhỏ h¢n n, nếu r0 thì giá trị của n ở b°ớc sau là giá trị của r ở b°ớc tr°ớc, ta có n>r=n1>r1=n2>r2 Dãy số nguyên d°¢ng giÁm dần cần phÁi kết thúc ở 0, do đó sau mát số b°ớc giá trị của r=0 thuÁt giÁi dừng

Các giÁi thuÁt phÁi kết thúc sau mát số hāu h¿n các b°ớc

1.3.1 Ngôn ngÿ thông thường

Trong cách biểu dißn thuÁt giÁi theo ngôn ngā tă nhiên, ng°ời ta sÿ dụng ngôn ngā th°ờng ngày để liát kê các b°ớc của thuÁt giÁi (Các ví dụ về thuÁt giÁi trong mục 1 của ch°¢ng sÿ dụng ngôn ngā tă nhiên) Ph°¢ng pháp biểu dißn này không yêu cầu ng°ời viết thuÁt giÁi cũng nh° ng°ời đọc thuÁt giÁi phÁi nắm các quy tắc Tuy vÁy, cách biểu dißn này th°ờng dài dòng, không thể hián rõ cÃu trúc của thuÁt giÁi, đôi lúc gây hiểu lầm hoặc khó hiểu cho ng°ời đọc Gần nh° không có mát quy tắc cố định nào trong viác thể hián thuÁt giÁi bằng ngôn ngā tă nhiên

1.3.2 Ngôn ngÿ lưu đồ

L°u đồ hay s¢ đồ khối là mát công cụ trăc quan để dißn đ¿t các thuÁt giÁi Biểu dißn thuÁt giÁi bằng l°u đồ sẽ giúp ng°ời đọc theo dõi đ°ợc să phân cÃp các tr°ờng hợp và quá trình xÿ lý của thuÁt giÁi Ph°¢ng pháp l°u đồ th°ờng đ°ợc dùng trong nhāng thuÁt giÁi có tính rắc rối, khó theo dõi đ°ợc quá trình xÿ lý

Trang 10

Ví dụ: Tìm nghiám thăc của ph°¢ng trình bÁc hai ax2+bx+c=0 ThuÁt toán gồm các b°ớc sau:

+ NhÁp dā liáu a, b, c + Tính biát số  = b2-4ac + So sánh  với 0 B°ớc tiếp theo sẽ phụ thuác vào giá trị của  + Nếu <0, đáp số của bài toán là <Vô nghiám=

+ Nếu =0, tính và ghi đáp số trị của nghiám kép + Nếu >0, tính và ghi đáp số trị của hai nghiám phân biát:

L°u đồ biểu dißn thuÁt toán này đ°ợc thể hián nh° sau:

Trang 11

10

1.3.3 Ngôn ngÿ l¿p trình

Tuy s¢ đồ khối thể hián rõ quá trình xÿ lý và să phân cÃp các tr°ờng hợp của thuÁt toán nh°ng l¿i cồng kềnh Để mô tÁ mát thuÁt toán nhỏ ta phÁi dùng mát không gian rÃt lớn Đôi khi, ta có thể thể hián thuÁt toán bằng ngôn ngā lÁp trình nào đó Mọi ngôn ngā lÁp trình đều có nhāng thao tác c¢ bÁn là xÿ lý, rẽ nhánh và lặp Nh° vÁy, có thể tÁn dụng đ°ợc các khái niám trong ngôn ngā lÁp trình, vừa giúp ng°ời cài đặt dß dàng hiểu chính xác thuÁt toán Mát khi đã vay m°ợn cú pháp và khái niám của ngôn ngā lÁp trình thì chắc chắn mã giÁ sẽ bị phụ thuác vào ngôn ngā lÁp trình đó

Mát đo¿n mã giÁ của thuÁt toán giÁi ph°¢ng trình bÁc hai:

if Delta > 0 then begin

end else if delta = 0 then xuất kết quả : phương trình có nghiệm kép là -b/(2*a) else {trường hợp delta < 0 }

xuất kết quả : phương trình vô nghiệm x1=(-b+sqrt(delta))/(2*a)

x2=(-b-sqrt(delta))/(2*a)

Trang 12

11

xuất kết quả : phương trình có hai nghiệm là x1 và x2

1.4 Ph°¢ng pháp thi¿t k¿ giÁi thu¿t

1.4.1 Môn học hóa

Các bài toán giÁi trên máy tính càng ngày càng đa d¿ng và phong phú d¿n tới quy mô ch°¢ng trình ngày càng lớn Quy mô càng lớn d¿n tới viác lÁp và kiểm soát ch°¢ng tình càng gặp nhiều khó khăn h¢n

Ta cần chia bài toán lớn thành nhiều bài toán nhỏ, do đó ng°ời ta sÿ dụng mát ph°¢ng pháp thiết kế:

Từ trên xuống (top)-down design: Phân tích tổng quát toàn bá vÃn đề và mục

tiêu đặt ra, đề cÁp tới nhāng công viác chủ yếu, sau đó dần giÁi quyết các phần viác cụ thể mát cách chi tiết h¢n

Ví dụ: Cần lÁp mát há ch°¢ng trình quÁn lý bÁo trì hồ s¢ về l°¢ng của cán bá Ch°¢ng trình đ°ợc phân tích theo s¢ đồ sau:

¯u điểm cho ph°¢ng pháp thiết kế từ trên xuống: - Giúp cho viác giÁi quyết bài toán đ°ợc định h°ớng rõ ràng, tránh sa đà vào các chi tiết phụ

- Cho phép tách bài toán thành các thành phần đác lÁp, mßi phần có thể đ°ợc giao cho các nhóm lÁp trình khác nhau Các nhóm làm viác đác lÁp với nhau

- ThÃy cÃu trúc rõ ràng của ch°¢ng trình, từ đó có thể dß dàng hiểu, nắm vāng và bao quát ch°¢ng trình, viác tìm và sÿa lßi cũng trở nên dß dàng h¢n

Trang 13

12

1 Readln(n) 2 Lần lượt nhập các số a1, a2, , an 3 For i:=1 to n do

Begin - Tìm số nhỏ nhất a_min trong dãy ai, ai+1, , an

- đổi chỗ a_min với ai End

Tới đây ta thÃy trong phần 3 chỉ có 2 nhiám vụ cần làm rõ: Tìm số nhỏ nhÃt a_min

đổi chß a_min với ai Số nhỏ nhÃt đ°ợc xác định bằng cách chỉ ra vị trí của nó, tức là xác định chỉ số của nó Viác này đ°ợc thăc hián bằng cáh luôn ghi nhớ chỉ số của Số nhỏ nhÃt vào 1 biến, cụ thể là:

min:=i; For k:=i+1 to n do If ai < amin then min:=k;

Viác đổi chß a_min với ai đ°ợc thăc hián giống nhau nh° khi ta muốn chuyển 2 thứ n°ớc trong 2 chai từ chai nọ sang chai kia, ta dùng 1 chai thứ 3 làm trung gian

tg:=ai; a:=amin; amin:=tg;

Sau khi tinh chỉnh lần 2, ch°¢ng trình có d¿ng:

1 Readln(n) 2 Lần lượt nhập các số a1, a2, , an 3 For i:=1 to n do

Begin 3.1 min:=i; For k:=i+1 to n do If a[k] < a[min] then min:=k; 3.2 tg:=a[i];

a[i]:=a[min]; a[min]:=tg; End

Trang 14

13

Há tháng ki¿n thāc ch°¢ng 1

1 Yêu cÅu vÁ lý thuy¿t

- Kiến thức c¢ bÁn về giÁi thuÁt: các đặc tr°ng giÁi thuÁt, ngôn ngā dißn đ¿t giÁi thuÁt, ph°¢ng pháp thiết kế giÁi thuÁt trong mát số bài toán cụ thể

2 Yêu cÅu vÁ bài t¿p: Làm bài tÁp của ch°¢ng 1 3 Há tháng các ki¿n thāc đã hác:

- Tổng quan về giÁi thuÁt:

+ Các đặc tr°ng của giÁi thuÁt + Ngôn ngā dißn đ¿t giÁi thuÁt + Ph°¢ng pháp thiết kế giÁi thuÁt

Câu hỏi 1: GiÁi thuÁt là gì? Nêu các đặc tr°ng của giÁi thuÁt? Câu hỏi 2: Kể tên nhāng lo¿i ngôn ngā nào dißn đ¿t giÁi thuÁt? Bài tÁp 1: Viết giÁi thuÁt xác định n là số nguyên tố?

Bài tÁp 2: GiÁi thuÁt tìm phần tÿ thứ n của dãy số Fibonacci

Trang 16

- Mát danh sách tuyến tính có:

+ Số phần tÿ biến đổi + Mát phần tÿ th°ờng là mát bÁn ghi (record trong Pascal) hoặc mát cÃu trúc (struct trong C)

- Các thao tác th°ờng sÿ dụng nhÃt:

+ Thêm phần tÿ + Xóa phần tÿ - Các thao tác khác:

+ Tìm kiếm + Ghép 2 danh sách + Tách 1 danh sách thành nhiều danh sách + Sao chép danh sách

+ Duyát các phần tÿ dß dàng sÿ dụng chỉ số:

for(i = 0; i <= N; ++i) if(a[i]) …

- Nh°ợc điểm:

+ Thêm và xóa KHÔNG dß dàng + Danh sách th°ờng xuyên thêm bớt phần tÿ => Không biết tr°ớc số phần tÿ

+ Tốn bá nhớ vì phÁi cÃp phát nhiều h¢n cần thiết để giā chß - Thêm mát phần tÿ thứ i vào mÁng

+ Chuyển các phần tÿ từ I đến n xuống các vị trí từ i+1 đến n+1; + Thêm phần tÿ cần thêm vào vị trí thứ i

Trang 17

16

+ Xóa phần tÿ thứ i khỏi mÁng + Chuyển các phần tÿ từ i+1 đến n vào các vị trí từ i đến n-1: Không hiáu quÁ vì luôn phÁi dịch chuyển phần tÿ

2.1.2 Ngăn xếp

Ngăn xếp (stack) là mát cÃu trúc dā liáu tuyến tính, ho¿t đáng theo c¢ chế LIFO (Last In First Out), t¿m dịch là <vào sau ra tr°ớc= Có nghĩa là phần tÿ nào đ°ợc thêm vào sau trong stack thì sẽ đ°ợc lÃy ra tr°ớc

Trang 18

Vì vÁy mà có tên gọi Stack (danh sách kiểu xếp chồng) Với kiểu ngăn xếp, ta chỉ có thể thăc hián các thao tác sau: + Khởi t¿o mát ngăn xếp

+ Đẩy (push) mát phần tÿ mới vào ngăn xếp nếu ngăn xếp ch°a đầy Phần tÿ dā liáu mới luôn đ°ợc thêm t¿i đỉnh

+ LÃy (pop) mát phần tÿ ra khỏi ngăn xếp nếu ngăn xếp khác rßng Phần tÿ bị lo¿i là phần tÿ đang nằm t¿i đỉnh

+ Kiểm tra xem ngăn xếp có hay không có phần tÿ (rßng hay không) + Kiểm tra xem ngăn xếp đã đầy hay ch°a

Nh° vÁy:

- Các phần tÿ của ngăn xếp có cùng mát kiểu nào đó - Ngăn xếp là mát tr°ờng hợp riêng của danh sách, đ°ợc sÿ dụng trong các ứng dụng có liên quan đến să đÁo ng°ợc Trong CTDL ngăn xếp, viác thêm hay lÃy dā liáu chỉ đ°ợc thăc hián t¿i mát đầu Dā liáu thêm vào sau sẽ lÃy ra tr°ớc, tính chÃt này còn đ°ợc gọi là vào sau ra tr°ớc (Last In First Out -LIFO)

- Khi nói đến ngăn xếp ta hiểu đó là danh sách kiểu LIFO ❖ Ví dụ: Đổi mát số nguyên d°¢ng, chẳng h¿n 23, sang c¢ số 2, ta thăc hián nh° sau:

Trang 19

18

2.1.3 Hàng đợi

Mát hàng đợi (queue) là mát mô hình (c¢ cÃu) mà tác đáng bổ sung vào nó đ°ợc thăc hián ở mát phía của nó và tác đáng lo¿i bỏ mát phần tÿ đ°ợc thăc hián ở phía còn l¿i

Trong tin học, mát hàng đợi là mát danh sách tuyến tính mà thao tác bổ sung chỉ đ°ợc thăc hián ở mát đầu và thao tác bớt đi đ°ợc thăc hián ở phía còn l¿i của nó

Ta hình dung hàng đợi nh° mát dãy ng°ời xếp hàng t¿i mát quầy hàng để mua mát mặt hàng nào đó mà chỉ có thể thêm vào hàng đợi từ cuối và bớt đi phần tÿ ở đầu của hàng đợi; Mát dãy các công viác trong mát há thống máy tính đang chờ mát thiết bị nào đó (chẳng h¿n nh° máy in) hoặc mát dãy máy bay đang trong đ°ờng d¿n ra đ°ờng băng để chuẩn bị cÃt cánh

Hàng đợi là mát cÃu trúc dā liáu trừu t°ợng, là mát danh sách tuyến tính Tuy nhiên điểm khác căn bÁn, có thể xem nh° đối lÁp với ngăn xếp là trong khi ngăn xếp ho¿t đáng theo nguyên lý vào sau - ra tr°ớc (LiFo Last in - First out) thì hàng đợi ho¿t đáng theo nguyên lý vào tr°ớc - ra tr°ớc (FiFo First in - First out)

Với kiểu hàng đợi, ta quy °ớc chỉ có thể thăc hián các thao tác sau: + Khởi t¿o mát hàng đợi

+ Đặt (put) mát phần tÿ mới vào hàng đợi nếu hàng đợi ch°a đầy Phần tÿ dā liáu mới luôn đ°ợc thêm t¿i đuôi

Trang 20

 Vì vÁy, khi nói đến hàng đợi ta hiểu đó là danh sách kiểu FIFO Thăc hián mô hình hóa hàng đợi:

- Ta cần t¿o mát cÃu trúc danh sách tuyến tính và chuẩn bị các thao tác để có thể làm viác với danh sách này với t° cách là mát hàng đợi

- Cần định nghĩa mát kiểu danh sách để coi nó nh° hàng đợi, bao gồm cÃu trúc dā liáu đ°ợc sÿ dụng và các đối t°ợng làm đầu và đuôi của hàng đợi Do đó có thể chọn danh sách liên kết đ¢n với mát con trỏ đến đầu danh sách và mát con trỏ trỏ đến cuối (đuôi) hoặc mÁng mát chiều với hai tham số nguyên chỉ vị trí đầu và đuôi của hàng đợi

- Đôi khi cần gắn thêm mát biến nguyên để l°u trā thông tin về kích th°ớc thăc tế của hàng đợi

- Cần t¿o các thủ tục/hàm để thao tác trên danh sách này với t° cách là thao tác hàng đợi bao gồm 5 thao tác đã nói ở trên

2.2 Danh sách liên k¿t

Danh sách liên kết là tÁp hợp các phần tÿ mà giāa chúng có mát să nối kết với nhau thông qua vùng liên kết của chúng Să nối kết giāa các phần tÿ trong danh sách liên kết đó là să quÁn lý, ràng buác l¿n nhau về nái dung của phần tÿ này và địa chỉ định vị phần tÿ kia Tùy thuác vào mức đá và cách thức nối kết mà danh sách liên kết có thể chia ra nhiều lo¿i khác nhau:

- Danh sách liên kết đ¢n (singly linked list); - Danh sách liên kết đôi/kép (doubly linked list); - Danh sách liên kết vòng (vòng đ¢n, vòng đôi) (circular linked list) Mßi lo¿i danh sách sẽ có cách biểu dißn các phần tÿ (cÃu trúc dā liáu) riêng và các thao tác trên đó

Danh sách liên kết (Linked List) là mát cÃu trúc dā liáu tuyến tính, bao gồm mát

chußi các node kết nối với nhau Mßi node có thể xem nh° mát phần tÿ trong danh sách Mßi node sẽ l°u trā dā liáu (data) của node đó và địa chỉ (address) của node kế tiếp Bên d°ới là minh họa cÃu trúc dā liáu danh sách liên kết

Trang 21

20

Danh sách liên kết phÁi có node bắt đầu, đ°ợc gọi là HEAD Node cuối cùng đ°ợc gọi là TAIL Mßi node có nhiều nhÃt 1 phần tÿ đứng tr°ớc cũng nh° có nhiều nhÃt 1 phần tÿ đứng sau

Có nhiều tr°ờng hợp trong thăc tế có thể đ°ợc l°u trā bằng cách sÿ dụng Linked List nh°:

+ Danh sách học sinh + Danh mục sách trong th° vián + Danh b¿ đián tho¿i

+ Danh sách các nhân viên trong công ty

2.2.1 Danh sách liên kết đơn

Danh sách liên kết đ¢n (singly linked list) có đặc điểm là mßi node (phần tÿ) chỉ liên kết với node đứng sau nó trong danh sách

Mßi node trong danh sách liên kết gồm 2 phần: Phần dā liáu (data) dùng để l°u nái dung của node Phần địa chỉ liên kết (address), th°ờng ký hiáu là next, là các con trỏ có cùng kiểu với node Các con trỏ này l°u trā địa chỉ của node kế tiếp trong danh sách Nếu là node cuối cùng thì con trỏ trỏ đến NULL

Có thể sÿ dụng kiểu dā liáu cÃu trúc (struct) để xây dăng mát node nh° sau: struct node{

<Kiểu dữ lißu> data;//nội dung cÿa node node *next;//con trỏ l±u đßa chß cÿa node kế tiếp };

<Kiểu dā liáu> trong mát node của danh sách liên kết đ¢n có thể là mát kiểu bÃt kỳ nh° int, float, pointer, struct,…

Có nhiều thao tác trên danh sách liên kết đ¢n nh° thêm node, hủy node, tìm kiếm node trong danh sách, sắp xếp danh sách,…

a Định nghĩa danh sách liên kết đơn

GiÁ sÿ, chúng ta t¿o mát danh sách liên kết đ¢n l°u trā mát dãy số nguyên nh° sau:

struct node{

int info; node *next; };

struct sList{

Trang 22

21

node *head; node *tail; };

b Khởi tạo một danh sách liên kết đơn rỗng

Xây dăng hàm createList() để gán các con trỏ head và tail trỏ về NULL void createsList(sList &l){

l.head = NULL; l.tail = NULL; }

c Tạo một node và gán giá trị cho node

Xây dăng hàm createNode() có tham số là giá trị của node muốn t¿o Hàm createNode() có kiểu trÁ về là con trß node

node* createNode(int x){

node *p; p = new node; if(p==NULL){

cout<<"Khong du bo nho!"; exit(1);

} p->info = x; p->next = NULL; return p;

}

d Thêm một node vào danh sách

Tr°ờng hợp 1: Nếu danh sách liên kết đ¢n rßng thì node mới đ°ợc xem là node đầu tiên và cũng là node cuối cùng

Tr°ờng hợp 2: Nếu danh sách liên kết đ¢n không rßng thì:

+ Cho con trỏ liên kết (next) của node mới trỏ vào node đầu tiên trong danh sách hián t¿i

+ Cho con trỏ đầu của danh sách liên kết đ¢n (*head) trỏ vào node mới void insertHead(sList &l, int x){

node *p; p = createNode(x); if(p==NULL){

cout<<"Khong tao duoc node!"; exit(1);

}

Trang 23

22

if(l.head==NULL){//trường hợp danh sách rỗng

l.head = l.tail = p; }else{//trường hợp danh sách không rỗng

p->next = l.head; l.head = p;

} }

Tr°ờng hợp 1: Nếu danh sách liên kết đ¢n rßng thì node mới đ°ợc xem là node đầu tiên và cũng là node cuối cùng

Tr°ờng hợp 2: Nếu danh sách liên kết đ¢n không rßng thì:

+ Cho con trỏ liên kết (next) của node cuối danh sách hián t¿i trỏ đến đến node mới

+ Cho con trỏ cuối của danh sách liên kết đ¢n (*tail) trỏ vào node mới

void insertTail(sList &l, int x){

node *p = createNode(x); if(p==NULL){

cout<<"Khong tao duoc nut moi!"; exit(1);

} if (l.head==NULL){//trường hợp danh sách rỗng

l.head = l.tail = p ; }else{//trường hợp danh sách không rỗng

l.tail->next = p; l.tail = p;

} }

- Cho con trỏ liên kết (next) của node p chỉ vào node sau của q - Cho con trỏ liên kết của q chỉ vào node p

- Nếu q là nút cuối thì gán l¿i p là nút cuối

Trang 24

23

void insertAfter(sList &l, node *p, node *q){

p->next = q->next; q->next = p;

if (q == l.tail){

l.tail = p; }

} e Duyệt các phần tử trong danh sách

void processList(sList &l){

node *p; p = l.head; while (p!= NULL){

cout<<p->info<<endl;//xuất giá trị trong node p = p->next;

} }

Hàm searchList() có kiểu trÁ về là con trỏ node Nếu tìm thÃy x thì node đ°ợc

trÁ về khác NULL, ng°ợc l¿i node đ°ợc trÁ về là NULL

node* searchList(sList l, int k){

node *p; p = l.head; while((p!= NULL)&&(p->info != k)){

p = p->next; }

return p; }

Ngày đăng: 14/09/2024, 21:31

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN