CTDL_04_ListDon

83
u trúc dữ liệu và thuật giải CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT 1 Click To Edit Master Title Style NỘI DUNG DANH SÁCH LIÊN KẾT ĐƠN (LIST)

description

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

Transcript of CTDL_04_ListDon

Dãy – Danh sáchCU TRÚC D LIU VÀ GII THUT 1
Click To Edit Master Title Style
NI DUNG
Cu trúc d liu và thut gii
CU TRÚC D LIU VÀ GII THUT 1
Click To Edit Master Title Style
T Chc Ca DSLK n
Mi phn t liên kt vi phn t ng lin sau trong danh sách
Mi phn t trong danh sách liên kt n là mt cu trúc có hai thành phn
Thành phn d liu: Lu tr thông tin v bn thân phn t
Thành phn liên kt: Lu a ch phn t ng sau trong danh sách hoc bng NULL nu là phn t cui danh sách.
x0
x1
x2
x3
CU TRÚC D LIU VÀ GII THUT 1
Click To Edit Master Title Style
CTDL ca DSLK n
Cu trúc d liu ca 1 nút trong List n
typedef struct tagNode
struct tagNode *pNext; //Lu a ch ca Node ng sau
}Node;
typedef struct tagList
{ Node *pHead;//Lu a ch Node u tiên trong List
Node *pTail; //Lu a ch ca Node cui cùng trong List
}LIST; // kiu danh sách liên kt n
Info
pNext
CU TRÚC D LIU VÀ GII THUT 1
Click To Edit Master Title Style
Ví d t chc DSLK n trong b nh
Trong ví d trên thành phn d liu là 1 s nguyên
4f
4
3f
NULL
6
5f
7
4f
5f
pHead
pTail
CU TRÚC D LIU VÀ GII THUT 1
Click To Edit Master Title Style
Các thao tác c bn trên DSLK n
To 1 danh sách liên kt n rng
To 1 nút có trng Infor bng x
Tìm mt phn t có Info bng x
Thêm mt phn t có khóa x vào danh sách
Hy mt phn t trong danh sách
Duyt danh sách
CU TRÚC D LIU VÀ GII THUT 1
Click To Edit Master Title Style
Khi to danh sách liên kt
a ch ca nút u tiên, a ch ca nút cui cùng u không có
void CreateList(List &l)
CU TRÚC D LIU VÀ GII THUT 1
Click To Edit Master Title Style
To 1 phn t mi
Hàm tr v a ch phn t mi to
Node* CreateNode(Data x) // trong bài hc là int
{ Node *p;
if ( p==NULL) exit(1);
p->pNext = NULL;
CU TRÚC D LIU VÀ GII THUT 1
Click To Edit Master Title Style
Thêm 1 phn t vào DSLK
Nguyên tc thêm: Khi thêm 1 phn t vào List thì có làm cho pHead, pTail thay i?
Các v trí cn thêm 1 phn t vào List:
Thêm vào u List n
Thêm vào cui List
Cu trúc d liu và thut gii
CU TRÚC D LIU VÀ GII THUT 1
Click To Edit Master Title Style
Thut toán thêm 1 phn t vào u DSLK
Thêm nút p vào u danh sách liên kt n
Bt u:
CU TRÚC D LIU VÀ GII THUT 1
Click To Edit Master Title Style
Hàm thêm 1 phn t vào u List
void AddHead(LIST &l, Node* p)
{
CU TRÚC D LIU VÀ GII THUT 1
Click To Edit Master Title Style
Minh ha thut toán thêm vào u
3 3f
4 4f
CU TRÚC D LIU VÀ GII THUT 1
Click To Edit Master Title Style
Thut toán thêm vào cui DSLK
Ta cn thêm nút p vào cui list n
Bt u:
CU TRÚC D LIU VÀ GII THUT 1
Click To Edit Master Title Style
Hàm thêm 1 phn t vào cui DSLKD
void AddTail(LIST &l, Node *p)
{
CU TRÚC D LIU VÀ GII THUT 1
Click To Edit Master Title Style
Minh ha thut toán thêm vào cui
5
CU TRÚC D LIU VÀ GII THUT 1
Click To Edit Master Title Style
Thut toán phn t q vào sau phn t q
Ta cn thêm nút p vào sau nút q trong list n
Bt u:
B2:
CU TRÚC D LIU VÀ GII THUT 1
Click To Edit Master Title Style
Cài t thut toán
{
}
CU TRÚC D LIU VÀ GII THUT 1
Click To Edit Master Title Style
Minh ha thut toán
CU TRÚC D LIU VÀ GII THUT 1
Click To Edit Master Title Style
Hy phn t trong DSLK n
Nguyên tc: Phi cô lp phn t cn hy trc hy.
Các v tr cn hy
Hy phn t ng u List
Hy phn t có khoá bng x
Hu phn t ng sau q trong danh sách liên kt n
phn trên, các phn t trong DSLK n c cp phát vùng nh ng bng hàm new, thì s c gii phóng vùng nh bng hàm delete.
Cu trúc d liu và thut gii
CU TRÚC D LIU VÀ GII THUT 1
Click To Edit Master Title Style
Thut toán hy phn t trong DSLK
Bt u:
Cu trúc d liu và thut gii
CU TRÚC D LIU VÀ GII THUT 1
Click To Edit Master Title Style
Cài t thut toán
Hy c hàm tr v 1, ngc li hàm tr v 0
int RemoveHead(List &l, int &x)
{ Node *p;
if(l.pHead!=NULL)
{ p=l.pHead;
l.pHead=l.pHead->pNext;
CU TRÚC D LIU VÀ GII THUT 1
Click To Edit Master Title Style
Minh ho thut toán
CU TRÚC D LIU VÀ GII THUT 1
Click To Edit Master Title Style
Hy phn t sau phn t q trong List
Bt u
B1: p=q->pNext;// p là phn t cn hy
B2: Nu (p!=NULL) thì // q không phi là phn t cui
+ q->pNext=p->pNext;// tách p ra khi xâu
+ nu (p== pTail) // nút cn hy là nút cui
pTail=q;
CU TRÚC D LIU VÀ GII THUT 1
Click To Edit Master Title Style
Cài t thut toán
{ Node *p;
if(q!=NULL)
{ if(p==l.pTail) //nút cn xoá là nút cui cùng
l.pTail=q;// cp nht l pTail
q->pNext=p->pNext; x=p->Info;
delete p;
CU TRÚC D LIU VÀ GII THUT 1
Click To Edit Master Title Style
Minh ha thut toán
CU TRÚC D LIU VÀ GII THUT 1
Click To Edit Master Title Style
Thut toán hy phn t có khoá x
Bc 1:
Tìm phn t p có khoá bng x, và q ng trc p
Bc 2:
Nu (p!=NULL) thì //tìm thy phn t có khoá bng x
Hy p ra khi List bng cách hy phn t ng sau q
Ngc li
Cu trúc d liu và thut gii
CU TRÚC D LIU VÀ GII THUT 1
Click To Edit Master Title Style
Cài t thut toán
{ Node *p,*q = NULL; p=l.Head;
while((p!=NULL)&&(p->Info!=x)) //tìm
{ q=p;
}
if(p==NULL) //không tìm thy phn t có khoá bng x
return 0;
DeleteAfterQ(l,q,x);
RemoveHead(l,x);
CU TRÚC D LIU VÀ GII THUT 1
Click To Edit Master Title Style
Tìm 1 phn t trong DSLK n
Tìm tun t (hàm tr v), các bc ca thut toán tìm nút có Info bng x trong list n
Bc 1: p=pHead;// a ch ca phn t u trong list n
Bc 2:
p=p->pNext;// xét phn t k
Bc 3:
+ Nu p!=NULL thì p lu a ch ca nút có
Info = x
Cu trúc d liu và thut gii
CU TRÚC D LIU VÀ GII THUT 1
Click To Edit Master Title Style
Hàm tìm 1 phn t trong DSLK n
Hàm tìm phn t có Info = x, hàm tr v a ch ca nút có Info = x, ngc li hàm tr v NULL
Node *Search(LIST l, Data x)
{
CU TRÚC D LIU VÀ GII THUT 1
Click To Edit Master Title Style
Minh ha thut toán tìm phn t trong DSLK
56
34
3
4
8
pHead
1f
2f
3f
4f
5f
P
Tìm thy, hàm tr v a ch ca nút tìm thy là 4f
8
CU TRÚC D LIU VÀ GII THUT 1
Click To Edit Master Title Style
Duyt danh sách
Duyt danh sách là thao tác thng c thc hin khi có nhu cu cn x lý các phn t trong danh sách nh:
m các phn t trong danh sách
Tìm tt c các phn t trong danh sách tho iu kin
Hy toàn b danh sách
Cu trúc d liu và thut gii
CU TRÚC D LIU VÀ GII THUT 1
Click To Edit Master Title Style
Thut toán duyt danh sách
Bc 1:
p = pHead;// p lu a ch ca phn t u trong List
Bc 2:
+ x lý phn t p
+ p=p->pNext;// qua phn t k
Cu trúc d liu và thut gii
CU TRÚC D LIU VÀ GII THUT 1
Click To Edit Master Title Style
Cài t in các phn t trong List
void PrintList(List l)
CU TRÚC D LIU VÀ GII THUT 1
Click To Edit Master Title Style
Hy danh sách liên kt n
Bc 1:
B11:
B12:
pTail = NULL;// bo toàn tính nht quán khi xâu rng
Cu trúc d liu và thut gii
CU TRÚC D LIU VÀ GII THUT 1
Click To Edit Master Title Style
Cài t thut toán
{
CU TRÚC D LIU VÀ GII THUT 1
Click To Edit Master Title Style
Minh ha thut toán
CU TRÚC D LIU VÀ GII THUT 1
Click To Edit Master Title Style
Sp xp danh sách
Cách 1: Thay i thành phn Info
4f
4
3f
N
6
5f
7
4f
5f
pHead
pTail
4f
4
3f
N
7
5f
6
4f
5f
pHead
pTail
CU TRÚC D LIU VÀ GII THUT 1
Click To Edit Master Title Style
Sp xp danh sách
Cách 2: Thay i thành phn pNext (thay i trình t móc ni ca các phn t sao cho to lp nên c th t mong mun)
3f
4f
5f
6
pHead
pTail
5f
4
4f
N
7
4f
4
3f
N
6
5f
7
4f
5f
pHead
pTail
CU TRÚC D LIU VÀ GII THUT 1
Click To Edit Master Title Style
u, nhc im ca 2 cách tip cn
Thay i thành phn Info (d liu)
u: Cài t n gin, tng t nh sp xp mng
Nhc:
òi hi thêm vùng nh khi hoán v ni dung ca 2 phn t -> ch phù hp vi nhng xâu có kích thc Info nh
Khi kích thc Info (d liu) ln chi phí cho vic hoán v thành phn Info ln
Làm cho thao tác sp xp chm
Thay i thành phn pNext
u:
Kích thc ca trng này không thay i, do ó không ph thuc vào kích thc bn cht d liu lu ti mi nút.
Thao tác sp xp nhanh
Nhc: Cài t phc tp
Cu trúc d liu và thut gii
CU TRÚC D LIU VÀ GII THUT 1
Click To Edit Master Title Style
Dùng thut toán SX SelectionSort SX List
void SelectionSort(LIST &l)
CU TRÚC D LIU VÀ GII THUT 1
Click To Edit Master Title Style
Các thut toán sp xp hiu qu trên List
Các thut toán sp xp xâu (List) bng các thay i thành phn pNext (thành phn liên kt) có hiu qu cao nh:
Thut toán sp xp Quick Sort
Thut toán sp xp Merge Sort
Thut toán sp xp Radix Sort
Cu trúc d liu và thut gii
CU TRÚC D LIU VÀ GII THUT 1
Click To Edit Master Title Style
Thut toán sp xp Quick Sort
Bc 1:
Chn X là phn t u xâu L làm phn t cm canh
Loi X ra khi L
Bc 2:
Tách xâu L ra làm 2 xâu L1(gm các phn t nh hn hoc bng x) và L2 (gm các phn t ln hn X)
Bc 3: Nu (L1 !=NULL) thì QuickSort(L1)
Bc 4: Nu (L2!=NULL) thì QuickSort(L2)
Bc 5: Ni L1, X, L2 li theo th t ta có xâu L ã c sp xp
Cu trúc d liu và thut gii
CU TRÚC D LIU VÀ GII THUT 1
Click To Edit Master Title Style
Minh ha thut toán
Cho danh sách liên kt gm các phn t sau:
4
X =
2
1
CU TRÚC D LIU VÀ GII THUT 1
Click To Edit Master Title Style
Minh ha thut toán (tt)
Sp xp L1
Sp xp L2
Chn x=6 cm canh, và tách L2 thành L21 và L22
L21 (X)
CU TRÚC D LIU VÀ GII THUT 1
Click To Edit Master Title Style
Minh ha thut toán (tt)
Ni L21, X2, L22 thành L2
Ni L1, X, L2 thành L
6
8
6
pHead
L2
pTail
2
4
5
6
8
pHead
pTail
1
CU TRÚC D LIU VÀ GII THUT 1
Click To Edit Master Title Style
Cài t thut toán
void QuickSort(List &l)
{ Node *p,*X;//X lu a ch ca phn t cm canh
List l1,l2;
CreateList(l1);
CreateList(l2);
{ p=l.pHead;
CU TRÚC D LIU VÀ GII THUT 1
Click To Edit Master Title Style
Cài t thut toán (tt)
QuickSort(l1);//Gi quy sp xp L1
QuickSort(l2);//Gi quy sp xp L2
if(l1.pHead!=NULL)//ni l1, l2 va X vao l
{
}
l.pTail=l2.pTail;
l.pTail=X;
CU TRÚC D LIU VÀ GII THUT 1
Click To Edit Master Title Style
Thut tn sp xp Merge Sort
Bc 1: Phân phi luân phiên tng ng chy ca xâu L vào 2 xâu con L1 và L2.
Bc 2: Nu L1 != NULL thì Merge Sort (L1).
Bc 3: Nu L2 != NULL thì Merge Sort (L2).
Bc 4: Trn L1 và L2 ã sp xp li ta có xâu L
ã c sp xp.
Không tn thêm không gian lu tr cho các dãy ph
Cu trúc d liu và thut gii
CU TRÚC D LIU VÀ GII THUT 1
Click To Edit Master Title Style
Minh ha thut toán
Cho danh sách liên kt gm các phn t sau:
Phân phi các ng chy ca L1 vào L1, L2
6
5
1
8
2
pHead
pTail
4
6
1
8
pHead
4
pTail
L1
pTail
2
pHead
5
L2
CU TRÚC D LIU VÀ GII THUT 1
Click To Edit Master Title Style
Minh ha thut toán (tt)
Sp xp L1
Trn L11 và L12 vào L1
6
pHead
4
pTail
L11
pTail
8
pHead
1
L12
4
6
8
pHead
1
pTail
L1
CU TRÚC D LIU VÀ GII THUT 1
Click To Edit Master Title Style
Minh ha thut toán(tt)
Phân phi các ng chy ca L2 vào L21, L22
Trn L21, L22 thành L2
pHead
5
pTail
L21
pTail
pHead
2
L22
5
pHead
2
pTail
L2
CU TRÚC D LIU VÀ GII THUT 1
Click To Edit Master Title Style
Minh ha thut toán (tt)
Trn L1, L2 thành L
2
4
5
6
8
pHead
pTail
1
CU TRÚC D LIU VÀ GII THUT 1
Click To Edit Master Title Style
Cài t hàm main()
Yêu cu: Vit chng trình thành lp 1 xâu n, trong ó thành phn d liu ca mi nút là 1 s nguyên dng.
Lit kê tt thành phn d liu ca tt c các nút trong xâu
Tìm 1 phn t có khoá bng x trong xâu.
Xoá 1 phn t u xâu
Xoá 1 phn t có khoá bng x trong xâu
Sp xp xâu tng dn theo thành phn d liu (Info)
Chèn 1 phn t vào xâu, sao cho sau khi chèn xâu vn tng dn theo trng d liu
..vv
CU TRÚC D LIU VÀ GII THUT 1
Click To Edit Master Title Style
Cài t hàm main() (tt)
void main()
CreateList(l1);
do{
if(x>0)
{ p = CreateNode(x);
PrintList(l1);
Cu trúc d liu và thut gii
CU TRÚC D LIU VÀ GII THUT 1
Click To Edit Master Title Style
Cài t hàm main() (tt)
p = Search(l1,x);
else printf(“tìm thy”);
PrintList(l1);
scanf(“%d”,&x);
CU TRÚC D LIU VÀ GII THUT 1
Click To Edit Master Title Style
Cài t hàm main() (tt)
printf(“danh sách sau khi xoá”);
PrintfList(l1);
SelectionSort(l1);
PrintfList(l1);
RemoveList(l1);
CU TRÚC D LIU VÀ GII THUT 1
Click To Edit Master Title Style
Vài ng dng danh sách liên kt n
Dùng xâu n lu tr danh sách các hc viên trong lp hc
Dùng xâu n qun lý danh sách nhân viên trong mt công ty, trong c quan
Dùng xâu n qun lý danh sách các cun sách trong th vin
Dùng xâu n qun lý các bng a trong tim cho thuê a.
..vv
CU TRÚC D LIU VÀ GII THUT 1
Click To Edit Master Title Style
Dùng xâu n qun lý lp hc
Yêu cu: Thông tin ca mt sinh viên gm, mã s sinh viên, tên sinh viên, im trung bình.
1. Hãy khai báo cu trúc d liu dng danh sách liên kt lu danh sách sinh viên nói trên.
2. Nhp danh sách các sinh viên, và thêm tng sinh viên vào u danh sách (vic nhp kt thúc khi tên ca mt sinh viên bng rng)
3. Tìm mt sinh viên có trong lp hc hay không
4. Xoá mt sinh viên có mã s bng x (x nhp t bàn phím)
5. Lit kê thông tin ca các sinh viên có im trung bình ln hn hay bng 5.
Cu trúc d liu và thut gii
CU TRÚC D LIU VÀ GII THUT 1
Click To Edit Master Title Style
Dùng xâu n qun lý lp hc
6. Xp loi và in ra thông tin ca tng sinh viên, bit rng cách xp loi nh sau:
TB <=3.6 : Loi yu
TB>=6.5 và TB < 7.0: Loi trung bình khá
TB>=7.0 và TB <8.0: Loi khá
TB>=8.0 và TB < 9.0: Loi gii.
TB>=9.0 : Loi xut sc
Sp xp và in ra danh sách sinh viên tng theo im trung bình.
Chèn mt sinh viên vào danh sách sinh viên tng theo im trung bình nói trên, sao cho sau khi chèn danh sách sinh viên vn tng theo im trung bình
..vv
CU TRÚC D LIU VÀ GII THUT 1
Click To Edit Master Title Style
Cu trúc d liu cho bài toán
Cu trúc d liu ca mt sinh viên
typedef struct
typedef struct tagNode
CU TRÚC D LIU VÀ GII THUT 1
Click To Edit Master Title Style
Các cu trúc c bit ca danh sách n
Stack (ngn xp): Là 1 vt cha các i tng làm vic theo c ch LIFO (Last In First Out), tc vic thêm 1 i tng vào Stack hoc ly 1 i tng ra khi Stack c thc hin theo c ch “vào sau ra trc”
Queue (hàng i): Là 1 vt cha các i tng làm vic theo c ch FIFO (First In First Out), tc vic thêm 1 i tng vào hàng i hay ly 1 i tng ra khi hàng i thc hin theo c ch “vào trc ra trc”.
Cu trúc d liu và thut gii
CU TRÚC D LIU VÀ GII THUT 1
Click To Edit Master Title Style
ng dng Stack và Queue
Stack:
Queue:
T chc lu vt các quá trình tìm kim theo chiu rng, và quay lui vét cn,
T chc qun lý và phân phi tin trình trong các
h iu hành,
Cu trúc d liu và thut gii
CU TRÚC D LIU VÀ GII THUT 1
Click To Edit Master Title Style
Các thao tác trên Stack
Push(o): Thêm i tng o vào Stack
Pop(): Ly i tng t Stack
isEmpty(): Kim tra Stack có rng hay không
Top(): Tr v giá tr ca phn t nm u Stack mà không hy nó khi Stack.
Cu trúc d liu và thut gii
CU TRÚC D LIU VÀ GII THUT 1
Click To Edit Master Title Style
Cài t Stack
Data S [N];
6
5
1
8
2
4
S
1.unknown
CU TRÚC D LIU VÀ GII THUT 1
Click To Edit Master Title Style
Cài Stack bng mng 1 chiu
Cu trúc d liu ca Stack
typedef struct tagStack
CU TRÚC D LIU VÀ GII THUT 1
Click To Edit Master Title Style
Kim tra tính rng và y ca Stack
int IsEmpty(Stack s)//Stack có rng hay không
{
{
CU TRÚC D LIU VÀ GII THUT 1
Click To Edit Master Title Style
Thêm 1 phn t vào Stack
int Push(Stack &s, int x)
{
CU TRÚC D LIU VÀ GII THUT 1
Click To Edit Master Title Style
Ly 1 phn t t Stack
int Pop(Stack &s, int &x)
{
CU TRÚC D LIU VÀ GII THUT 1
Click To Edit Master Title Style
Stack (hàm main)
tv=Pop(s,x);
}
CU TRÚC D LIU VÀ GII THUT 1
Click To Edit Master Title Style
Cài Stack bng danh sách liên kt
Kim tra tính rng ca Stack
int IsEmpty(List &s)
CU TRÚC D LIU VÀ GII THUT 1
Click To Edit Master Title Style
Thêm 1 phn t vào Stack
void Push(List &s, Node *Tam)
{
CU TRÚC D LIU VÀ GII THUT 1
Click To Edit Master Title Style
Ly 1 phn t t Stack
int Pop(List &s,int &trave)
CU TRÚC D LIU VÀ GII THUT 1
Click To Edit Master Title Style
Stack (hàm main)
}
CU TRÚC D LIU VÀ GII THUT 1
Click To Edit Master Title Style
Các thao tác trên Queue
EnQueue(O): Thêm i tng O vào cui hàng i.
DeQueue(): Ly i tng u hàng i
isEmpty(): Kim tra xem hàng i có rng hay không?
Front(): Tr v giá tr ca phn t nm u hàng i mà không hy nó.
Cu trúc d liu và thut gii
CU TRÚC D LIU VÀ GII THUT 1
Click To Edit Master Title Style
Cài t Queue
pHead
pTail
6
5
1
8
2
4
CU TRÚC D LIU VÀ GII THUT 1
Click To Edit Master Title Style
Cài t Queue bng mng 1 chiu
Cu trúc d liu:
int Front; //ch s ca phn t u trong Queue
int Rear; //ch s ca ph t cui trong Queue
}Queue;
CU TRÚC D LIU VÀ GII THUT 1
Click To Edit Master Title Style
Ly 1 phn t t Queue
int DeQueue(Queue &q,int &x)
{
CU TRÚC D LIU VÀ GII THUT 1
Click To Edit Master Title Style
Thêm 1 phn t vào Queue
int EnQueue(Queue &q,int x)
{ int i;
int f,r;
if(q.Rear-q.Front+1==max)//queue bi day khong the them vao duoc nua
return 0;
CU TRÚC D LIU VÀ GII THUT 1
Click To Edit Master Title Style
Thêm 1 phn t vào Queue (tt)
if(q.Rear==max-1)//Queue y o
CU TRÚC D LIU VÀ GII THUT 1
Click To Edit Master Title Style
Queue (hàm main())
}
CU TRÚC D LIU VÀ GII THUT 1
Click To Edit Master Title Style
Cài t Queue bng List
Kim tra Queue có rng?
int IsEmpty(List &Q)
CU TRÚC D LIU VÀ GII THUT 1
Click To Edit Master Title Style
Thêm 1 phn t vào Queue
void EnQueue(List &Q, Node *Tam)
{
CU TRÚC D LIU VÀ GII THUT 1
Click To Edit Master Title Style
Ly 1 phn t t Queue
int DeQueue(List &Q,int &X)
CU TRÚC D LIU VÀ GII THUT 1
Click To Edit Master Title Style
Queue (hàm main())
}