You are on page 1of 92

CC KIU D LIU TRU TNG C BN

CU TRC D LIU TUYN TNH

Thanh Ngh
dtnghi@cit.ctu.edu.vn

NI DUNG
DANH SCH
NGN XP
HNG I

DANH SCH
KHI NIM V DANH SCH
CC PHP TON
CI T

DNG MNG (DS C)


DNG CON TR (DS LIN KT)

KHI NIM V DANH SCH


L tp hp hu hn cc phn t c cng kiu
Kiu chung c gi l kiu phn t (element
type)
Ta thng biu din dng: a1, a2, a3, ..., an
Nu
n=0: danh sch rng
n>0: phn t u tin l a1, phn t cui cng l an

di ca danh sch: s phn t ca danh


sch
Cc phn t trong danh sch c th t tuyn
tnh theo v tr xut hin. Ta ni ai ng trc
ai+1 (i=1..n-1)
4

CC PHP TON (1)


Tn php ton
ENDLIST(L)

Cng dng
Tr v v tr sau phn t cui trong ds L

MAKENULL_LIST(L)

Khi to mt danh sch L rng

EMPTY_LIST(L)

Kim tra xem danh sch L c rng hay


khng
Kim tra xem danh sch L c y hay
khng
Xen phn t c ni dung X vo danh
sch L ti v tr P
Xa phn t ti v tr P trong danh sch
L
Tr v kt qu l v tr ca phn t c
ni dung X trong danh sch L
Nu khng tm thy: tr v ENDLIST(L)

FULL_LIST(L)
INSERT_LIST(X,P,L)
DELETE_LIST(P,L)
LOCATE_LIST(X,L)

CC PHP TON (2)


RETRIEVE(P,L)

Tr v ni dung phn t th P trong


danh sch L

NEXT(P,L)

Tr v phn t ng sau phn t th


P trong danh sch L

PREVIOUS(P,L)

Tr v phn t ng trc phn t


th P trong danh sch L

FIRST(L)

Tr v kt qu l v tr ca phn t
u danh sch, ENDLIST(L) nu danh
sch rng

PRINT_LIST(L)

Hin th cc phn t trong danh sch


L theo th t xut hin

CI T DANH SCH BNG MNG


(DS C)
Dng 1 mng lu tr lin tip cc phn t, bt u
t v tr u tin
Ta phi c lng s phn t ti a ca danh sch
Ta phi lu tr di hin ti ca danh sch (Last)

M HNH
1
2

V tr

Ta nh ngha v tr ca mt phn t trong danh


sch l ch s ca mng ti v tr lu tr phn
t + 1
8

KHAI BO
#define MaxLength // di ti a ds
typedef ... ElementType; //kiu ca pht
typedef int Position; //kiu v tr
typedef struct {
//mng cha cc phn t ca danh sch
ElementType Elements[MaxLength];
Position Last; //gi di danh sch
} List;
List L;

KHI TO DANH SCH RNG

Cho di danh sch bng 0


void MakeNull_List(List *L) {
L->Last=0;
}
10

KIM TRA DANH SCH RNG


Xem di danh sch c bng 0
khng?
int Empty_List(List L) {
return L.Last==0;
}

Xem danh sch c full khng?


int Full_List(List L) {
return L.Last==MaxLength;
}
11

TM KIM PHN T X TRONG DS(1)


Position First(List L) {
return 1;
}
Position EndList(List L) {
return L.Last + 1;
A}
BPosition Next(Position P, List L) {
return P + 1;
C}
D
EElementType Retrieve(Position P, List L) {
return L.Elements[P-1];
F}
G
12

XEN PHN T X VO V TR P (1)


Xen phn t x=k vo v tr p=3 trong danh sch L
(ch s 2 trong mng)

13

XEN PHN T X VO V TR P (2)


Tm li, chn x vo v tr p ca L, ta lm nh sau:

Nu mng y th thng bo li
Ngc li, nu v tr p khng hp l th bo
li
Ngc li:
Di cc phn t t v tr p n cui danh sch
ra sau mt v tr
a phn t mi x vo ti v tr p
di danh sch tng 1

14

XEN PHN T X VO V TR P (3)


void Insert_List(ElementType X,Position P, List *L) {
if (L->Last==MaxLength)
printf("Danh sach day");
else if ((P<1) || (P>L->Last+1))
printf("Vi tri khong hop le");
else {
Position Q;
/*Di cc pht t v tr p n cui dsch ra
sau 1 v tr*/
for(Q=(L->Last-1)+1;Q>=P;Q--)
L->Elements[Q]=L->Elements[Q-1];
//a x vo v tr p
L->Elements[P-1]=X;
//Tng di danh sch ln 1
L->Last++;
}
}

15

XA MT PHN T TI V TR P TRONG DS (1)


V d: Xa phn t v tr p=4 ca L

16

XA MT PHN T TI V TR P TRONG DS (2)


Nu p l mt v tr khng hp l th thng bo li
Ngc li:

Di di cc phn t t v tr p+1 n cui


danh sch ra trc mt v tr
di ca danh sch gim 1

17

XA MT PHN T TI V TR P TRONG DS (3)


void Delete_List(Position P,List *L) {
if ((P<1) || (P>L->Last))
printf("Vi tri khong hop le");
else if (Empty_List(*L))
printf("Danh sach rong!");
else {
Position Q;
/*Di cc pht t v tr p+1 n cui
danh sch ra trc 1 v tr*/
for(Q=P-1;Q<L->Last-1;Q++)
L->Elements[Q]=L->Elements[Q+1];
L->Last--;
}
}

18

TM KIM PHN T X TRONG DS(1)

tm phn t x trong danh sch ta tin hnh


tm t u danh sch cho n khi tm gp
Nu gp th v tr ca phn t u tin tm thy
c tr v
Nu khng tm gp th tr v v tr
Last+1(EndList)
19

TM KIM PHN T X TRONG DS(1)


Position Locate(ElementType X, List L) {
Position P;
int Found = 0;
P = First(L); //v tr phn t u tin
/*trong khi cha tm thy v cha kt thc
danh sch th xt phn t k tip*/
while ((P != EndList(L)) && (Found == 0))
if (Retrieve(P,L) == X) Found = 1;
else P = Next(P, L);
return P;
}
20

NH GI GII THUT TM KIM


Thi gian tm kim

nhanh nht (tt nht) l khi no, x u?


xu nht khi no?
phc tp ca gii thut thng c xc nh l
trong trng hp xu nht O(n)

21

CC PHP TON KHC (1)


Xc nh v tr sau phn t cui trong danh
sch
Position EndList(List L) {
return L.Last+1;
}

Xc nh v tr u tin trong danh sch


Position First(List L) {
return 1;
}

22

CC PHP TON KHC (2)


c ni dung phn t ti v tr P trong dsch
ElementType Retrieve(Position P, List L) {
return L.Elements[P-1];
}

Xc nh v tr k tip trong danh sch


Position Next(Position P, List L) {
return P+1;
}

23

BI TP

Vn dng cc php ton trn danh sch c vit


chng trnh nhp vo mt danh sch cc s
nguyn v hin th danh sch va nhp ra mn
hnh.

Thm phn t c ni dung x vo danh sch ti v tr


p (trong x v p c nhp t bn phm).

Xa phn t u tin c ni dung x (nhp t bn


phm) ra khi danh sch.

Tnh gi tr trung bnh

m c bao nhiu phn t trn trung bnh

Tnh lch chun


24

NHP DANH SCH T BN PHM


void ReadList(List *L) {
int i,N;
ElementType X;
MakeNull_List(L);
printf("So phan tu danh sach N= ");scanf("%d",&N);
for(i=1; i<=N; i++) {
printf("Phan tu thu %d: ",i);scanf("%d",&X);
Insert_List(X, EndList(*L), L);
}
}

25

HIN TH DANH SCH RA MN HNH


void PrintList(List L) {
Position P;
P = First(L);
while (P != EndList(L)) {
printf("%d ",Retrieve(P,L));
P = Next(P, L);
}
printf("\n");
}

26

CI T DANH SCH BNG CON TR


M hnh

Ni kt cc phn t lin tip nhau bng con tr


Phn t ai tr ti phn t ai+1
Phn t an tr ti phn t c bit NULL
Phn t header tr ti phn t u tin a1

Khai bo
typedef ... ElementType; //kiu ca phn t trong danh sch
typedef struct Node* NodeType;
struct Node {
ElementType Element;
NodeType Next;
};
typedef NodeType Position;
typedef Position List;

//Cha ni dung ca phn t


//con tr ch n phn t k tip
//Kiu v tr

27

KHI TO DANH SCH RNG

=>Cp pht vng nh cho Header v cho trng


Next ca Header tr n NULL
void MakeNull_List(List *Header) {
(*Header)=(NodeType)malloc(sizeof(struct Node));
(*Header)->Next= NULL;
}

28

KIM TRA DANH SCH RNG


Xem trng Next ca Header c tr n NULL hay
khng?
int Empty_List(List L) {
return (L->Next==NULL);
}

29

XEN MT PHN T VO DANH SCH

xen phn t x vo v tr p ca L, ta lm nh sau:


Cp pht 1 mi lu tr phn t x
Ni kt li cc con tr a mi ny vo v tr p

void Insert_List(ElementType X, Position P, List *L) {


Position T;
T=(NodeType)malloc(sizeof(struct Node));
T->Element=X;
T->Next=P->Next;
P->Next=T;
}

30

XA MT PHN T KHI DANH SCH

=>Mun xa phn t v tr p trong danh sch ta cn ni kt li cc


con tr bng cch cho p tr ti phn t ng sau phn t th p
void Delete_List(Position P, List *L) {
Position Temp;
if (P->Next!=NULL) {
/*gi cha phn t b xo thu hi vng nh*/

Temp=P->Next;
/*ni kt con tr tr ti phn t ke tiep*/

P->Next=Temp->Next;
free(Temp); //thu hi vng nh
}
}

31

TM KIM MT PHN T TRONG DANH SCH


tm phn t x trong danh sch ta tm t u danh
sch:
Nu tm gp th v tr phn t u tin bng x c tr v
(p) v ta c p->next->element = x
Nu khng gp th v tr ENDLIST c tr v
Position Locate(ElementType X, List L) {
Position P;
int Found = 0;
P = L;
while ((P->Next != NULL) && (Found == 0))
if (P->Next->Element == X) Found = 1;
else P = P->Next;
return P;
}

32

C NI DUNG PHN T
ElementType Retrieve(Position P, List L) {
if (P->Next!=NULL)
return P->Next->Element;
}

33

XC NH V TR PHN T
V tr phn t u tin
Position First(List L) {
return L;
}

V tr phn t cui cng


Position EndList(List L) {
Position P;
P=First(L);
while (P->Next!=NULL) P=P->Next;
return P;
}

V tr phn t k tip
Position Next(Position P, List L) {
return P->Next;
}

34

IN DANH SCH RA MN HNH


void PrintList(List L) {
Position P;
P = First(L);
while (P != EndList(L)) {
ElementType data;
data = Retrieve(P,L);
printf("....", data...);
P = Next(P, L);
}
printf("\n");
}

35

BI TP
Vn dng cc php ton trn danh sch lin kt vit
chng trnh:

Nhp vo mt danh sch cc s nguyn


Hin th danh sch va nhp ra mn hnh
Thm phn t c ni dung x vo danh sch
ti v tr p (trong x v p c nhp t
bn phm)
Xa phn t u tin c ni dung x (nhp
t bn phm) ra khi danh sch

36

SO SNH 2 PHNG PHP


CI T DS
Bn hy phn tch u v khuyt im ca

Danh sch c
Danh sch lin kt
Bn nn chn pp ci t no cho ng dng ca mnh?

37

CI T DANH SCH BNG CON TR GI


Mt s ngn ng lp trnh khng h tr kiu con tr
Ci t danh sch lin kt bng con tr gi
tng l dng mng lu tr, cc con tr gi l cc ch
s mng ca phn t tip theo trong danh sch
Khai bo
#define MaxLength ...
//Chieu dai mang
#define Null -1
//Gia tri Null
typedef ... ElementType; //kiu ca cc phn t trong ds
typedef struct {
ElementType Elements; //trng cha phn t trong ds
int Next;
//con tr gi n phn t k tip
} Node;
Node Space[MaxLength]; //Mang toan cuc
int Available;
38

CI T DANH SCH BNG CON TR GI


Khi to cu trc Thit lp available ban u
void Initialize() {
int i;
for(i=0; i<MaxLength-1; i++)
Space[i].Next=i+1;
Space[MaxLength-1].Next=Null;
Available=0;
}

39

CI T DANH SCH BNG CON TR GI


Thm mt phn t vo danh sch L ti v tr p no ta phi
chuyn mt t Available (tc l mt trng) vo L ti v tr p;
Xo mt phn t ti v tr p no trong danh sch L, ta chuyn
cha phn t sang Available, thao tc ny xem nh l gii
phng b nh b chim bi phn t ny.
Chuyn 1 t con tr p ny sang danh sch c tr bi q
int Move(int *p, int *q) {
int temp;
if (*p==Null)
return 0; //Khong co o de chuyen
else {
temp=*q;
*q=*p;
*p=Space[*q].Next;
Space[*q].Next=temp;
return 1; //Chuyen thanh cong
}
}

40

CI T DANH SCH BNG CON TR GI


Thm phn t vo v tr p ca danh sch L, ta chuyn
u ca available vo v tr ny. Ch rng v tr ca
phn t u tin trong danh sch c nh ngha l -1,
do nu p=-1 c ngha l thc hin vic thm vo
u danh sch.
void Insert_List(ElementType X, int P, int *L) {
if (P==-1) {
//Xen dau danh sach
if (Move(&Available, L))
Space[*L].Elements=X;
else printf("Loi! Khong con bo nho trong");
}
else {
//Chuyen mot o tu Available vao vi tri P

}
}

if (Move(&Available,&Space[P].Next))
// O nhan X la o tro boi Space[p].Next
Space[Space[P].Next].Elements=X;
else printf("Loi! Khong con vung nho trong");

41

CI T DANH SCH BNG CON TR GI


Xa phn t ngay v tr p ra khi danh sch L, chuyn cha phn
t ti v tr ny vo u Available. Tng t nh php thm vo,
nu p=-1 th xo phn t u danh sch

void Delete_List(int p, int *L) {


if (p==-1) {//Neu la o dau tien
if (!Move(L,&Available))
printf("Loi trong khi xoa");
}
else
if (!Move(&Space[p].Next,&Available))
printf("Loi trong khi xoa");
}

42

NGN XP (STACK)
NH NGHA
CC PHP TON
CI T

CI T BNG DANH SCH LIN KT


CI T BNG MNG

43

NH NGHA
L mt dng danh sch c bit m vic thm vo
hay xa phn t ch thc hin ti mt u gi l nh
ca ngn xp
Cch lm vic theo dng FILO(First In Last Out) hay
LIFO (Last In First Out)

44

CC PHP TON
Php ton

Din gii

MAKENULL(S)

To mt ngn xp rng (S)

EMPTY(S)

Kim tra xem ngn xp S c rng hay


khng
Kim tra xem ngn xp S c y hay khng

FULL(S)
PUSH(X,S)

Thm phn t X vo nh ngn xp S.


Tng ng: INSERT(X,FIRST(S),S)

POP(S)

Xa phn t ti nh ngn xp S.
Tng ng: DELETE(FIRST(S),S)
Tr v phn t trn nh ngn xp S, tng
ng: RETRIEVE(FIRST(S),S)

TOP(S)

45

CI T NGN XP BNG DSLK

Khai bo
typedef List Stack;

To ngn xp rng
void MakeNull_Stack(Stack *S)
{ MakeNull_List(S);}

Kim tra ngn xp rng


int Empty_Stack(Stack S)
{ return Empty_List(S);}

Thm phn t vo ngn xp


void Push(ElementType X, Stack *S)
{ Insert_List (X, First (*S), S);}

Xa phn t ra khi ngn xp


void Pop (Stack *S)
{ Delete_List (First (*S), S);}

46

CI T NGN XP BNG MNG (1)

Khai bo
#define MaxLength // di ca mng
typedef ElementType;//kiu phn t ca ngn xp
typedef struct {
//Lu ni dung ca cc phn t
ElementType Elements[MaxLength];
int Top_idx; //gi v tr nh ngn xp
} Stack;
Stack S;

47

KHI TO NGN XP RNG

Khi ngn xp S rng ta cho nh ngn xp


c khi to bng Maxlength
void MakeNull_Stack(Stack *S)
S->Top_idx=MaxLength;

}
48

KIM TRA NGN XP RNG?


Ta kim tra xem nh ngn xp c bng
MaxLength khng?
int Empty_Stack(Stack S) {
return S.Top_idx==MaxLength;
}

49

KIM TRA NGN XP Y?

Ta kim tra xem Top_idx c ch vo 0 hay khng?


int Full_Stack(Stack S) {
return S.Top_idx==0;
}

50

TR V PHN T U NGN XP

Gii thut :
Nu ngn xp rng th thng bo li
Ngc li, tr v gi tr c lu tr ti c ch s l Top_idx
ElementType Top(Stack S) {
if (!Empty_Stack(S))
return S.Elements[S.Top_idx];
else printf("Loi! Ngan xep rong");
}

51

XA PHN T TI NH NGN XP

Gii thut :
Nu ngn xp rng th thng bo li
Ngc li, tng Top_idx ln 1 n v
void Pop(Stack *S) {
if (!Empty_Stack(*S))
S->Top_idx=S->Top_idx+1;
else printf("Loi! Ngan xep rong!");
}

52

THM PHN T X VO NGN XP

Gii thut :
Nu ngn xp y th thng bo li
Ngc li, gim Top_idx xung 1 n v ri a gi tr x vo
c ch s Top_idx
void Push(ElementType X, Stack *S) {
if (Full_Stack(*S))
printf("Loi! Ngan xep day!");
else{
S->Top_idx=S->Top_idx-1;
S->Elements[S->Top_idx]=X;
}

53

BI TP

Vit chng trnh nhp vo 1 s nguyn n


Chuyn s nguyn n sang s nh phn (c
s dng cc php ton trn ngn xp)

54

HNG I (QUEUE)
NH NGHA
CC PHP TON
CI T HNG I

DNG MNG DI CHUYN TNH TIN


DNG MNG VNG
DNG DSLK

55

NH NGHA HNG I
L mt dng danh sch c bit, m php thm vo
ch thc hin 1 u, gi l cui hng(REAR), cn
php loi b th thc hin u kia ca danh sch,
gi l u hng(FRONT)
Cch lm vic theo dng FIFO (First In First Out)

56

CC PHP TON
Php ton

Din gii

MAKENULL_QUEUE(Q)

To mt hng i rng (Q)

EMPTY_QUEUE(Q)

Kim tra xem hng i Q c rng khng

FULL_QUEUE(Q)

Kim tra xem hng i Q c y khng

ENQUEUE(X,Q)

Thm phn t X vo cui hng i Q

DEQUEUE(Q)

Xa phn t ti u hng i Q

FRONT(Q)

Tr v phn t u tin ca hng i


Q

57

CI T HNG BNG MNG DI CHUYN TNH TIN


M hnh

58

KHAI BO
#define MaxLength ...
//chiu di ti a
typedef ... ElementType; //Kiu d liu pht
typedef struct
{
ElementType Elements[MaxLength]; //ni dung
int Front, Rear; //ch s u v cui hng
} Queue;
Queue Q;

pht

59

KHI TO HNG Q RNG


Front v Rear khng tr n v tr hp l no
Ta cho front=rear=-1
void MakeNull_Queue(Queue *Q) {
Q->Front=-1;
Q->Rear=-1;
}

60

KIM TRA HNG RNG

Hng rng khi front=-1


int Empty_Queue(Queue Q) {
return (Q.Front ==-1);
}

61

KIM TRA HNG Y

Hng y khi s phn t hin c trong


hng=Maxlength
int Full_Queue(Queue Q) {
return ((Q.Rear-Q.Front+1)==MaxLength);
}

62

TR V PHN T U HNG

Kt qu ca php ton trn l x


=>Gii thut:
Nu hng Q rng th thng bo li
Ngc li, tr v gi tr c lu tr ti c ch s l Front
ElementType Front(Queue Q) {
if Empty_Queue(Q)
printf (Hang rong);
else return Q.Elements[Q.Front];
}

63

XA MT PHN T KHI HNG(1)

=>Gii thut:
Nu hng Q rng th thng bo li
Ngc li, tng Front ln 1 n v
- Nu Front>Rear tc hng ch cn 1 phn t th khi to li
hng rng lun

64

XA MT PHN T KHI HNG(2)

void DeQueue(Queue *Q) {


if (!Empty_Queue(*Q)) {
Q->Front=Q->Front+1;
if (Q->Front>Q->Rear)
MakeNull_Queue(Q);
}
else
printf("Loi: Hang rong!");
}

65

THM MT PHN T VO HNG(1)

Trng hp bnh thng

66

THM MT PHN T VO HNG(2)

Trng hp hng b trn

67

THM MT PHN T VO HNG(3)

=>Gii thut:

Nu hng y th thng bo li
Ngc li, nu hng trn th phi tnh tin
tt c phn t ln Front v tr
Tng Rear 1 n v v a gi tr x vo
c ch s Rear mi ny

68

THM MT PHN T VO HNG(4)


void EnQueue(ElementType X,Queue *Q) {
if (!Full_Queue(*Q)) {
if (Empty_Queue(*Q)) Q->Front=0;
if (Q->Rear==MaxLength-1) {
int i;
//Di chuyen tinh tien ra truoc Front vi tri
for(i=Q->Front; i<=Q->Rear; i++)
Q->Elements[i-Q->Front]=Q->Elements[i];
//Xac dinh vi tri Rear moi
Q->Rear=MaxLength - Q->Front-1;
Q->Front=0;
}
//Tang Rear de luu noi dung moi
Q->Rear=Q->Rear+1;
Q->Element[Q->Rear]=X;
}
else printf("Loi: Hang day!");
}

69

CI T HNG BNG MNG VNG

M hnh

Khai bo
#define MaxLength ... //chiu di ti a ca mng
typedef ... ElementType; //Kiu d liu ca phn t
typedef struct {
ElementType Elements[MaxLength]; // phn t
int Front, Rear; //ch s u v ui hng
} Queue;
Queue Q;

70

KHI TO HNG RNG

Front v Rear khng tr n v tr hp l no


Ta cho Front=Rear=-1
void MakeNull_Queue(Queue *Q) {
Q->Front=-1;
Q->Rear=-1;
}

71

KIM TRA HNG RNG

int Empty_Queue(Queue Q) {
return Q.Front==-1;
}

72

KIM TRA HNG Y


V d

Hng y khi s phn t hin c trong hng bng


Maxlength
int Full_Queue(Queue Q) {
return (Q.Rear-Q.Front+1) % MaxLength==0;
}

73

LY GI TR PHN T U HNG

=>Gii thut
- Nu hng Q rng th thng bo li
- Ngc li, tr v gi tr c lu tr ti c ch
s l Front
ElementType Front(Queue Q) {
if (!Empty_Queue(Q))
return Q.Elements[Q.Front];
}

74

XA PHN T U HNG(1)
Cc trng hp c th:

75

XA PHN T U HNG(2)
Gii thut :
Nu hng Q rng th thng bo li
Ngc li:
Nu Front=Rear tc hng ch cn 1 phn t th khi to li
hng rng
Ngc li, thay i gi tr cho Front
void DeQueue(Queue *Q){
if (!Empty_Queue(*Q)){
if (Q->Front==Q->Rear) //Nu ch c 1 pht
MakeNull_Queue(Q);
else Q->Front=(Q->Front+1) % MaxLength;
}
else printf("Loi: Hang rong!");
}

76

THM PHN T X VO HNG Q(1)


Cc trng hp c th:

77

THM PHN T X VO HNG Q(2)

Gii thut :
Nu hng y th thng bo li
Ngc li, thay i gi tr Rear v a gi tr x
vo c ch s Rear mi ny
void EnQueue(ElementType X,Queue *Q) {
if (!Full_Queue(*Q)){
if (Empty_Queue(*Q))
Q->Front=0;
Q->Rear=(Q->Rear+1) % MaxLength;
Q->Elements[Q->Rear]=X;
}
else printf("Loi: Hang day!");
}

78

BI TP
Vit chng trnh nhp vo mt ngn xp
cha cc s nguyn
Sau s dng mt hng i o ngc
th t ca cc phn t trong ngn xp

79

CI T HNG BNG DSLK


M hnh
Dng 2 con tr Front v Rear ch ti phn t u hng v
cui hng

Khai bo
typedef ... ElementType; //kiu phn t ca hng
typedef struct Node* NodeType;
struct Node {
ElementType Element;
NodeType Next; //Con tr ch k tip
};
typedef NodeType Position;
typedef struct{
Position Front, Rear; //2 con tr u, cui hng i
} Queue;
Queue Q;

80

KHI TO HNG Q RNG

Cho Front v rear cng tr n HEADER ca hng


void MakeNullQueue(Queue *Q) {
Position Header;
Header=(NodeType)malloc(sizeof(struct Node));
Header->Next=NULL;
Q->Front=Header;
Q->Rear=Header;
}

81

KIM TRA HNG Q RNG


Kim tra xem Front v Rear c cng ch n 1
(HEADER) khng?
int EmptyQueue(Queue Q){
return (Q.Front==Q.Rear);
}

82

THM MT PHN T X VO HNG Q

=>Gii thut:
Thm 1 phn t vo hng ta thm vo sau Rear 1 mi
Cho Rear tr n phn t mi ny
Cho trng next ca mi ny tr ti NULL
void EnQueue(ElementType X, Queue *Q) {
Q->Rear->Next=(NodeType)malloc(sizeof(struct Node));
Q->Rear=Q->Rear->Next;
Q->Rear->Element=X; //Dat gia tri vao Rear
Q->Rear->Next=NULL;
}

83

LY GI TR PHN T U HNG

=>Gii thut
- Nu hng Q rng th thng bo li
- Ngc li, tr v gi tr c lu tr ti sau Front
ElementType Front(Queue Q) {
if (!EmptyQueue(Q))
return Q.Front->Next->Element;
}

84

XA MT PHN T KHI HNG Q

xa 1 phn t khi hng ta ch cn cho Front tr ti v tr k


tip ca n trong danh sch
void DeQueue(Queue *Q) {
if (!Empty_Queue(Q)) {
Position Temp;
Temp=Q->Front;
Q->Front=Q->Front->Next;
free(Temp);
} else printf(Loi: Hang rong);
}

85

CC NG DNG CA NGN XP V HNG I

Bn hy lit k mt s ng dng c s dng

Ngn xp
Hng i

86

DANH SCH LIN KT KP


M hnh

Trong mt phn t ca danh sch, ta dng hai con tr Next v


Previous ch n phn t ng sau v phn t ng trc
phn t ang xt

Khai bo
typedef ... ElementType; //kiu ni dung ca phn t
typedef struct Node* NodeType;
struct Node {
ElementType Element; //lu tr ni dung phn t
NodeType Prev; //Con tr trc
NodeType Next; //Con tr sau
};
typedef NodeType Position;
typedef Position DoubleList;

87

DANH SCH RNG


To danh sch rng
void MakeNull_List (DoubleList *DL) {
(*DL)= NULL;
}

Kim tra danh sch rng


int Empty (DoubleList DL) {
return (DL==NULL);
}

88

TR V NI DUNG PHN T V TR P TRONG DANH


SCH

p
=>V tr ca mt phn t l con tr tr vo ngay chnh phn t
ElementType Retrieve (Position P, DoubleList DL) {
return P->Element;
}

89

THM MT PHN T VO DANH SCH (1)


Trc khi thm

p->Previous

p->Next

Sau khi thm

p->Previous

p->Next

=>Cp pht mt nh mi cha phn t cn thm


=>t li cc lin kt

90

THM MT PHN T VO DANH SCH (2)


void Insert_List(ElementType X, Position p, DoubleList *DL) {
if (*DL == NULL) {
(*DL)=(NodeType)malloc(sizeof(Node));
(*DL)->Element = X;
(*DL)->Previous =NULL;
(*DL)->Next =NULL;
} else {
Position temp;
temp=(NodeType)malloc(sizeof(struct Node));
temp->Element=X;
temp->Next=p;
temp->Previous=p->Previous;
if (p->Previous!=NULL)
p->Previous->Next=temp;
p->Previous=temp;
}
}

91

XA MT PHN T RA KHI DANH SCH

void Delete_List (Position p, DoubleList *DL) {


if (*DL == NULL)
printf(Danh sach rong);
else {
if (p==*DL) (*DL)=(*DL)->Next; //Xa phn t u
else p->Previous->Next=p->Next;
if (p->Next!=NULL)
p->Next->Previous=p->Previous;
free(p);
}
}

92

You might also like