Danh sách liên kt kép

Một phần của tài liệu Tài liệu Bài giảng " kỹ thuật lập trình " pdf (Trang 68 - 78)

M i khi thao tác trên danh sách, vi c duy t danh sách theo c hai chi u t ra thu n ti n h n cho ng i s d ng. ôi khi chúng ta ph i di chuy n trong danh sách t node cu i lên node đ u ho c ng c l i b ng cách đi qua m t lo t các con tr . i u này có th d dàng gi i quy t đ c n u ta t ng thông tin ch a t i t ng đnh c a danh sách. Ngoài con tr ch a đa ch đnh ti p theo, ta thêm con tr tr c đ ch a đa ch đ ng sau đnh này. Làm nh v y, chúng ta thu đ c m t c u trúc d li u m i g i là danh sách liên k t kép.

struct node {

int infor;

struct node *right;// con tr t i node sau struct node *left; // con tr t i node k ti p };

Hình 3.8. Mô t m t danh sách liên k t kép.

Các thao tác trên danh sách liên k t kép c ng t ng t nh danh sách liên k t đ n. Nh ng c n chú ý r ng, m i node p c a danh sách liên k t kép có hai đ ng liên k t là p-> left và p->right;

Thao tác thêm node m i vào đ u danh sách liên k t kép:

X C p phát b nh cho node m i; X Gán giá tr thích h p cho node m i; X Thi t l p liên k t cho node m i; void Push_Top(NODEPTR *plist, int x){

NODEPTR p;

p = Getnode(); //c p phát b nh cho node p ->infor = x; //gán giá tr thích h p; p -> right = *plist; // thi t l p liên k t ph i (*plist) ->left = p; // thi t liên k t v i *plist p-> left = NULL;// thi t l p liên k t trái *plist = p;

}

Thao tác thêm node vào cu i danh sách:

X N u danh sách r ng thì thao tác này trùng v i thao tác thêm node m i vào đ u danh sách.

X N u danh sách không r ng chúng ta th c hi n nh sau: ̇ C p phát b nh cho node;

̇ Gán giá tr thích h p cho node;

̇ Chuy n con tr t i node cu i trong danh sách; ̇ Thi t l p liên k t trái;

̇ Thi t l p liên k t ph i; void Push_Bottom(NODEPTR *plist, int x){

NODEPTR p, q; if (*plist ==NULL)

Push_Top(plist, x); else {

p= Getnode();// c p phát b nh cho node p->infor =x; //gán giá tr thích h p //chuy n con tr t i node cu i danh sách

L I R L I R L I R

q = *plist;

while (q->right!=NULL) q = q->right;

//q là node cu i cùng trong danh sách q -> right =p; // liên k t ph i

p->left = q; // liên k t trái p->right =NULL; //liên k t ph i }

}

Thêm node vào tr c node p:

Mu n thêm node vào tr c node p thì node p ph i t n t i trong danh sách. N u node p t n t i thì có th x y ra hai tr ng h p: ho c node p là node cu i cùng c a danh sách ho c node p là node ch a ph i là cu i cùng. Tr ng h p th nh t ng v i thao tác Push_Bottom. Tr ng h p th hai, chúng ta làm nh sau:

X C p phát b nh cho node; X Gán giá tr thích h p;

X Thi t l p liên k t trái cho node m i; X Thi t l p liên k t ph i cho node m i; Quá trình đ c mô t b i th t c sau:

void Push_Before(NODEPTR p, int x){ NODEPTR q; (adsbygoogle = window.adsbygoogle || []).push({});

if (p==NULL) return; //không làm gì else if (p->next==NULL)

Push_Bottom(p, x); else {

q = Getnode(); // c p phát b nh cho node m i q ->infor = x; //gán giá tr thông tin thích h p q ->right = p->right; //thi t l p liên k t ph i (p ->right) ->left =q;

q -> left = p; //thi t l p liên k t trái p ->right = q; } } Lo i b node đ u danh sách: X N u danh sách r ng thì không c n lo i b ; X Dùng node p tr t i đ u danh sách; X Chuy n g c lên node k ti p;

X Lo i b liên k t v i node p; X Gi i phóng p;

void Del_Top(NODEPTR *plist){ NODEPTR p;

if ( (*plist)==NULL) return; //không làm gì p = *plist; //p là node đ u tiên trong danh sách

(*plist) = (*plist) -> right; // chuy n node g c t i node k ti p p ->right =NULL; // ng t liên k t ph i c a p;

(*plist) ->left ==NULL;//ng t liên k t trái v i p Freenode(p); //gi i phóng p

}

Lo i b node cu i danh sách:

X N u danh sách r ng thì không c n lo i b ;

X N u danh sách có m t node thì nó là tru ng h p lo i ph n t đ u danh sách;

X N u danh sách có nhi u h n m t node thì: ̇ Chuy n con tr t i node cu i cùng; ̇ Ng t liên k t trái c a node;

̇ Ng t liên k t ph i c a node; ̇ Gi i phóng node.

void Del_Bottom(NODEPTR *plist) { NODEPTR p, q;

if ((*plist)==NULL) return; //không làm gì else if ( (*plist) ->right==NULL) Del_Top(plist); else {

p = *plist; // chuy n con tr t i node cu i danh sách while (p->right!=NULL)

p =p->right;

// p là node cu i c a danh sách q = p ->left; //q là node sau p;

q ->right =NULL; //ng t liên k t ph i c a q p -> left = NULL; //ng t liên k t trái c a p Freenode(p); //gi i phóng p

} }

Lo i node tr c node p

X N u node p là node cu i thì c ng không th lo i b ; X Tr ng h p còn l i đ c th c hi n nh sau:

̇ Ng t liên k t trái v i node p đ ng th i thi t l p liên k t ph i v i node (påright)åright;

̇ Ng t liên k t ph i v i node p đ ng th i thi t l p liên k t trái v i node (påright)åright;

̇ Gi i phóng node påright. void Del_Before(NODEPTR p){

NODEPTR q, r;

if (p==NULL || p->right==NULL) return; /*không làm gì

n u node p là không có th c ho c là node cu i cùng */ q = (p->right)->right; //q là node tr c node p ->right r = p->right; // r là node c n lo i b (adsbygoogle = window.adsbygoogle || []).push({});

r -> left =NULL; //ng t liên k t trái c a r r->right ==NULL;//ng t liên k t ph i c a r p->right =q; //thi t l p liên k t ph i m i cho p q ->left = p; // thi t l p liên k t trái m i cho p Freenode(r); //gi i phóng node

NH NG N I DUNG C N GHI NH

X Các ph ng pháp đnh ngh a stack, khi nào dùng stack & vai trò c a stack đ i v i các gi i thu t đ qui.

X Ph ng pháp đnh ngh a hàng đ i, các thao tác trên hàng đ i và ng d ng c a hàng đ i.

X B n ch t đ ng là tính ch t c b n nh t c a danh sách liên k t đ n và liên k t kép. X S khác bi t c b n c a danh sách liên k t đ n và danh sách liên k t kép là các

con tr left và right.

X Nh ng ng d ng l n th ng đ c cài đ t trên các c u trúc d li u đ ng. X Chú ý gi i phóng b nh cho con tr trong khi l p trình.

BÀI T P CH NG 3

Bài 1. Xâu thu n ngh ch đ c là xâu bít nh phân có đ dài n mà khi đ o xâu ta v n nh n đ c chính xâu đó. Hãy li t kê t t c các xâu thu n ngh ch đ c có đ dài n và ghi l i nh ng xâu đó vào File thuang.out theo t ng dòng, dòng đ u tiên ghi l i giá tr c a n, các dòng ti p theo là nh ng xâu thu n ngh ch đ c có đ dài n. Ví d : v i n=4, ta có đ c nh ng xâu thu n ngh ch đ c có d ng sau:

4

0 0 0 0

0 1 1 0

1 0 0 1

1 1 1 1

Bài 2. Vi t ch ng trình qu n lý đi m thi c a sinh viên b ng single (double) link list bao g m nh ng thao tác sau: - Nh p d li u; - Hi n th d li u theo l p, x p lo i . . .; - S p x p d li u; - Tìm ki m d li u; - In n k t qu .

Trong đó, thông tin v m i sinh viên đ c đnh ngh a thông qua c u trúc sau: typedef struct {

int masv; // mã sinh viên; char malop[12]; //mã l p char hoten[30]; //h tên sinh viên float diemki; // đi m t ng k t k 1 float diemkii;// đi m t ng k t k 2 float diemtk; // đi m t ng k t c n m char xeploai[12]; // x p lo i } sinhvien;

Bài 3. Bi u di n bi u th c theo cú pháp Ba Lan. Bi u th c nguyên là m t dãy đ c thành l p t các bi n ki u nguyên n i v i nhau b ng các phép toán hai ngôi ( c ng: + , tr : - , nhân : *) và các d u m ngo c đ n ‘(‘, đóng ngo c đ n ‘)’. Nguyên t c đ t tên bi n và th t th c hi n các phép toán đ c th c hi n nh sau:

- Qui t c đ t tên bi n: Là dãy các kí t ch in th ng ho c kí t s đ dài không quá 8, kí t b t đ u ph i là m t ch cái.

- Qui t c th c hi n phép toán: Bi u th c trong ngo c đ n đ c tính tr c, phép toán nhân ‘*’ có đ u tiên cao h n so v i hai phép toán c ng và tr . Hai phép toán c ng ‘+’ và tr có cùng đ u tiên. Ví d : a * b + c ph i đ c hi u là: (a * b) + c.

D ng vi t không ngo c Ba Lan cho bi u th c nguyên đ c đnh ngh a nh sau:

- N u e là tên bi n thì d ng vi t Ba Lan c a nó chính là e, - N u e1 và e2 là hai bi u th c có d ng vi t Ba Lan t ng ng là d1 và d2 thì d ng vi t Ba Lan c a e1 + e2 là d1 d2+, c a e1 - e2 là d1 d2-, c a e1*e2 là d1 d2* ( Gi a d1 và d2 có đúng m t d u cách, tr c d u phép toán không có d u cách), - N u e là bi u th c có d ng vi t Ba Lan là d thì d ng vi t Ba Lan c a bi u th c có ngo c đ n (e) chính là d ( không còn d u ngo c n a) . Ví d : Bi u th c (c+b*(f-d)) có d ng vi t Ba Lan là : c b f d-*+.

Cho file d li u balan.in đ c t ch c thành t ng dòng, m i dòng không dài quá 80 ký t là bi u di n c a bi u th c nguyên A. Hãy d ch các bi u th c nguyên A thành d ng vi t Ba Lan c a A ghi vào file balan.out theo t ng dòng. Ví d : v i file balan.in d i đây s cho ta k t qu nh sau: balan.in balan.out a+b a b+ a-b a b- a*b a b* (a - b) +c a b- c+ (a + b) * c a b+ c* (a + (b-c)) a b c-+ ( a + b*(c-d)) a b c d-*+ ( (a + b) *c- ( d + e) * f) a b+c* d e+f*-

Bài 4. Tính toán giá tr bi u th c Ba Lan. Cho file d li u balan.in g m 2 * n dòng trong đó, dòng có s th t l (1, 3, 5, . . ) ghi l i m t xâu là bi u di n Ba Lan c a bi u th c nguyên A, dòng có s th t ch n (2,4,6, . .) ghi l i giá tr c a các bi n xu t hi n trong A. Hãy tính giá tr c a bi u th c A, ghi l i giá tr c a A vào file balan.out t ng dòng theo th t : Dòng có th t l ghi l i bi u th c Ba Lan c a A sau khi đã thay th các giá tr t ng ng c a bi n trong A, dòng có th t ch n ghi l i giá tr c a bi u th c A.

Ví d v i file balan.in d i đây s cho ta k t qu nh sau: balan.in balan.out

3 5 8 a b- 7 3- 7 3 4 a b* 4 3 * 4 3 12 c a b-+ 3 4 5-+ 3 4 5 2

Bài 5. L p l ch v i m c đ u tiên. l p l ch cho CPU đáp ng cho các quá trình đang đ i c a h th ng, ng i ta bi u di n m i quá trình b ng m t b n ghi bao g m nh ng thông tin : s quá trình(Num) là m t s t nhiên nh h n 1024, tên quá trình (Proc) là m t xâu ký t đ dài không quá 32 không ch a d u tr ng gi a, đ u tiên quá trình là m t s nguyên d ng (Pri) nh h n 10, th i gian th c hi n c a quá trình (Time) là m t s th c. Các quá trình đang đ i trong h đ c CPU đáp ng thông qua m t hàng đ i đ c g i là hàng đ i các quá trình, hàng đ i các quá trình v i đ u tiên đ c xây d ng sao cho nh ng đi u ki n sau đ c tho mãn:

- Các quá trình đ c s p theo th t u tiên;

- i v i nh ng quá trình có cùng đ u tiên thì quá trình nào có th i gian th c hi n ít nh t đ c x p lên tr c nh t.

Cho file d li u lich.in đ c t ch c nh sau: (adsbygoogle = window.adsbygoogle || []).push({});

- Dòng đ u tiên ghi l i m t s t nhiên n là s các quá trình;

- n dòng k ti p, m i dòng ghi l i thông tin v m t quá trình đang đ i. Hãy xây d ng hàng đ i các quá trình v i đ u tiên. Ghi l i th t các quá trình mà CPU đáp ng trên m t dòng c a file lich.out, m i quá trình đ c phân bi t v i nhau b i m t ho c vài ký t tr ng, dòng k ti p ghi l i s gi c n thi t mà CPU c n đáp ng cho các quá trình. Ví d v i file lich.in d i đây s cho ta k t qu nh sau:

lich.in 7 1 Data_Processing 1 10 2 Editor_Program 1 20 3 System_Call 3 0.5 4 System_Interative 3 1 5 System_Action 3 2 6 Writing_Data 2 20 7 Reading_Data 2 10

lich.out

3 4 5 7 6 1 2 63.5

Bài 6. Thu t toán RR (Round Robin): Thu t toán SJF đáp ng đ c t i đa các quá trình ho t đ ng trong h , tuy nhiên s có nhi u quá trình có chi phí th i gian l n ph i đ i nhi u quá trình có chi phí th i gian nh th c hi n. V i thu t toán SJF , tính công b ng c a h b vi ph m. kh c ph c đi u trên, thu t toán Round Robin th c hi n ch n m t l ng t th i gian thích h p, sau đó đáp ng cho m i quá trình theo t ng vòng v i l ng t th i gian đã ch n. u đi m c a RR là tính công b ng c a h đ c đ m b o, s các quá trình đ c CPU đáp ng trên m t đ n v th i gian ch p nh n đ c. Nh c đi m l n nh t c a thu t toán là vi c l a ch n l ng t th i gian đáp ng cho m i quá trình sao cho t i u không ph i là đ n gi n. Hãy vi t ch ng trình mô ph ng thu t toán l p l ch RR.

CH姶愛NG 4: CU TRÚC D LIU CÂY (TREE)

Cây là m t trong nh ng c u trúc d li u r i r c có ng d ng quan tr ng trong bi u di n tính toán, bi u di n tri th c & bi u di n các đ i t ng d li u ph c t p. Tr ng tâm chính c a ch ng này nh m cung c p cho b n đ c nh ng khái ni m và thao tác c b n trên cây nh phân, bao g m:

X Khái ni m v cây, cây nh phân, cây nh phân tìm ki m.

X Khái ni m node g c (root), node lá (leaf), m c (level) & đ sâu c a cây. X Ph ng pháp bi u di n và các thao tác trên cây nh phân.

X Các thao tác duy t cây: duy t theo th t tr c, duy t theo th t gi a & duy t theo th t sau.

X Ph ng pháp bi u di n và các thao tác trên cây nh phân tìm ki m.

B n đ c có th tìm hi u sâu h n v cây nhi u nhánh, cây cân b ng và cây nh phân hoàn toàn cân b ng trong tài li u [1].

Một phần của tài liệu Tài liệu Bài giảng " kỹ thuật lập trình " pdf (Trang 68 - 78)