Vous êtes sur la page 1sur 14

Algoritma dan Struktur Data

1/21/2009

Linked Stacks & Linked Queues

01 / 62

Overview
Linked List & Node (Intro) Linked Stack.
Push Pop

Linked Queue.
Append Serve
02 / 62

Kuliah Minggu ke 18

Algoritma dan Struktur Data

1/21/2009

Linked List
A1 A2 A3 AN

Linked list adalah sederetan node (simpul) Node bisa diakses (atau dikunjungi) secara sekuensial, satu sesudah lainnya Hal ini tidak berarti bahwa node-node juga bersifat contiguous di dalam memori komputer
32 / 62

Node dari Linked List


Ai A node in a linked list

Sebuah node dlm linked list berisi


satu elemen berupa data satu link or pointer ke next node

Ada dua node khusus


A header node AN A tail node 33 / 62 Pada awal list ada sebuah dummy node yg tidak menyimpan data dan hanya punya sebuah pointer ke node awal dari list yg disebut node header Node terakhir menunjuk ke NULL. Biasa disebut node tail

Kuliah Minggu ke 18

Algoritma dan Struktur Data

1/21/2009

Posisi Node
Setiap node punya satu posisi dalam list yang menyatakan seberapa jauh node tsb berada dari node header Posisi sebuah node adalah type integer. Node header berada pada posisi 0. Node pertama list yang berisi data (A1 dalam gambar slide terakhir) berada pada posisi 1 dan seterusnya. Posisi dari sebuah node tidak disimpan dalam node tetapi dihitung setiap akses ke list
34 / 62

Node Structure
#ifndef LINKEDNODEH #define LINKEDNODEH #include <stdlib.h> typedef float data_type; struct Node { data_type value; Node* nextPtr; }; typedef struct Node Node; Node* makeNode(data_type item); #endif

04 / 62

Kuliah Minggu ke 18

Algoritma dan Struktur Data

1/21/2009

Membuat sebuah Node


Node* makeNode(data_type item) { Node* newNodePtr=NULL; newNodePtr = (Node *)malloc(sizeof(Node)); if(newNodePtr==NULL) { fprintf(stderr,"Out of memory."); exit(1); } newNodePtr->value = item; newNodePtr->nextPtr = NULL; return newNodePtr; }

05 / 62

Linked Stack
Top of the Stack

NULL pointer
03 / 62

Kuliah Minggu ke 18

Algoritma dan Struktur Data

1/21/2009

#ifndef LINKEDSTACKH #define LINKEDSTACKH #include "node.h" struct LinkedStackRec { int count; Node* topPtr; }; typedef struct LinkedStackRec Stack; void intializeStack(Stack* stackPtr); int stackEmpty(const Stack* stackPtr); //int stackFull(cont Stack* stackPtr); void push(Stack* stackPtr, float item); float pop(Stack* stackPtr); #endif

04 / 62

Initialize Stack
stackPtr addr of stack count topPtr 0 NULL

void initializeStack(Stack* stackPtr) { stackPtr->topPtr = NULL; stackPtr->count = 0; }

05 / 62

Kuliah Minggu ke 18

Algoritma dan Struktur Data

1/21/2009

Push
topPtr

topPtr

06 / 62

Push
buat sebuah node baru untuk suatu item link node baru ke current top node buat node baru menjadi top baru tambah nilai satu pada count
void push(Stack* stackPtr, float item) { Node* newNodePtr = makeNode(item); newNodePtr->nextPtr = stackPtr->topPtr; stackPtr->topPtr = newNodePtr; stackPtr->count++; }

07 / 62

Kuliah Minggu ke 18

Algoritma dan Struktur Data

1/21/2009

Pop
topPtr topPtr

08 / 62

Pop
cek apakah stack kosong ingat item dalam top node ingat alamat dari current top node buat next node menjadi top baru bebaskan (free) old top node kurangi count dengan 1 kembalikan (return) item
09 / 62

Kuliah Minggu ke 18

Algoritma dan Struktur Data

1/21/2009

Pop
float pop(Stack* stackPtr) { float item; Node* oldNodePtr = stackPtr->topPtr; if (stackEmpty(stackPtr)) { fprintf(stderr, Stack is empty\n); exit(1); } else { item = oldNodePtr->value; stackPtr->topPtr = oldNodePtr->nextPtr; free(oldNodePtr); stackPtr->count--; } return item; }

10 / 62

#include <stdio.h> #include <stdlib.h> #include "lstack.h" int main() { Stack float

theStack; next;

initializeStack(&theStack); printf("Enter number sequence: "); while (scanf("%f", &next) == 1){ push(&theStack, next); } while (!stackEmpty(&theStack)) { next = pop(&theStack); printf("%5.2f ", next); } printf("\n"); return 0; }

Kuliah Minggu ke 18

Algoritma dan Struktur Data

1/21/2009

Linked Queue

frontPtr

rearPtr

11 / 62

#ifndef LINKEDQUEUEH #define LINKEDQUEUEH #include "node.h" struct LinkedQueueRec { int count; Node* frontPtr; Node* rearPtr; }; typedef struct LinkedQueueRec Queue; void intializeQueue(Queue* queuePtr); int queueEmpty(const Queue* queuePtr); //int queueFull(cont Queue* queuePtr); void append(Queue* queuePtr, float item); float serve(Queue* queuePtr); #endif

12 / 62

Kuliah Minggu ke 18

Algoritma dan Struktur Data

1/21/2009

Initialize Queue
queuePtr addr of queue count frontPtr rearPtr 0 NULL NULL

void initializeQueue(Queue* queuePtr) { queuePtr->frontPtr = NULL; queuePtr->rearPtr = NULL; queuePtr->count = 0; }

13 / 62

Append

frontPtr

rearPtr

frontPtr

rearPtr
14 / 62

Kuliah Minggu ke 18

10

Algoritma dan Struktur Data

1/21/2009

Append
buat sebuah node baru untuk suatu item jika queue kosong:
node baru menjadi front dan rear dari queue

jika tidak:
buat sebuah link dari current rear ke node yang baru node baru menjadi rear baru

tambah count dengan 1


15 / 62

void append(Queue* queuePtr, float item) { Node* newNodePtr = makeNode(item); if (queueEmpty(queuePtr)) { queuePtr->frontPtr = newNodePtr; queuePtr->rearPtr = newNodePtr; queuePtr->count = 1; } else { queuePtr->rearPtr->nextPtr = newNodePtr; queuePtr->rearPtr = newNodePtr; queuePtr->count++; } }

16 / 62

Kuliah Minggu ke 18

11

Algoritma dan Struktur Data

1/21/2009

Serve

frontPtr

rearPtr

frontPtr

rearPtr
17 / 62

Serve
cek bahwa queue tidak kosong ingat item dalam node front ingat address dari node front buat next node menjadi front yang baru bebaskan old front node kurangi count dengan 1 jika queue sekarang kosong, set rear ke NULL kembalikan (return) item
18 / 62

Kuliah Minggu ke 18

12

Algoritma dan Struktur Data

1/21/2009

float serve(Queue* queuePtr) { float item; Node* oldNodePtr = queuePtr->frontPtr; if (queueEmpty(queuePtr)) { fprintf(stderr, Queue is empty\n); exit(1); } else { item = oldNodePtr->value; queuePtr->frontPtr = oldNodePtr->nextPtr; queuePtr->count--; free(oldNodePtr); if (queuePtr->count == 0) { queuePtr->rearPtr = NULL; } } return item; }

19 / 62

#include <stdio.h> #include linkedqueue.h main() { Queue float

theQueue; item;

initializeQueue(&theQueue); while (scanf(%f, &item) == 1) { append(&theQueue, item); } while (!queueEmpty(&theQueue)) { item = serve(&theQueue); printf(%f\n, item); } }

20 / 62

Kuliah Minggu ke 18

13

Algoritma dan Struktur Data

1/21/2009

Sampai Jumpa di Pertemuan XIX Selamat Belajar


62 / 62

Kuliah Minggu ke 18

14

Vous aimerez peut-être aussi