You are on page 1of 31

CHNG VIII DANH SACH MOC NI

Ta thng s dung mang cu truc x ly vi nhom d liu. y la mt cach tip cn ung khi ta bit trc chnh xac s cac cu truc cn co. Tuy nhin, khi con s nay khng ro rang, mang se tr nn kha tn kem v chung phai c cp phat u b nh hoat ng. B nh nay c ng ky va se khng danh cho nhng tac vu khac ngay ca khi ta ch dung mt s nho cac phn t mang. Phng hng giai quyt cho vn

C cho phep ta thc hin iu nay thng qua cahc cp phat b nh ng bng:

malloc() va calloc()
Nhng cac cu truc nu c cp phap xong se khng co am bao nao rng cac cu truc se c t lin tip nhau trong b nh. Do o iu cn thit la ky thut ni kt tt ca cac cu truc lai vi nhau. Phng cach thng dung kt ni cac phn t o lai la dung danh sach lin kt (Linked list)

I. 1.

Danh sach lin kt n: nh ngha Cu phap: struct <Tn_kiu_cu_truc> { <Kiu cua phn t> <Phn t>; struct <Tn_kiu_cu_truc> *<Tn pointer tro n phn cu truc tip theo trong Danh sach> } V du: nh ngha mt danh sach lin kt cha cac s nguyn.

struct Point { int info; struct Point *Next; }; 2. Cac phep toan trn danh sach lin kt a. Cp phat b nh cho bin con tro mi Cu phap: Point_New = (struct Point_Name *) malloc (sizeof(struct Point_Name)

V du: typedef struct Point POINT; POINT Head, Last, p; CreatNode() { p=(POINT *) malloc (POINT) if (Head==(POINT* ) NULL) Head=Last=p; else { Last=Head;

while (Last->Next!= (POINT*) NULL) Last=Last->Next; Last->Next=p; Last=p; } printf(\nInput information for Node); scanf(%d, p->.info); Last->Next=(POINT *) NULL; return; }

b. Xoa mt con tro: Cu phap: free(Point_Variable) Giai phong vung nh c tro bi Point_Variable c. Cac phep toan thng dung trong danh sach lin kt

Tao mt phn t cua danh sach


iu phai lam la cp phap b nh cho cu truc va tra v con tro tro n vung nh nay. V du:

POINT *CreatNode() { POINT *p; p = (POINT *) malloc (sizeof(POINT)); if (p==NULL) { printf(Malloc falled.\n); exit(1); } printf(Input data for Node info = ); scanf(%d, p->info); p->Next = NULL return p; }

B sung phn t vao danh sach


Ham CreatNode() ch cp phat b nh nhng no khng ni phn t nay vao danh sach. lam iu nay, ta cn thm mt ham na, goi la ham AddNode(). c nh ngha nh sau: static POINT *Head; void AddNode(POINT *e) { POINT *p; if (Head ==NULL) { Head = e; return;

for (p=Head; p->Next!=NULL; p=p->Next); p->Next=e; } Chu y: Bin Head la con tro tro n u danh sach, nn cn c khai bao u chng trnh.(Sau phn khai nh ngha kiu con tro).

Chen phn t vao danh sach

chen phn t vao danh sach lin kt, ta phai ch ro phn t mi se c chen vao v tr nao.Sau y la ham se

void InsertNode(POINT *p, POINT *q) { if (p=NULL || q=NULL || p==q || q->Next ==p) { printf (Cannot Insert \n); return; } p->Next =q->Next; q->Next=p; };

Xoa phn t vao danh sach


Xoa mt phn t khoi danh sach lin kt n, ta cn phai tm phn t trc phn t cn xoa nhm muc ch ni lai vi phn t sau phn t cn xoa. Ta dung ham free() giai phng b nh chim bi phn t b xoa. Co th xy dng la: void DeleteNode(POINT *goner) { POINT *p; p=Head; if (goner ==Head)

else { while (p!=NULL && p->Next!=goner) p=p->Next; if (p=NULL) { printf(Cannot find Node \n); return; } p->Next=p->Next->Next; }; free(goner) };

Tm phn t vao danh sach


Tht kho tao mt ham FindNode() tng quat, bi v khi tm kim th ta phai da vao mt trong nhng trng d liu cua cu truc, iu nay phu thuc vao cu truc dang s dung. vit ham FindNode() tng quat ta phais dung con tro tro n ham. Vi cu truc trn ta xy dng ham FindNode() nh sau:

POINT *FindNode(int *n) { POINT *p; for (p=Head; p!=NULL; p=p->Next) if (p->Info=n) return p; return NULL; };

II.

Danh sach a lin kt nh ngha: Cu phap: struct <Tn_kiu_cu_truc> { <Kiu cua phn t> <Phn t>; struct <Tn_kiu_cu_truc> *<Tn pointer tro n phn cu truc tip theo trong Danh sach>,<Tn pointer tro n phn t cu truc trc o trong danh sach>; }

V du: nh ngha mt danh sach lin kt cha cac s nguyn. struct Point { int info; struct Point *Next,*Previous; };

III. STACK va QUEUE 1. STACK La danh sach co moc ni c bit. Mc du ta co th thc him nhiu phep toan trn danh sach tng quat, Stack vn co nhng tnh cht ring bit: ch cho phep thm va xoa bo cac phn t mt v tr duy nht, tai nh cua Stack. Vi c trng nh vy th Stack co kiu cu truc d liu la LIFO (Last In First Out)

a. Khi tao Stack S dung mang: int stack[100], p; Stackinit() { p=0; } S dung danh sach lin kt struct Node { int info; struct Node *Next; };

typedef struct Node NODE; NODE *Head, *p, *q; StackInit() { Head = (NODE *) malloc (sizeof *Head); p=(NODE *) malloc (sizeof *p); Head->Next=p; Head->info=0; p->Next=NULL; return 0; }

b. y d liu vao Stack S dung mang: Push (int x) { stack[p++]=x; } S dung danh sach lin kt:

Push(int a) { q=(NODE *) malloc (sizeof *q); q->info=a; q->Next=Head->Next; Head->Next=q; return 0; } c. Ly gia tr ra khoi Stack S dung mang: Pop (int x) { return stack[p--]; }

S dung danh sach lin kt: Pop() { int x; q=Head->Next; Head->Next=q->Next; x=q->info; free(q); return x; }

d. Kim tra Stack rng S dung mang: int stackempty() { return !p; } S dung danh sach lin kt: int StackEmpty() { return Head->Next==p; }

V du: Xy dng stack bng danh sach lin kt: #include "stdio.h" #include "alloc.h" #define ESC 27 struct Node { int info; struct Node *Next; }; typedef struct Node NODE; NODE *Head, *p, *q;

StackInit() { Head = (NODE *) malloc (sizeof *Head); p=(NODE *) malloc (sizeof *p); Head->Next=p; Head->info=0; p->Next=NULL; return 0; }

Push(int a) { q=(NODE *) malloc (sizeof *q); q->info=a; q->Next=Head->Next; Head->Next=q; return 0; }

Pop() { int x; q=Head->Next; Head->Next=q->Next; x=q->info; free(q); return x; } int StackEmpty() { return Head->Next==p; }

void main() { int b; char c; StackInit(); do { clrscr(); printf("\nNhap gia tri vao Stack "); scanf("%d",&b); Push(b);

printf("\nAn Enter de tiep tuc/ESC de thoi nhap"); c=getchar(); c=getch(); } while(c!=ESC); printf("\nCac gia tri trong Stack\n"); while (!StackEmpty()) printf("%d ",Pop()); printf("\nAn ESC de ket thuc"); getch(); }

2. Queue Queue hay con goi la hang i, y la mt kiu danh sach c bit. Cac phn t c thm vao t mt u, c goi la u sau, va ly ra mt u khac, c goila u trc. Cu truc nay c s dung trong cac tnh hung lp trnh cn x ly mt day cac phn t theo mt trt t c nh. Vic x ly nay goi la FIFO (First Int First Out).

You might also like