CHƯƠNG VIII DANH SÁCH MĨC NỐI DANH SẠCH MỌC NÄÚI Ta thỉång sỉí dủng mng cáúu trục âãø xỉí l våïi nhọm dỉỵ liãûu Âáy l mäüt cạch tiãúp cáûn âụng ta biãút trỉåïc chênh xạc säú cạc cáúu trục cáưn cọ Tuy nhiãn, säú ny khäng roợ raỡng, maợng seợ trồớ nón khaù tọỳn keùm vỗ chụng phi âỉåüc cáúp phạt â bäü nhåï âãø hoảt âäüng Bäú nhåï ny âỉåüc âàng k v s khäng dnh cho nhỉïng tạc vủ khạc c ta chè dng mäüt sä nh cạc pháưn C cho phẹp ta thỉûc hiãûn âiãưu ny thäng qua cạhc cáúp phạt bäü nhåï âäüng bàịng: malloc() v calloc() Nhỉng cạc cáúu trục nãúu âỉåüc cáúp phạp xong s khäng cọ âm bạo no ràịng cạc cáúu trục s âỉåüc âàût liãn tiãúp bäü nhåï Do âọ âiãưu cáưn thiãút l k thût âãø näúi kãút táút c cạc cáúu trục lải våïi Phỉång cạch thäng dủng âãø kãút näúi cạc pháưn tỉí âọ lải l dng danh liãn kãút (Linked list) I Danh saïch liãn kãút âån: Âënh nghéa Cụ phạp: struct { ; struct * } Vê dủ: Âënh nghéa mäüt danh liãn kãút âãø chỉïa caïc säú nguyãn struct Point { int info; struct Point *Next; }; Cạc phẹp toạn trãn danh liãn kãút a Cáúp phaït bä nhåï cho biãún tr måïi Cụ phạp: 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 Xoạ mäüt tr: Cụ phạp: free(Point_Variable) Gii phọng vng nhåï âỉåüc tr båíi Point_Variable c Cạc phẹp toạn thỉång dng danh liãn kãút Tảo mäüt pháưn tỉ ca danh Âiãưu phi lm l cáúp phạp bäü nhåï cho cáúu trục v tr vãư tr tr âãún vng nhåï ny Vê dủ: 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 pháưn tỉ vo danh Hm CreatNode() chè cáúp phạt bäü nhåï nhỉng khäng näúi pháưn tỉí ny vo danh Âãø lm âiãưu ny, ta cáưn thãm mäüt hm nỉỵa, gi l hm AddNode() Âỉåüc âënh nghéa sau: static POINT *Head; void AddNode(POINT *e) { POINT *p; if (Head ==NULL) { Head = e; return; } Vê duû: Âënh nghéa mäüt danh liãn kãút âãø chỉïa cạc säú nguyãn struct Point { int info; struct Point *Next,*Previous; }; III STACK v QUEUE STACK L danh cọ mọc näúi âàûc biãût Màûc dáưu ta cọ thãø thỉûc hiãûm nhiãưu phẹp toạn trãn danh täøng quạt, Stack váùn cọ nhỉỵng cháút riãng biãût: chè cho phẹp thãm v xoạ b cạc pháưn tỉí åí mäüt vë trê nháút, tải âènh ca Stack Våïi âàûc trỉng nhổ vỏỷy thỗ Stack coù kióứu cỏỳu truùc dổợ lióỷu l LIFO (Last In First Out) a Khåíi tảo Stack Sỉí dủng mng: int stack[100], p; Stackinit() { p=0; } Sỉí dủng danh liãn kãút 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ỉỵ liãûu vo Stack Sỉí dủng mng: Push (int x) { stack[p++]=x; } Sỉí dủng danh saïch liãn kãút: Push(int a) { q=(NODE *) malloc (sizeof *q); q->info=a; q->Next=Head->Next; Head->Next=q; return 0; } c Láúy giạ trë Stack Sỉí dủng mng: Pop (int x) { return stack[p ]; } Sỉí dủng danh liãn kãút: Pop() { int x; q=Head->Next; Head->Next=q->Next; x=q->info; free(q); return x; } d Kiãøm tra Stack räùng Sỉí dủng mng: int stackempty() { return !p; } Sỉí dủng danh saïch liãn kãút: int StackEmpty() { return Head->Next==p; } Vê dủ: Xáy dỉûng stack bàịng danh liãn kãt: #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(); { 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 Stack\n"); while (!StackEmpty()) printf("%d ",Pop()); printf("\nAn ESC de ket thuc"); getch(); } Queue Queue hay coìn goüi laì haìng âåüi, âáy l mäüt kiãøu danh âàûc biãût Cạc pháưn tỉí âỉåüc thãm vo tỉì mäüt âáưu, âỉåüc gi l âáưu sau, v láúy mäüt âáưu khạc, âỉåüc gil âáưu trỉåïc Cáúu trục ny âỉåüc sỉí dủng cạc tỗnh huọỳng lỏỷp trỗnh cỏửn xổớ lyù mọỹt daợy caùc pháưn tỉí theo mäüt tráût tỉû cäú âënh Viãûc xỉí lyï naìy goüi laì FIFO (First Int First Out) ... qua c? ??hc c? ?úp phạt bäü nhåï âäüng bàịng: malloc() v calloc() Nhỉng c? ? ?c cáúu tr? ?c nãúu âỉå? ?c cáúp phạp xong s khäng c? ?? âm bạo no ràịng c? ? ?c cáúu tr? ?c s âỉå? ?c âàût liãn tiãúp bäü nhåï Do âọ âiãưu c? ?ưn.. .DANH SẠCH M? ?C NÄÚI Ta thỉång sỉí dủng mng c? ?úu tr? ?c âãø xỉí l våïi nhọm dỉỵ liãûu Âáy l mäüt c? ??ch tiãúp c? ?ûn âụng ta biãút trỉå? ?c chênh x? ?c säú c? ? ?c cáúu tr? ?c cáưn c? ?? Tuy nhiãn,... STACK vaì QUEUE STACK L danh c? ?? m? ?c näúi âà? ?c biãût Mà? ?c dáưu ta c? ?? thãø thỉ? ?c hiãûm nhiãưu phẹp toạn trãn danh täøng quạt, Stack váùn c? ?? nhỉỵng cháút riãng biãût: chè cho phẹp thãm v xoạ b c? ??c