Tải bản đầy đủ (.ppt) (38 trang)

Bài giảng cấu trúc dữ liệu và giải thuật danh sách liên kết đơn

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 (405.7 KB, 38 trang )

CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT

Cấu trúc dữ liệu và thuật giải

NỘIMaster
DUNGTitle Style
Click To Edit

DANH SÁCH LIÊN KẾT ĐƠN (LIST)


Tổ Click
Chức Của
DSLKMaster
Đơn
To Edit

CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT

Cấu trúc dữ liệu và thuật giải

x0

x1

x2

Title Style
x3

 Mỗi phần tử liên kết với phần tử đứng liền sau trong


danh sách
 Mỗi phần tử trong danh sách liên kết đơn là một cấu
trúc có hai thành phần
 Thành phần dữ liệu: Lưu trữ thông tin về bản
thân phần tử
 Thành phần liên kết: Lưu địa chỉ phần tử đứng
sau trong danh sách hoặc bằng NULL nếu là phần
tử cuối danh sách.


của
DSLKTitle
đơnStyle
Click CTDL
To Edit
Master
 Cấu trúc dữ liệu của 1 nút trong List đơn
typedef struct tagNode
{ Data Info; // Lưu thông tin bản thân
struct tagNode *pNext; //Lưu địa chỉ của Node đứng
CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT

Cấu trúc dữ liệu và thuật giải

sau

}Node;
pNext
 Cấu trúc dữ liệu của DSLK đơn Info
typedef struct tagList

{ Node *pHead;//Lưu địa chỉ Node đầu tiên trong List
Node *pTail; //Lưu địa chỉ của Node cuối cùng trong List
}LIST;
// kiểu danh sách liên kết đơn


Ví dụ
tổ chức
DSLKMaster
đơn trong
bộ nhớ
Click
To Edit
Title
Style
pHead

pTail
4f

3f

CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT

Cấu trúc dữ liệu và thuật giải

4

4f


7

5f

5f

6

NULL

Trong ví dụ trên thành phần dữ liệu là 1 số nguyên
nodes

f



elements


CácClick
thao tác
bảnMaster
trên DSLK
đơn
To cơ
Edit
Title
Style
 Tạo 1 danh sách liên kết đơn rỗng

 Tạo 1 nút có trường Infor bằng x
 Tìm một phần tử có Info bằng x
CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT

Cấu trúc dữ liệu và thuật giải

 Thêm một phần tử có khóa x vào danh sách
 Hủy một phần tử trong danh sách
 Duyệt danh sách
 Sắp xếp danh sách liên kết đơn


Khởi
tạo danh
sáchMaster
liên kết
Click
To Edit

Title Style

 Địa chỉ của nút đầu tiên, địa chỉ của nút cuối cùng
đều không có

CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT

Cấu trúc dữ liệu và thuật giải

void CreateList(List &l)
{

l.pHead=NULL;
l.pTail=NULL;
}


TạoClick
1 phần
mới
TotửEdit

Master Title Style

 Hàm trả về địa chỉ phần tử mới tạo
Node*

CreateNode(Data x)

{ Node *p;

CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT

Cấu trúc dữ liệu và thuật giải

p = new Node;//Cấp phát vùng nhớ cho phần tử
if ( p==NULL) exit(1);
p ->Info = x; //gán dữa liệu cho nút
p->pNext = NULL;
return p;
}



Thêm
1 phần
tử vàoMaster
DSLK
Click
To Edit

Title Style

 Các vị trí cần thêm 1 phần tử vào List:

CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT

Cấu trúc dữ liệu và thuật giải

 Thêm vào đầu List đơn
 Thêm vào cuối List
 Thêm vào sau 1 phần tử q trong list


Thuật
toánTo
thêm
1 phần
tử vào
đầuStyle
DSLK
Click
Edit

Master
Title
 Thêm nút p vào đầu danh sách liên kết đơn
Bắt đầu:
Nếu List rỗng thì

CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT

Cấu trúc dữ liệu và thuật giải

+ pHead = p;
+ pTail = pHead;
Ngược lại
+ p->pNext = pHead;
+ pHead = p


CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT

Cấu trúc dữ liệu và thuật giải

Hàm
thêmTo
1 phần
vào đầuTitle
List
Click
EdittửMaster
void AddHead(LIST &l, Node* p)
{

if (l.pHead==NULL)
{
l.pHead = p;
l.pTail = l.pHead;
}
else
{
p->pNext = l.pHead;
l.pHead = p;
}
}

Style


Minh
họa thuật
toánMaster
thêm vào
đầu Style
Click
To Edit
Title
pHead

2f

3 3f

CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT


Cấu trúc dữ liệu và thuật giải

9f
pHead=P

10
P

2f
N
P->pNext=pHead

3f

4 4f

4f

8…


Thuật
toán
thêm
vào Title
cuối Style
DSLK
Click To
Edit

Master
 Ta cần thêm nút p vào cuối list đơn
Bắt đầu:
Nếu List rỗng thì

CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT

Cấu trúc dữ liệu và thuật giải

+ pHead = p;
+ pTail = pHead;
Ngược lại
+ pTail->pNext=p;
+ pTail=p


CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT

Cấu trúc dữ liệu và thuật giải

Hàm
thêmTo
1 phần
vào cuốiTitle
DSLKD
Click
EdittửMaster
Style
void AddTail(LIST &l, Node *p)
{

if (l.pHead==NULL)
{
l.pHead = p;
l.pTail = l.pHead;
}
else
{
l.pTail->Next = p;
l.pTail = p;
}
}


Minh
họa thuật
toánMaster
thêm vào
cuốiStyle
Click
To Edit
Title

3f

4 4f

4f

8 5f


pTail

5f

5

N
9f

CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT

Cấu trúc dữ liệu và thuật giải

pTail=P
pTail->pNext

9f

6N
P


Thuật
toán
p vào Title
sau phần
Click
Tophần
Edit tử
Master

Styletử q
 Ta cần thêm nút p vào sau nút q trong list đơn
Bắt đầu:

CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT

Cấu trúc dữ liệu và thuật giải

Nếu (q!=NULL) thì
B1: p->pNext = q->pNext
B2:
+ q->pNext = p
+ nếu q = pTail thì
pTail=p


CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT

Cấu trúc dữ liệu và thuật giải

CàiClick
đặt thuật
To toán
Edit

Master Title Style

void InsertAfterQ(List &l, Node *p, Node *q)
{
if(q!=NULL)

{
p->pNext=Q->Next;
q->pNext=p;
if(l.pTail==q)
l.Tail=q;
}
else
AddHead(l,q);// thêm q vào đầu list
}


Minh
họa
thuật Title
toán Style
Click To
Edit
Master
3f

CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT

Cấu trúc dữ liệu và thuật giải

4 4f

4f q

8 5f
9f

q->pNext=P

5f
9f

7 N
5f
P

5 ..

P->pNext=q->pNext


HủyClick
phần To
tử trong
đơnTitle
Edit DSLK
Master

Style

 Nguyên tắc: Phải cô lập phần tử cần hủy trước hủy.
 Các vị trị cần hủy

CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT

Cấu trúc dữ liệu và thuật giải


 Hủy phần tử đứng đầu List
 Hủy phần tử có khoá bằng x
 Huỷ phần tử đứng sau q trong danh sách liên kết
đơn
 Ở phần trên, các phần tử trong DSLK đơn được cấp
phát vùng nhớ động bằng hàm new, thì sẽ được giải
phóng vùng nhớ bằng hàm delete.


Thuật
toánTo
hủy
phần
tử trongTitle
DSLK
Click
Edit
Master
Style
 Bắt đầu:
 Nếu (pHead!=NULL) thì

CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT

Cấu trúc dữ liệu và thuật giải

 B1: p=pHead
 B2:
+ pHead = pHead->pNext
+ delete (p)

 B3:
Nếu pHead==NULL thì pTail=NULL


CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT

Cấu trúc dữ liệu và thuật giải

CàiClick
đặt thuật
To toán
Edit

Master Title Style

 Hủy được hàm trả về 1, ngược lại hàm trả về 0
int RemoveHead(List &l, int &x)
{ Node *p;
if(l.pHead!=NULL)
{
p=l.pHead;
x=p->Info; //lưu Data của nút cần hủy
l.pHead=l.pHead->pNext;
delete p;
if(l.pHead==NULL)
l.pTail=NULL;
return 1;
}
return 0;
}



Minh
hoạ thuật
toánMaster
Click
To Edit

Title Style

pHead=pHead->pNext

CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT

Cấu trúc dữ liệu và thuật giải

pHead

2f

1f

7 2f
P=pHead

P

3f

6 3f


4f

3 4f

8 …


HủyClick
phần To
tử sau
tử q trong
Editphần
Master
TitleList
Style
 Bắt đầu
Nếu (q!=NULL) thì //q tồn tại trong List
 B1: p=q->pNext;// p là phần tử cần hủy

CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT

Cấu trúc dữ liệu và thuật giải

 B2: Nếu (p!=NULL) thì // q không phải là phần tử cuối
+ q->pNext=p->pNext;// tách p ra khỏi xâu
+ nếu (p== pTail) // nút cần hủy là nút cuối
pTail=q;
+ delete p;// hủy p



CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT

Cấu trúc dữ liệu và thuật giải

CàiClick
đặt thuật
To toán
Edit

Master Title Style

int RemoveAfterQ(List &l,Node *q, int &x)
{ Node *p;
if(q!=NULL)
{
p=q->pNext; //p là nút cần xoá
if(p!=NULL) // q không phài là nút cuối
{
if(p==l.pTail) //nút cần xoá là nút cuối cùng
l.pTail=q;// cập nhật lạ pTail
q->pNext=p->pNext; x=p->Info;
delete p;
}
return 1;
}
else
return 0;}



Minh
họa thuật
toánMaster
Click
To Edit

q

CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT

Cấu trúc dữ liệu và thuật giải

pHead

1f

7 2f

p=q->pNext

2f

4f
6 3f

Title Style

p

3f


4f

3 4f
q->pNext=p->pNext

8 …


Thuật
toánTo
hủy
phần
tử có khoá
Click
Edit
Master
Titlex

Style

Bước 1:
Tìm phần tử p có khoá bằng x, và q đứng trước p
Bước 2:
CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT

Cấu trúc dữ liệu và thuật giải

Nếu (p!=NULL) thì //tìm thấy phần tử có khoá bằng x
Hủy p ra khỏi List bằng cách hủy phần tử

đứng sau q
Ngược lại
Báo không tìm thấy phần tử có khoá


×