1/21/2009
01 / 62
Overview
Linked List & Node (Intro) Linked Stack.
Push Pop
Linked Queue.
Append Serve
02 / 62
Kuliah Minggu ke 18
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
Kuliah Minggu ke 18
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
1/21/2009
05 / 62
Linked Stack
Top of the Stack
NULL pointer
03 / 62
Kuliah Minggu ke 18
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
05 / 62
Kuliah Minggu ke 18
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
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
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
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
1/21/2009
Initialize Queue
queuePtr addr of queue count frontPtr rearPtr 0 NULL NULL
13 / 62
Append
frontPtr
rearPtr
frontPtr
rearPtr
14 / 62
Kuliah Minggu ke 18
10
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
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
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
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
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
1/21/2009
Kuliah Minggu ke 18
14