Professional Documents
Culture Documents
Chuong 8
Chuong 8
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
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; }
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 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; };
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) };
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; }
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).