cài đ t hàng đ i b ng danh sách liên k t, ta c ng s d ng 1 danh sách liên k t đ n và 2 con tr head và tail l u gi nút đ u và nút cu i c a danh sách. Vi c b sung ph n t m i s đ c ti n hành cu i danh sách và vi c l y ph n t ra s đ c ti n hành đ u danh sách.
Hình 4.4 Cài đ t hàng đ i b ng danh sách liên k t Khai báo 1 hàng đ i b ng danh sách liên k t nh sau:
struct node { int item;
struct node *next; };
typedef struct node *queuenode; typedef struct {
queuenode head; queuenode tail; }queue;
Khai báo t ng t nh ng n x p, tuy nhiên, hàng đ i s d ng 2 bi n là hea và tail đ l u gi đi m đ u và đi m cu i c a hàng. Khi đó, các thao tác trên hàng đ i đ c cài đ t nh sau:
Thao tác kh i t o hàng đ i
Thao tác này th c hi n vi c gán giá tr null cho nút đ u và cu i c a hàng đ i, cho bi t hàng
đ i đang tr ng thái r ng.
void QueueInitialize(queue *q){ q-> head = q-> tail = NULL; return;
}
Thao tác ki m tra hàng đ i r ng
Hàng đ i r ng n u nút đ u tr đ n NULL. int QueueEmpty(queue q){
return (q.head == NULL); }
Thao tác thêm 1 ph n t vào hàng đ i
void Put(queue *q, int x){ queuenode p;
p = (queuenode) malloc (sizeof(struct node)); p-> item = x;
p-> next = NULL; q-> tail-> next = p;
q-> tail = q-> tail-> next;
NULL
head
…
if (q-> head == NULL) q-> head = q-> tail; return;
}
thêm ph n t vào cu i hàng đ i, t o và c p phát b nh cho 1 nút m i. Gán giá tr thích h p cho nút này, sau đó cho con tr ti p c a nút cu i hàng đ i tr đ n nó. Nút này bây gi tr thành nút cu i c a hàng đ i. N u hàng đ i ch a có ph n t nào thì nó c ng chính là nút đ u c a hàng đ i.
L y ph n t ra kh i hàng đ i
l y ph n t ra kh i hàng đ i, ti n hành l y ph n t t i v trí nút đ u và cho nút đ u chuy n v nút k ti p. Tuy nhiên, tr c khi làm các thao tác này, ta ph i ki m tra xem hàng đ i có r ng hay không.
int Get(queue *q){ queuenode p;
if (QueueEmpty(*q)){
printf("Ngan xep rong !"); return 0;
}else{
p = q-> head;
q-> head = q-> head-> next; return p->item;
} }