Title: Struktur Dinamis lanjutan
1Struktur Dinamis (lanjutan)
- The main reference of this presentation is from
the ch 12 of the book
2Enum (Enumeration)
- Dalam ANSI C, user dapat membuat tipe baru yang
disebut enumeration, dengan keyword enum. - Suatu tipe enum merupakan suatu himpunan
konstanta-konstanta integer yang
direpresentasikan dengan nama-nama simbolik
(identifier) - Contoh
- enum hari minggu, senin, selasa, rabu, kamis,
jumat, sabtu - Mendeklarasikan suatu tipe baru enum hari.
- Enumerator-enumerator minggu, senin, , sabtu
merepresentasikan konstanta-konstanta integer 0,
1, .., 6. - Kalau tidak dinyatakan secara lain eksplisit,
enumerator pertama selalu bernilai 0. Secara
otomatis enumerator berikutnya bernilai integer
berikutnya.
3Enum
- Sekarang enum hari dapat dipakai sebagaimana
tipe-tipe lainnya, dalam mendeklarasikan
variabel. - Contoh
- typedef enum hari harihari
- harihari nh1
- enum hari nh2
- nh1 senin
- nh2 kamis
4Enumerator
- Enumerator dapat diberi nilai secara eksplisit.
- Contoh
- enum month Jan1, Feb, Mar, Apr, May, Jun, Jul,
Aug, Sep, Oct, Nov, Dec - enum buah durian 6, jeruk, manggis 2,
duku - Disini jeruk bernilai 7 dan duku bernilai 3.
- enum status single1, lajang 1, married 2,
menikah 2 - Tipe enum dipakai untuk memperjelas maksud program
5Contoh Program menggunakan enum
- include ltstdio.hgt
- enum month Jan1, Feb, Mar, Apr, May, Jun, Jul,
- Aug, Sep, Oct, Nov, Des
- typedef enum month bulan
- int main()
-
- bulan b
- char namabulan "", "Januari", "Februari",
"Maret", "April", "Mei", - "Juni", "Juli", "Agustus",
"September", "Oktober", - "November", "Desember"
-
- for (bJan b lt Des b)
- printf("2d11s\n", b, namabulanb)
- return 0
6Pointer ke Fungsi
- Nama dari suatu fungsi adalah pointer ke fungsi
itu. - Seperti pointer ke variabel, pointer ke fungsi
dapat diperlakukan sebagai - Argumen utk fungsi
- Unsur dalam array
- Nilai yang dikembalikan fungsi
- Dsb
- Contoh Deklarasi
- double (pf) (double)
- Menyatakan bahwa pf adalah suatu pointer ke suatu
fungsi yang memerlukan satu argumen bertipe
double dan mengembalikan nilai bertipe double. - Perhatikan bahwa deklarasi diatas berbeda dgn
- double g(double)
- Yang menyatakan bahwa g adalah suatu fungsi yang
memerlukan satu argumen bertipe double dan
mengembalikan nilai bertipe double (pointer ke
double)
7Contoh Penggunaan pointer ke fungsi
- include ltstdio.hgt
- define N 5
- int min(int , int)
- int jumlah(int , int)
- int main()
-
- int aN 5, 7, -5, 3, 6
- int (pf)(int , int)
- pf jumlah
- printf("d d \n", pf(a,N), jumlah(a,N))
- pf min
- printf("d d \n", pf(a,N), min(a,N))
int min(int a, int n) int i, m a0 for
(in-1 igt0 i--) if(ai lt m) m
ai return m int jumlah(int a, int
n) int i, ma0 for (i1 iltn i) m
ai return m
8- include ltstdio.hgt
- define size 10
- / prototypes /
- void bubble( int work, const int size, int
(compa)( int a, int b ) ) - int ascending( int a, int b )
- int descending( int a, int b )
- void swap( int element1ptr, int element2ptr )
- int main()
-
- int order / 1 for ascending order or 2 for
descending order / - int counter / counter /
- / initialize array a /
- int a size 2, 6, 4, 8, 10, 12, 89, 68,
45, 37 - printf( "enter 1 to sort in ascending
order,\n - enter 2 to sort in descending order " )
if ( order 1 ) / pass function ascending
/ bubble( a, size, ascending )
printf( "\ndata items in ascending order\n" )
else / pass function descending /
bubble( a, size, descending ) printf(
"\ndata items in descending order\n" ) /
end else / / output sorted array / for
( counter 0 counter lt size counter )
printf( "5d", a counter ) / end
for / printf( "\n" ) return 0 /
indicates successful termination / / end
main /
9void swap( int element1ptr, int element2ptr
) int hold / temporary holding variable
/ hold element1ptr element1ptr
element2ptr element2ptr hold int
ascending( int a, int b ) return b lt a
int descending( int a, int b ) return b
gt a
- void bubble( int work, const int size,
- int (compa)( int a, int b ) )
-
- int pass / pass counter /
- int count / comparison counter /
- / loop to control passes /
- for ( pass 1 pass lt size pass )
- / loop to control number of comparisons
per pass / - for ( count 0 count lt size - 1 count
) - if ( (compa)( work count , work count 1
) ) - swap( work count , work count
1 ) -
-
10Linked Lists
- Linked list
- Linear collection of self-referential class
objects, called nodes - Connected by pointer links
- Accessed via a pointer to the first node of the
list - Subsequent nodes are accessed via the
link-pointer member of the current node - Link pointer in the last node is set to NULL to
mark the lists end - Use a linked list instead of an array when
- You have an unpredictable number of data elements
- Your list needs to be sorted quickly
11Linked Lists
12List Node Definition
- typedef struct simpul
- char data
- struct simpul next
- SIMPUL
- typedef SIMPUL PtrKeSIMPUL
13Inserting a Node
14- void sisip(PtrKeSIMPUL p, char info)
-
- PtrKeSIMPUL baru, sebelum, kini
- baru (PtrKeSIMPUL)malloc(sizeof(SIMPUL))
- if (baru)
-
- baru-gtdata info
- baru-gtnext NULL
- sebelum NULL
- kini p
- /cari posisi /
- while (kini ! NULL info gt kini-gtdata)
-
- sebelum kini
- kini kini-gtnext
-
15Deleting a Node
16- char hapus(PtrKeSIMPUL p, char info)
-
- PtrKeSIMPUL sebelum, kini, sementara
- sementara (PtrKeSIMPUL)malloc(sizeof(SIMPUL))
- if (info (p)-gtdata)
-
- sementara p
- p (p)-gtnext
- free(sementara)
- return info
-
- sebelum p
- kini (p)-gtnext
- while (kini ! NULL kini-gtdata ! info)
-
- sebelum kini
17Fungsi untuk mencetak Linked-list
- void cetaklist(PtrKeSIMPUL P)
-
- if (PNULL)
- printf("NULL\n")
- else
-
- while(P)
-
- printf("c --gt ", P-gtdata)
- P P-gtnext
-
- printf("NULL\n\n")
-
Untuk melihat versi rekursif, klik tombol diatas
18Fungsi untuk mencetak Linked-list
Versi Rekursif
- void cetaklist(PtrKeSIMPUL P)
-
- if (PNULL)
- printf("NULL\n\n")
- else
-
- printf("c --gt ", P-gtdata)
- cetaklist(P-gtnext)
-
Kembali
19Stacks
- Stack
- New nodes can be added and removed only at the
top - Similar to a pile of dishes
- Last-in, first-out (LIFO)
- Bottom of stack indicated by a link member to
NULL - Constrained version of a linked list
- push
- Adds a new node to the top of the stack
- pop
- Removes a node from the top
- Stores the popped value
- Returns true if pop was successful
20Stacks
21Stack Node Definition
- / self-referential structure /
- struct stackNode
- int data / define data as
an int / - struct stackNode nextPtr / stackNode
pointer / - / end structure stackNode /
- typedef struct stackNode StackNode / synonym
for struct stackNode / - typedef StackNode StackNodePtr / synonym for
StackNode /
22Push Operation
23- / Insert a node at the stack top /
- void push( StackNodePtr topPtr, int info )
-
- StackNodePtr newPtr / pointer to new node /
- newPtr malloc( sizeof( StackNode ) )
- / insert the node at stack top /
- if ( newPtr ! NULL )
- newPtr-gtdata info
- newPtr-gtnextPtr topPtr
- topPtr newPtr
- / end if /
- else / no space available /
- printf( "d not inserted. No memory
available.\n", info ) - / end else /
- / end function push /
24Pop Operation
25- / Remove a node from the stack top /
- int pop( StackNodePtr topPtr )
-
- StackNodePtr tempPtr / temporary node
pointer / - int popValue / node value /
- tempPtr topPtr
- popValue ( topPtr )-gtdata
- topPtr ( topPtr )-gtnextPtr
- free( tempPtr )
- return popValue
- / end function pop /
26Queues
- Queue
- Similar to a supermarket checkout line
- First-in, first-out (FIFO)
- Nodes are removed only from the head
- Nodes are inserted only at the tail
- Insert and remove operations
- Enqueue (insert) and dequeue (remove)
27Queues
28Queue Node Definition
- / self-referential structure /
- struct queueNode
- char data / define data as a
char / - struct queueNode nextPtr / queueNode
pointer / - / end structure queueNode /
- typedef struct queueNode QueueNode
- typedef QueueNode QueueNodePtr
29Enqueue Operation
30- / insert a node a queue tail /
- void enqueue( QueueNodePtr headPtr, QueueNodePtr
tailPtr, - char value )
-
- QueueNodePtr newPtr / pointer to new node /
- newPtr malloc( sizeof( QueueNode ) )
- if ( newPtr ! NULL ) / is space available
/ - newPtr-gtdata value
- newPtr-gtnextPtr NULL
- / if empty, insert node at head /
- if ( isEmpty( headPtr ) )
- headPtr newPtr
- / end if /
- else
- ( tailPtr )-gtnextPtr newPtr
- / end else /
31Dequeue Operation
32- / remove node from queue head /
- char dequeue( QueueNodePtr headPtr, QueueNodePtr
tailPtr ) -
- char value / node value /
- QueueNodePtr tempPtr / temporary node
pointer / - value ( headPtr )-gtdata
- tempPtr headPtr
- headPtr ( headPtr )-gtnextPtr
- / if queue is empty /
- if ( headPtr NULL )
- tailPtr NULL
- / end if /
- free( tempPtr )
- return value
33Trees
- Tree nodes contain two or more links
- All other data structures we have discussed only
contain one - Binary trees
- All nodes contain two links
- None, one, or both of which may be NULL
- The root node is the first node in a tree.
- Each link in the root node refers to a child
- A node with no children is called a leaf node
34Trees
35Tree traversals
- Inorder traversal prints the node values in
ascending order - 1. Traverse the left subtree with an inorder
traversal - 2. Process the value in the node (i.e., print the
node value) - 3. Traverse the right subtree with an inorder
traversal - Preorder traversal
- 1. Process the value in the node
- 2. Traverse the left subtree with a preorder
traversal - 3. Traverse the right subtree with a preorder
traversal - Postorder traversal
- 1. Traverse the left subtree with a postorder
traversal - 2. Traverse the right subtree with a postorder
traversal - 3. Process the value in the node
36Inorder Tree Traversal
- / begin inorder traversal of tree /
- void inOrder( TreeNodePtr treePtr )
-
- / if tree is not empty then traverse /
- if ( treePtr ! NULL )
- inOrder( treePtr-gtleftPtr )
- printf( "3d", treePtr-gtdata )
- inOrder( treePtr-gtrightPtr )
- / end if /
- / end function inOrder /
37Preorder Tree Traversal
- / begin preorder traversal of tree /
- void preOrder( TreeNodePtr treePtr )
-
- / if tree is not empty then traverse /
- if ( treePtr ! NULL )
- printf( "3d", treePtr-gtdata )
- preOrder( treePtr-gtleftPtr )
- preOrder( treePtr-gtrightPtr )
- / end if /
- / end function preOrder /
38Postorder Tree Traversal
- / begin postorder traversal of tree /
- void postOrder( TreeNodePtr treePtr )
-
- / if tree is not empty then traverse /
- if ( treePtr ! NULL )
- postOrder( treePtr-gtleftPtr )
- postOrder( treePtr-gtrightPtr )
- printf( "3d", treePtr-gtdata )
- / end if /
- / end function postOrder /
39Binary Search Tree
- Values in left subtree less than parent
- Values in right subtree greater than parent
- Facilitates duplicate elimination
- Fast searches - for a balanced tree, maximum of
log n comparisons
2
40Trees