<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-570164179299572192</id><updated>2012-02-16T03:49:12.056-08:00</updated><category term='C++'/><category term='Algorithm'/><category term='Turkcell Technology'/><category term='Data Structures'/><category term='Java'/><title type='text'>Mustafa Veysi Soyvural</title><subtitle type='html'>Technical Blog</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://mustafasoyvural.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/570164179299572192/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://mustafasoyvural.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>vecii</name><uri>http://www.blogger.com/profile/03694394965687336378</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='26' src='http://1.bp.blogspot.com/_x7B_5iQ7s5g/SKKKNTU_OqI/AAAAAAAAAEU/1deWKlLP24Y/s1600-R/Photo-0152-y.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>13</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-570164179299572192.post-5333577237255263389</id><published>2009-03-27T01:59:00.000-07:00</published><updated>2009-03-27T03:10:57.541-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>WHICH ONE JAVA DOES SUPPROT? CALL BY REFERENCE or CALL BY VALUE</title><content type='html'>Many developers know that Java supports "&lt;span style="font-weight: bold;"&gt;call by references&lt;/span&gt;" when a method is invoked. They claim that java only use "&lt;span style="font-weight: bold;"&gt;call by value&lt;/span&gt;" when parameters are primitive types. And what about the truths :) the truth is absolutely different then this myth.&lt;br /&gt;&lt;br /&gt;EVERYTHNG IN JAVA PASSED BY VALUE SO JAVA SUPPORTS ONLY "&lt;span style="font-weight: bold;"&gt;CALL BY VALUE&lt;/span&gt;".&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;C++ also supports both of call by reference and call by value methods.&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Let's look at an example of C++ code, the below block of code clearly illustrates the differences of these methodologies. &lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;/*&lt;br /&gt;** author: Mustafa Veysi Soyvural&lt;br /&gt;**&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;#include &lt;iostream&gt;&lt;br /&gt;using namespace std;&lt;br /&gt;&lt;br /&gt;class A {&lt;br /&gt;private:&lt;br /&gt; int a;&lt;br /&gt;public:&lt;br /&gt; A() { a = 0; }&lt;br /&gt; int getA( ) { return a; }&lt;br /&gt; void setA(int _a) { this-&gt;a = _a; }&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;//call by value&lt;br /&gt;void funcA( A *a ) {&lt;br /&gt; a = new A();&lt;br /&gt; cout &lt;&lt; "Function using Call By Value " &lt;&lt; "a: " &lt;&lt; a-&gt;getA() &lt;&lt; endl;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//call by reference&lt;br /&gt;void funcA( A &amp;a ) {&lt;br /&gt; A *b = new A();&lt;br /&gt; a = *b;&lt;br /&gt; cout &lt;&lt; "Function using Call By Reference " &lt;&lt; "a: " &lt;&lt; a.getA() &lt;&lt; endl;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int main() {&lt;br /&gt; A *a = new A();&lt;br /&gt; cout &lt;&lt; "Initial value a: " &lt;&lt; a-&gt;getA() &lt;&lt; endl;&lt;br /&gt; a-&gt;setA(6);&lt;br /&gt; cout &lt;&lt; "After a-&gt;setA(6), a: " &lt;&lt; a-&gt;getA() &lt;&lt; endl;&lt;br /&gt; funcA(a);&lt;br /&gt; cout &lt;&lt; "After calling funcA( A *a ), a: " &lt;&lt; a-&gt;getA() &lt;&lt; endl;&lt;br /&gt; funcA(*a);&lt;br /&gt; cout &lt;&lt; "After calling funcA( A &amp;a ), a: " &lt;&lt; a-&gt;getA() &lt;&lt; endl;&lt;br /&gt; return 0;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The output of this code is here:&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;1. Initial value a: 0&lt;br /&gt;2. After a-&gt;setA(6), a: 6&lt;br /&gt;3. Function using Call By Value a: 0&lt;br /&gt;4. After calling funcA( A *a ), a: 6&lt;br /&gt;5. Function using Call By Reference a: 0&lt;br /&gt;6. After calling funcA( A &amp;amp;a ), a: 0&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Pay attention to 4th and 6th raws, if you use "&lt;span style="font-weight: bold;"&gt;call by reference&lt;/span&gt;" method you can change the real object. In this example funcA( A &amp;amp;a ) changes the address of a object where it points to heap memory area. But when you use call by value method you can change the value of pointer which is in the stack. &lt;br /&gt;&lt;br /&gt;Briefly, you can change the real object only by using call by reference. Otherwise you can change only the obect which has been copied into the stack.&lt;br /&gt;&lt;br /&gt;I also want to give an example from Java to show that Java does only supports "&lt;span style="font-weight:bold;"&gt;Call By Value&lt;/span&gt;" method.&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;public class CallByValue {&lt;br /&gt; public static void funcA( String myStr ) {&lt;br /&gt;  myStr = "I am a temp string in funcA :)";&lt;br /&gt;  System.out.println(myStr);&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public static void main(String[] args) {&lt;br /&gt;  String s = "Mustafa Soyvural";&lt;br /&gt;  System.out.println(s);&lt;br /&gt;  funcA(s);&lt;br /&gt;  System.out.println(s);&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Here is the output of this program:&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;Mustafa Soyvural&lt;br /&gt;I am a temp string in funcA :)&lt;br /&gt;Mustafa Soyvural&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/570164179299572192-5333577237255263389?l=mustafasoyvural.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mustafasoyvural.blogspot.com/feeds/5333577237255263389/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=570164179299572192&amp;postID=5333577237255263389' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/570164179299572192/posts/default/5333577237255263389'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/570164179299572192/posts/default/5333577237255263389'/><link rel='alternate' type='text/html' href='http://mustafasoyvural.blogspot.com/2009/03/which-one-java-does-supprot-call-by.html' title='WHICH ONE JAVA DOES SUPPROT? CALL BY REFERENCE or CALL BY VALUE'/><author><name>vecii</name><uri>http://www.blogger.com/profile/03694394965687336378</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='26' src='http://1.bp.blogspot.com/_x7B_5iQ7s5g/SKKKNTU_OqI/AAAAAAAAAEU/1deWKlLP24Y/s1600-R/Photo-0152-y.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-570164179299572192.post-6380248828850845085</id><published>2008-04-08T22:47:00.000-07:00</published><updated>2008-04-15T01:24:26.527-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Turkcell Technology'/><title type='text'>Kombinezonsal Devre Simülatörü</title><content type='html'>&lt;span style="font-size:130%;"&gt;&lt;a style="font-weight: bold;" href="http://members.lycos.co.uk/kalipse/STAJ_JAVA_ON_CALISMA.doc"&gt;Click here to download...&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;her türlü sorularınız için: &lt;span style="font-weight: bold;"&gt;soyvural@gmail.com&lt;/span&gt;&lt;br /&gt;ayrıca comment yazarak da anlamadığınız şeyleri sorabilirsiniz böylece diğer arkadaşlar da faydalanmış olur.&lt;br /&gt;&lt;br /&gt;NOT: Geliştirme ortamı olarak Eclipse 3.2 veya 3.3 kullanmanız tavsiye edilir. Turkcell Teknoloji'de geliştirme ortamı olarak bu ürünü kullandığımızdan staj döneminde sizin için daha iyi olur.&lt;br /&gt;&lt;br /&gt;Kolay gelsin...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;GELEN SORULAR ÜZERİNE CEVAPLAR&lt;br /&gt;Q.1. &lt;/span&gt;Input dosyasındaki gate sayısının output dosyasına etkisi nedir?&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;A.1. &lt;/span&gt;Hiç bir etkisi yok aslında, gate sayısı programlama yaparken sizin işinizi kolaylaştırması açısından verilmiştir. Ayrıca size verilen format ulusları standartlık kazanmış bir formattır. Size şöyle bir katkı sağlayacak:&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;public abstract Gate {&lt;br /&gt;/**&lt;br /&gt;* Methods and data members for Gate class&lt;br /&gt;* ...&lt;br /&gt;*/&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public And extends Gate {&lt;br /&gt;/**&lt;br /&gt;* Methods and data members for And class&lt;br /&gt;* ...&lt;br /&gt;*/&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public static void main(String[] args) {&lt;br /&gt;int gateNumbers = 0;&lt;br /&gt;//read gate numbers from input&lt;br /&gt;Gate [] gates = new Gate[gateNumbers];&lt;br /&gt;&lt;br /&gt;......&lt;br /&gt;if ( gates[i].hasSpecificInput() ) {&lt;br /&gt; if( gates[i].isOutputReady() ) {&lt;br /&gt;     /**&lt;br /&gt;      * implement your algorithm&lt;br /&gt;      */&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Q.2.)  &lt;/span&gt;&lt;span&gt;Output dosyasının nasıl hazırlanacağını biraz anlatır mısınız?&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;A.2.) &lt;/span&gt;Öncelikle sizden beklenen dosyadan verileri uygun bir şekilde alıp verilerinizi düzgün bir şekilde yaratmanız( yani Gate objectlerini düzgün biçimde oluşturmanız ), ardından kaç tane input varsa; diyelim 2 input olsun:&lt;br /&gt;0 0&lt;br /&gt;0 1&lt;br /&gt;1 0&lt;br /&gt;1 1&lt;br /&gt;için output değerlerini elde etmeniz.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Ör: &lt;/span&gt;2 input ve 2 output için örnek output dosyası.&lt;br /&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_x7B_5iQ7s5g/SARbxf7WkQI/AAAAAAAAADk/Z92c1iZvU5k/s1600-h/tablo.bmp"&gt;&lt;img style="cursor: pointer;" src="http://bp1.blogger.com/_x7B_5iQ7s5g/SARbxf7WkQI/AAAAAAAAADk/Z92c1iZvU5k/s320/tablo.bmp" alt="" id="BLOGGER_PHOTO_ID_5189373576579813634" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Output dosyasında sadece yukarıdaki verilerin olması yeterli.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Q.3.) buf &lt;/span&gt;tam olarak anlatılmamış. Lütfen bira açabilir misiniz?&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;A.3.) &lt;/span&gt;Buffer ve from aslında size büyük kolaylık sağlayacak ve de implementasyonu da çok kolay olan kısımlar, "buf ve from" da yapmanız gereken tek şey inputunda ne değer varsa outputunda o değeri göstermeniz.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Q.4.)&lt;/span&gt;&lt;br /&gt;.i 11&lt;br /&gt;.o 3&lt;br /&gt;.ilb 1 2 3 4 5 6 7 8 9 10 81&lt;br /&gt;.olb 143 145 147&lt;br /&gt;açıklayabilir misiniz?&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;A.4.)&lt;br /&gt;&lt;/span&gt;.i 11 &lt;span style="font-weight: bold;"&gt;--&gt;&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;11 tane input var demek (tüm devrenin 11 girişi var, ara değerler sayılmıyor)&lt;/span&gt;&lt;br /&gt;.o 3 &lt;span style="font-weight: bold;"&gt;--&gt; 3 tane çıkış var, yine tüm devreye ait çıkışlar&lt;/span&gt;&lt;br /&gt;.ilb 1 2 3 4 5 6 7 8 9 10 81 &lt;span style="font-weight: bold;"&gt;--&gt;Devrenin girişleri, 11 tane olarak belirtilen girişler&lt;/span&gt;&lt;br /&gt;.olb 143 145 147 &lt;span style="font-weight: bold;"&gt;--&gt;Devrenin çıkışları, 3 tane olarak belirtilen çıkışlar&lt;br /&gt;&lt;br /&gt;Q.5.) &lt;/span&gt;Örnekte verilen input ve output dosyası birbirini tutmuyor.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;A.5.)&lt;/span&gt; Evet örnekte sadece format olarak örnek koymak istemiştim. Word dosyasındaki output dosyası verilen input'a ait değildir. Sadece format olarak örnek vermek için koydum.&lt;br /&gt;&lt;br /&gt;Son olarak şunu önemle vurgulamak istiyorum, kafanıza takılan herhangi bir soruyu çekinmeden sorabilirsiniz. Problem tanımıyla alakalı kafanızda herhangi bir soru işareti kalmasını istemem. Programlama dili olarak Java, C++, C# kullanabilirsiniz bu konuda tamamen serbestsiniz ama benim tavsiyem Java ve Eclipse kullanmanız ve bu şekilde Turkcell Teknolojideki iş sürecine uyumunuzu hızlandırmanız. Programlamada, tasarımda, problemde karşılaştığınız herhangi bir sorunu lütfen SORUN, SORUN, SORUN :)&lt;br /&gt;&lt;br /&gt;Değerlendirme aşamasında ise üzerinde duracağım temel şey OOP kriterlerine uygunluğunuz.&lt;br /&gt;Örneğin: Her gate için ayrı sınıf ve metodlar oluşturmak sizce de son derece kötü bir çözüm olmaz mı?&lt;br /&gt;&lt;br /&gt;Ayrıca sizin işinizi kolaylaştıracak bazı noktalar da var ben bunlardan birini  size ipucu olarak verdim zaten. Problemi iyi anlayıp, OOP bilgilerinizi de güzel bir şekilde kullanırsanız çok kolaylıkla halledeceğinize inanıyorum.&lt;br /&gt;&lt;br /&gt;Hepnize Kolay Gelsin&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/570164179299572192-6380248828850845085?l=mustafasoyvural.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mustafasoyvural.blogspot.com/feeds/6380248828850845085/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=570164179299572192&amp;postID=6380248828850845085' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/570164179299572192/posts/default/6380248828850845085'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/570164179299572192/posts/default/6380248828850845085'/><link rel='alternate' type='text/html' href='http://mustafasoyvural.blogspot.com/2008/04/kombinezonsal-devre-simlatr.html' title='Kombinezonsal Devre Simülatörü'/><author><name>vecii</name><uri>http://www.blogger.com/profile/03694394965687336378</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='26' src='http://1.bp.blogspot.com/_x7B_5iQ7s5g/SKKKNTU_OqI/AAAAAAAAAEU/1deWKlLP24Y/s1600-R/Photo-0152-y.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_x7B_5iQ7s5g/SARbxf7WkQI/AAAAAAAAADk/Z92c1iZvU5k/s72-c/tablo.bmp' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-570164179299572192.post-1855523596632393649</id><published>2008-01-28T02:10:00.000-08:00</published><updated>2008-01-28T02:24:26.258-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>Regular Expressions with Finite State Machines</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_x7B_5iQ7s5g/R52tHzuQmhI/AAAAAAAAADc/rScCZROuGOY/s1600-h/fsm.bmp"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://bp2.blogger.com/_x7B_5iQ7s5g/R52tHzuQmhI/AAAAAAAAADc/rScCZROuGOY/s320/fsm.bmp" border="0" alt=""id="BLOGGER_PHOTO_ID_5160471097691380242" /&gt;&lt;/a&gt;&lt;br /&gt;Let's make a "Finite State Machine" which is used to check "a*b" regular expression.&lt;br /&gt;At first we must design the FSM. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;class State {&lt;br /&gt;protected:&lt;br /&gt; State * const nextState;&lt;br /&gt; bool isFinal;&lt;br /&gt;public:&lt;br /&gt; State( State &amp; next, bool _isFinal ) : nextState( &amp;next ) { isFinal = _isFinal; }&lt;br /&gt; virtual State * transition( char in ) = 0;&lt;br /&gt; bool isFinalState( ) { return isFinal; }&lt;br /&gt; ~State( ) { isFinal = false; }&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;class State1 : public State {&lt;br /&gt;public:&lt;br /&gt; State1( State &amp; nextState, bool _isFinal ) : State( nextState, _isFinal ) { }&lt;br /&gt; State * transition( char in );&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;State * State1::transition( char in ) {&lt;br /&gt; if( in &gt;= '0' &amp;&amp; in &lt;= '9' ) return this-&gt;nextState;&lt;br /&gt; else return NULL;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;class State2 : public State {&lt;br /&gt;public:&lt;br /&gt; State2( State &amp; nextState, bool _isFinal ) : State( nextState, _isFinal ) { }&lt;br /&gt; State * transition( char in );&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;State * State2::transition( char in ) {&lt;br /&gt; if( in == '*' ) return this-&gt;nextState;&lt;br /&gt; else return NULL;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;class FSM {&lt;br /&gt; State1 state1;&lt;br /&gt; State2 state2;&lt;br /&gt; State1 state3;&lt;br /&gt; State2 final;&lt;br /&gt; State * current;&lt;br /&gt;public:&lt;br /&gt; FSM( ) : state1( state2, false ), state2( state3, false ), state3( final, false ), final( final,true ), current( &amp;state1 ) { }&lt;br /&gt; bool run( const char *s );&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;bool FSM::run(const char *s) {&lt;br /&gt; int len = strlen( s );&lt;br /&gt; int i = 0;&lt;br /&gt; do {&lt;br /&gt;  current = current-&gt;transition( s[i] );&lt;br /&gt;  if( current &amp;&amp; current-&gt;isFinalState( ) )&lt;br /&gt;   return true;&lt;br /&gt;  i++;&lt;br /&gt; } while( NULL != current &amp;&amp; i &lt; len );&lt;br /&gt; &lt;br /&gt; return false;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;int main() {&lt;br /&gt; char s[ ] = "3*4";&lt;br /&gt; FSM fsm;&lt;br /&gt;&lt;br /&gt; if( fsm.run( s ) ) {&lt;br /&gt;  cout &lt;&lt; s &lt;&lt; " is a regular expression like \"a*b\" " &lt;&lt; endl;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; return 0;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/570164179299572192-1855523596632393649?l=mustafasoyvural.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mustafasoyvural.blogspot.com/feeds/1855523596632393649/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=570164179299572192&amp;postID=1855523596632393649' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/570164179299572192/posts/default/1855523596632393649'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/570164179299572192/posts/default/1855523596632393649'/><link rel='alternate' type='text/html' href='http://mustafasoyvural.blogspot.com/2008/01/regular-expressions-with-finite-state.html' title='Regular Expressions with Finite State Machines'/><author><name>vecii</name><uri>http://www.blogger.com/profile/03694394965687336378</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='26' src='http://1.bp.blogspot.com/_x7B_5iQ7s5g/SKKKNTU_OqI/AAAAAAAAAEU/1deWKlLP24Y/s1600-R/Photo-0152-y.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_x7B_5iQ7s5g/R52tHzuQmhI/AAAAAAAAADc/rScCZROuGOY/s72-c/fsm.bmp' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-570164179299572192.post-2461231650447253247</id><published>2008-01-27T11:07:00.000-08:00</published><updated>2008-01-28T02:24:52.156-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Data Structures'/><title type='text'>malloc, free &amp; realloc with buddy algorithm</title><content type='html'>&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;struct m_list {&lt;br /&gt;   void *address;&lt;br /&gt;   unsigned int size;&lt;br /&gt;   unsigned int in_use:1;&lt;br /&gt;   m_list *next;&lt;br /&gt;   m_list( void *_address, long _size) { size = _size; address = _address; next = NULL; in_use = 0; }&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;//1 KB buffer&lt;br /&gt;char buffer[1024];&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;unsigned int get_next_two_power( unsigned int n ) {&lt;br /&gt;   unsigned int num = 1;&lt;br /&gt;   while( num &amp;lt; n ) {&lt;br /&gt;       num &amp;lt;&amp;lt;= 1;&lt;br /&gt;   }&lt;br /&gt;   return num;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;void * my_malloc( unsigned int size, m_list **memlist ) {&lt;br /&gt;   if ( NULL == memlist || NULL == *memlist ) return NULL;&lt;br /&gt;   int alloc_size = get_next_two_power( size );&lt;br /&gt;&lt;br /&gt;   m_list *p = *memlist;&lt;br /&gt;   while( p ) {&lt;br /&gt;       if( p-&amp;gt;in_use == 0 ) {&lt;br /&gt;           if( alloc_size == p-&amp;gt;size ) {&lt;br /&gt;               p-&amp;gt;in_use = 1;&lt;br /&gt;               return p-&amp;gt;address;&lt;br /&gt;           }&lt;br /&gt;           if ( alloc_size &amp;lt; p-&amp;gt;size ) {&lt;br /&gt;               m_list *node = new m_list(NULL, p-&amp;gt;size &amp;gt;&amp;gt; 1);&lt;br /&gt;               node-&amp;gt;address = (void *)((int)(p-&amp;gt;address) + (p-&amp;gt;size &amp;gt;&amp;gt; 1));&lt;br /&gt;               node-&amp;gt;next = p-&amp;gt;next;&lt;br /&gt;               p-&amp;gt;next = node;&lt;br /&gt;               p-&amp;gt;size = p-&amp;gt;size &amp;gt;&amp;gt; 1;&lt;br /&gt;               return my_malloc( alloc_size, memlist );&lt;br /&gt;           }&lt;br /&gt;       }&lt;br /&gt;       p = p-&amp;gt;next;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   return NULL;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;void merge_buddies( m_list **memlist ) {&lt;br /&gt;   m_list *curr = *memlist, *next = curr;&lt;br /&gt;   bool is_merge = false;&lt;br /&gt;   while( curr ) {&lt;br /&gt;       if( curr-&amp;gt;in_use == 0 ) {&lt;br /&gt;           if( NULL != curr-&amp;gt;next ) {&lt;br /&gt;               next = curr-&amp;gt;next;&lt;br /&gt;               if( 0 == next-&amp;gt;in_use &amp;amp;&amp;amp; (next-&amp;gt;size == curr-&amp;gt;size) ) {&lt;br /&gt;                   curr-&amp;gt;size += next-&amp;gt;size;&lt;br /&gt;                   curr-&amp;gt;next = next-&amp;gt;next;&lt;br /&gt;                   is_merge = true;&lt;br /&gt;                   free(next);&lt;br /&gt;               }&lt;br /&gt;           }&lt;br /&gt;       }&lt;br /&gt;       curr = curr-&amp;gt;next;&lt;br /&gt;   }&lt;br /&gt;   if ( is_merge ) {&lt;br /&gt;       merge_buddies( memlist );&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;void my_free( void * address, m_list **memlist ) {&lt;br /&gt;   if( NULL == address || NULL == memlist || NULL == *memlist ) return;&lt;br /&gt;   m_list *curr = *memlist, *back, *next;&lt;br /&gt;&lt;br /&gt;   while( curr ) {&lt;br /&gt;       if( curr-&amp;gt;address == address ) {&lt;br /&gt;           curr-&amp;gt;in_use = 0;&lt;br /&gt;           merge_buddies( memlist );&lt;br /&gt;           return;&lt;br /&gt;       }&lt;br /&gt;       curr = curr-&amp;gt;next;&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;void * my_realloc( void * address, unsigned int size, m_list **memlist ) {&lt;br /&gt; my_free(address, memlist);&lt;br /&gt; void *adr = my_malloc(size, memlist);&lt;br /&gt; memcpy(adr, address, size );&lt;br /&gt;&lt;br /&gt; return adr;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;int main() {&lt;br /&gt; m_list *memlist = new m_list((void *)buffer, 1024);&lt;br /&gt; printf("buffer address:: %p\n", buffer);&lt;br /&gt; printf("memlist address:: %p\n", memlist-&gt;address);&lt;br /&gt;&lt;br /&gt; int *p1 = (int *)my_malloc(sizeof(int)*100, &amp;memlist);&lt;br /&gt; for( int i = 0; i &lt; 100; i++ ) {&lt;br /&gt;  p1[i] = i;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; p1 = (int *)my_realloc(p1, sizeof(int)*256, &amp;memlist);&lt;br /&gt; for( int i = 0; i &lt; 100; i++ ) {&lt;br /&gt;  cout &lt;&lt; p1[i] &lt;&lt; " * ";&lt;br /&gt; }&lt;br /&gt; cout &lt;&lt; endl;&lt;br /&gt;&lt;br /&gt; my_free( p1, &amp;memlist );&lt;br /&gt;&lt;br /&gt; char *p2 = (char *)my_malloc(sizeof(char)*240, &amp;memlist);&lt;br /&gt; *p2 = '\0';&lt;br /&gt; strcpy( p2, "Mustafa Veysi Soyvural\0" );&lt;br /&gt; cout &lt;&lt; p2 &lt;&lt; endl;&lt;br /&gt; my_free( p2, &amp;memlist );&lt;br /&gt;&lt;br /&gt; return 0;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/570164179299572192-2461231650447253247?l=mustafasoyvural.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mustafasoyvural.blogspot.com/feeds/2461231650447253247/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=570164179299572192&amp;postID=2461231650447253247' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/570164179299572192/posts/default/2461231650447253247'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/570164179299572192/posts/default/2461231650447253247'/><link rel='alternate' type='text/html' href='http://mustafasoyvural.blogspot.com/2008/01/malloc-free-realloc-with-buddy.html' title='malloc, free &amp; realloc with buddy algorithm'/><author><name>vecii</name><uri>http://www.blogger.com/profile/03694394965687336378</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='26' src='http://1.bp.blogspot.com/_x7B_5iQ7s5g/SKKKNTU_OqI/AAAAAAAAAEU/1deWKlLP24Y/s1600-R/Photo-0152-y.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-570164179299572192.post-2476981313063029152</id><published>2007-12-23T12:17:00.000-08:00</published><updated>2007-12-23T12:35:31.270-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Algorithm'/><title type='text'>Rotation of a String</title><content type='html'>&lt;span style="font-weight:bold;"&gt;Q.)&lt;/span&gt;Given a string s1 and a string s2, write  a snippet to say whether s2 is a&lt;br /&gt;rotation of s1 using only one call to strstr routine?&lt;br /&gt;&lt;br /&gt;(eg given s1 = ABCD and s2 = CDAB, return  true,&lt;br /&gt;      given s1 = ABCD, and s2 = ACBD , return false)&lt;br /&gt;&lt;br /&gt;If you add s1by itself then you will get s1=AB&lt;span style="font-weight:bold;"&gt;CDAB&lt;/span&gt;CD, as you can see now you will be able to make a decision whether s2 is a rotation or not.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Test Cases:&lt;/span&gt;&lt;br /&gt;- s1 = NULL&lt;br /&gt;- s2 = NULL&lt;br /&gt;- Both s1 and s2 are NULL&lt;br /&gt;- s1 = "\0", s2 = "\0" ( the rotation of empty string is itself:) )&lt;br /&gt;- s1 = "ABCD",  s2 = "CDAB"&lt;br /&gt;- s1 = "ABCD", s2 = "CD"&lt;br /&gt;- s1 = "ABCD", s2 = "CDBA"&lt;br /&gt;- s1 = "KUJU", s2 = "JUKU"&lt;br /&gt;&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;typedef enum { False, True } Boolean;&lt;br /&gt;&lt;br /&gt;Boolean isStringRotate( const char s1[ ], const char s2[ ] ) {&lt;br /&gt;    int len1 = 0, len2 = 0;&lt;br /&gt;    char *s = NULL;&lt;br /&gt;    if ( NULL == s1 &amp;#124;&amp;#124; NULL == s2 )    &lt;br /&gt;        return False;&lt;br /&gt;&lt;br /&gt;    len1 = strlen( s1 );&lt;br /&gt;    len2 = strlen( s2 );&lt;br /&gt;    if ( len1 != len2 ) return False;&lt;br /&gt;&lt;br /&gt;    s = ( char * )malloc( len1 + len2 + 1 );&lt;br /&gt;    s[ 0 ] = '\0';&lt;br /&gt;    strcat(s, s1);&lt;br /&gt;    strcat(s, s1);&lt;br /&gt;    &lt;br /&gt;    if ( !strncmp(&amp;amp;s[ len1 / 2 ], s2, len1) )&lt;br /&gt;        return True;&lt;br /&gt;    return False;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/570164179299572192-2476981313063029152?l=mustafasoyvural.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mustafasoyvural.blogspot.com/feeds/2476981313063029152/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=570164179299572192&amp;postID=2476981313063029152' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/570164179299572192/posts/default/2476981313063029152'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/570164179299572192/posts/default/2476981313063029152'/><link rel='alternate' type='text/html' href='http://mustafasoyvural.blogspot.com/2007/12/rotation-of-string.html' title='Rotation of a String'/><author><name>vecii</name><uri>http://www.blogger.com/profile/03694394965687336378</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='26' src='http://1.bp.blogspot.com/_x7B_5iQ7s5g/SKKKNTU_OqI/AAAAAAAAAEU/1deWKlLP24Y/s1600-R/Photo-0152-y.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-570164179299572192.post-7756430633273377900</id><published>2007-12-17T03:57:00.000-08:00</published><updated>2007-12-17T22:23:15.460-08:00</updated><title type='text'>Reverse Words of a String</title><content type='html'>&lt;span style="font-weight:bold;"&gt;Q.)&lt;/span&gt; How do you reverse the words in a string?&lt;br /&gt;&lt;br /&gt;"My name is Amit Agarwal"&lt;br /&gt;to&lt;br /&gt;"Agarwal Amit is name My"&lt;br /&gt;&lt;br /&gt;A O(n) and 'in space' solution is appreciable.&lt;br /&gt;&lt;br /&gt;- First reverse the whole string&lt;br /&gt;- Then reverse each word in the string&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Test Cases&lt;/span&gt;:&lt;br /&gt;- NULL string&lt;br /&gt;- "" empty string&lt;br /&gt;- "a" string that consists only one word&lt;br /&gt;- "mustafa"&lt;br /&gt;- "a b"&lt;br /&gt;- "Mustafa Veysi Soyvural"&lt;br /&gt;- "Mustafa     Veysi     Soyvural" more than one space between words&lt;br /&gt;&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;void reverse_words( char s[] ) {&lt;br /&gt;    char *p, temp;&lt;br /&gt;    int len = 0, i = 0, index = 0, word_len = 0;&lt;br /&gt;    if ( NULL == s ) return;&lt;br /&gt;    for ( p = s; *p != '\0'; p++ );&lt;br /&gt;    len = p - s;&lt;br /&gt;    &lt;br /&gt;    /* reverse whole string */&lt;br /&gt;    for ( i = 0; i &amp;lt; (len / 2); i++ ) {&lt;br /&gt;        temp = s[ i ];&lt;br /&gt;        s[ i ] = s[ len - i - 1 ];&lt;br /&gt;        s[ len - i - 1 ] = temp;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /* reverse each word */&lt;br /&gt;    p = s;&lt;br /&gt;    while ( index &amp;lt; len ) {&lt;br /&gt;        if ( *p != ' ' &amp;amp;&amp;amp; *p != '\0' ) p++;&lt;br /&gt;        else {&lt;br /&gt;            word_len = p - &amp;amp;s[ index ];&lt;br /&gt;            /* reverse word */&lt;br /&gt;            for ( i = 0; i &amp;lt; (word_len / 2 ); i++ ) {&lt;br /&gt;                temp = s[ i + index ];&lt;br /&gt;                s[ i + index ] = s[ index + word_len - i - 1 ];&lt;br /&gt;                s[ index + word_len - i - 1 ] = temp;&lt;br /&gt;            }&lt;br /&gt;            index += word_len + 1;&lt;br /&gt;            p++;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/570164179299572192-7756430633273377900?l=mustafasoyvural.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mustafasoyvural.blogspot.com/feeds/7756430633273377900/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=570164179299572192&amp;postID=7756430633273377900' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/570164179299572192/posts/default/7756430633273377900'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/570164179299572192/posts/default/7756430633273377900'/><link rel='alternate' type='text/html' href='http://mustafasoyvural.blogspot.com/2007/12/reverse-words-of-string.html' title='Reverse Words of a String'/><author><name>vecii</name><uri>http://www.blogger.com/profile/03694394965687336378</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='26' src='http://1.bp.blogspot.com/_x7B_5iQ7s5g/SKKKNTU_OqI/AAAAAAAAAEU/1deWKlLP24Y/s1600-R/Photo-0152-y.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-570164179299572192.post-1328061506657467532</id><published>2007-12-14T06:07:00.000-08:00</published><updated>2007-12-14T06:33:03.569-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>Singleton Pattern</title><content type='html'>Sometimes you need to only one instance of a class exist during the program runs.&lt;br /&gt;Here is a Singleton Pattern Implementation in C++.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;hedar file:&lt;/span&gt;&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;class Singleton {&lt;br /&gt;private:&lt;br /&gt;    static Singleton * single;&lt;br /&gt;    Singleton( ) { }&lt;br /&gt;    Singleton( const Singleton &amp;amp; instance ) { }&lt;br /&gt;    const Singleton &amp;amp; operator = ( const Singleton &amp;amp; instance ) {  }&lt;br /&gt;public:&lt;br /&gt;    static Singleton * getInstance();&lt;br /&gt;    ~Singleton( ) { }&lt;br /&gt;};&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;source file:&lt;/span&gt;&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;Singleton * Singleton::single = NULL;&lt;br /&gt;Singleton * Singleton::getInstance( ) {&lt;br /&gt;    if( NULL == single ) {&lt;br /&gt;        single = new Singleton( );&lt;br /&gt;    }&lt;br /&gt;    return single;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/570164179299572192-1328061506657467532?l=mustafasoyvural.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mustafasoyvural.blogspot.com/feeds/1328061506657467532/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=570164179299572192&amp;postID=1328061506657467532' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/570164179299572192/posts/default/1328061506657467532'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/570164179299572192/posts/default/1328061506657467532'/><link rel='alternate' type='text/html' href='http://mustafasoyvural.blogspot.com/2007/12/singleton-pattern.html' title='Singleton Pattern'/><author><name>vecii</name><uri>http://www.blogger.com/profile/03694394965687336378</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='26' src='http://1.bp.blogspot.com/_x7B_5iQ7s5g/SKKKNTU_OqI/AAAAAAAAAEU/1deWKlLP24Y/s1600-R/Photo-0152-y.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-570164179299572192.post-7767355240643238727</id><published>2007-12-13T16:16:00.001-08:00</published><updated>2007-12-17T00:56:17.989-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Algorithm'/><category scheme='http://www.blogger.com/atom/ns#' term='Data Structures'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>Linked List Class</title><content type='html'>Here is the &lt;span style="font-weight:bold;"&gt;node.h&lt;/span&gt; file where node class and methods definitions exist:&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;#ifndef NODE_H_&lt;br /&gt;#define NODE_H_&lt;br /&gt;&lt;br /&gt;template &amp;lt;typename Type&amp;gt;&lt;br /&gt;class Node {&lt;br /&gt;    Type data;&lt;br /&gt;    Node&amp;lt;Type&amp;gt; * next;&lt;br /&gt;    Node( ) { }&lt;br /&gt;public:&lt;br /&gt;    Node( Type );&lt;br /&gt;    Type getData( ) const;&lt;br /&gt;    Node * getNext( ) const;&lt;br /&gt;    void setNext( Node&amp;lt;Type&amp;gt; * );&lt;br /&gt;    ~Node( );&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;#endif&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Here is the &lt;span style="font-weight:bold;"&gt;node.cpp&lt;/span&gt; file where Node Class methods are implemented.&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;template &amp;lt;typename Type&amp;gt;&lt;br /&gt;Node&amp;lt;Type&amp;gt;::Node( Type _data ) {&lt;br /&gt;    this-&amp;gt;data = _data;&lt;br /&gt;    this-&amp;gt;next = 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;template &amp;lt;typename Type&amp;gt;&lt;br /&gt;Type Node&amp;lt;Type&amp;gt;::getData( ) const {&lt;br /&gt;    return this-&amp;gt;data;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;template &amp;lt;typename Type&amp;gt;&lt;br /&gt;Node&amp;lt;Type&amp;gt;* Node&amp;lt;Type&amp;gt;::getNext( ) const {&lt;br /&gt;    return this-&amp;gt;next;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;template &amp;lt;typename Type&amp;gt;&lt;br /&gt;void Node&amp;lt;Type&amp;gt;::setNext( Node&amp;lt;Type&amp;gt; *node ) {&lt;br /&gt;    this-&amp;gt;next = node;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;template &amp;lt;typename Type&amp;gt;&lt;br /&gt;Node&amp;lt;Type&amp;gt;::~Node( ) {&lt;br /&gt;    this-&amp;gt;next = 0;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Here is the &lt;span style="font-weight:bold;"&gt;list.h&lt;/span&gt; file where List Class and methods exist.&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;#ifndef LIST_H_&lt;br /&gt;#define LIST_H_&lt;br /&gt;&lt;br /&gt;#include &amp;quot;node.h&amp;quot;&lt;br /&gt;&lt;br /&gt;template &amp;lt;typename Type&amp;gt;&lt;br /&gt;class List {&lt;br /&gt;    Node&amp;lt;Type&amp;gt; * head;&lt;br /&gt;    Node&amp;lt;Type&amp;gt; * tail;&lt;br /&gt;    unsigned int length;&lt;br /&gt;public:&lt;br /&gt;    List( ); &lt;br /&gt;    List( const List &amp;amp; );&lt;br /&gt;    bool insert( Type data );&lt;br /&gt;    bool remove( unsigned int );&lt;br /&gt;    bool removeAtLast( unsigned int );&lt;br /&gt;    void insertSorted( Type data );&lt;br /&gt;    void reverse( );&lt;br /&gt;    void print( std::ostream &amp;amp; out ) const;&lt;br /&gt;    unsigned int size( ) const;&lt;br /&gt;    bool isEmpty( ) const;&lt;br /&gt;    Type get( unsigned int index ) const;&lt;br /&gt;    const Node&amp;lt;Type&amp;gt; * getMidNode( ) const ; &lt;br /&gt;    const List&amp;lt;Type&amp;gt; &amp;amp; getFirstHalf( ) const ;&lt;br /&gt;    const List&amp;lt;Type&amp;gt; &amp;amp; operator = ( const List&amp;lt;Type&amp;gt; &amp;amp; );&lt;br /&gt;    List&amp;lt;Type&amp;gt; operator + ( const List&amp;lt;Type&amp;gt; &amp;amp; ) const;&lt;br /&gt;    void operator += ( const List&amp;lt;Type&amp;gt; &amp;amp; );&lt;br /&gt;    bool operator == ( const List&amp;lt;Type&amp;gt; &amp;amp; ) const;&lt;br /&gt;    bool operator != ( const List&amp;lt;Type&amp;gt; &amp;amp; ) const;&lt;br /&gt;    void clear( );&lt;br /&gt;    ~List( );&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;#endif&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Here is the &lt;span style="font-weight:bold;"&gt;list.cpp&lt;/span&gt; file where List Class methods are implemented:&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;#include "node.h"&lt;br /&gt;template &amp;lt;typename Type&amp;gt;&lt;br /&gt;List&amp;lt;Type&amp;gt;::List( ) {&lt;br /&gt;    this-&amp;gt;head = this-&amp;gt;tail = 0;&lt;br /&gt;    this-&amp;gt;length = 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;template &amp;lt;typename Type&amp;gt;&lt;br /&gt;List&amp;lt;Type&amp;gt;::List( const List&amp;lt;Type&amp;gt; &amp;amp; list ) {&lt;br /&gt;    this-&amp;gt;head = this-&amp;gt;tail = 0;&lt;br /&gt;    this-&amp;gt;length = 0;&lt;br /&gt;    &lt;br /&gt;    for ( Node&amp;lt;Type&amp;gt; * p = list.head; p; p = p-&amp;gt;getNext( ) ) {&lt;br /&gt;        this-&amp;gt;insert( p-&amp;gt;getData( ) );&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;template &amp;lt;typename Type&amp;gt;&lt;br /&gt;bool List&amp;lt;Type&amp;gt;::insert( Type data ) {&lt;br /&gt;    Node&amp;lt;Type&amp;gt; * node = new Node&amp;lt;Type&amp;gt;( data );&lt;br /&gt;    if ( 0 == node ) return false;&lt;br /&gt;    if ( 0 == head ) {&lt;br /&gt;        this-&amp;gt;head = this-&amp;gt;tail = node;&lt;br /&gt;    } else {&lt;br /&gt;        this-&amp;gt;tail-&amp;gt;setNext( node );&lt;br /&gt;        this-&amp;gt;tail = node;&lt;br /&gt;    }&lt;br /&gt;    this-&amp;gt;length++;&lt;br /&gt;    return true;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;template &amp;lt;typename Type&amp;gt;&lt;br /&gt;void List&amp;lt;Type&amp;gt;::insertSorted( Type data ) {&lt;br /&gt;    if ( this-&amp;gt;isEmpty( ) ) {&lt;br /&gt;        this-&amp;gt;insert( data );&lt;br /&gt;    } else {&lt;br /&gt;        Node&amp;lt;Type&amp;gt; * node = new Node&amp;lt;Type&amp;gt;( data );&lt;br /&gt;        Node&amp;lt;Type&amp;gt; * p = head, * q; &lt;br /&gt;        while ( p-&amp;gt;getNext( ) &amp;amp;&amp;amp; data &amp;gt; p-&amp;gt;getData( ) ) {&lt;br /&gt;            q = p;&lt;br /&gt;            p = p-&amp;gt;getNext( );&lt;br /&gt;        }&lt;br /&gt;        if ( p == head ) { //insert beginning of the list&lt;br /&gt;            node-&amp;gt;setNext( head );&lt;br /&gt;            head = node;&lt;br /&gt;        } else if ( p-&amp;gt;getNext( ) == 0 ) {  //insert end of the list&lt;br /&gt;            p-&amp;gt;setNext( node );&lt;br /&gt;            this-&amp;gt;tail = node;&lt;br /&gt;        } else { //insert &lt;br /&gt;            node-&amp;gt;setNext( p );&lt;br /&gt;            q-&amp;gt;setNext( node );&lt;br /&gt;        }&lt;br /&gt;        this-&amp;gt;length++;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;template &amp;lt;typename Type&amp;gt;&lt;br /&gt;void List&amp;lt;Type&amp;gt;::print( std::ostream &amp;amp; out ) const {&lt;br /&gt;    for ( Node&amp;lt;Type&amp;gt; * p = head; p; p = p-&amp;gt;getNext( ) ) {&lt;br /&gt;        out &amp;lt;&amp;lt; p-&amp;gt;getData( ) &amp;lt;&amp;lt; &amp;quot; - &amp;quot;; &lt;br /&gt;    }&lt;br /&gt;    out &amp;lt;&amp;lt; endl;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;template &amp;lt;typename Type&amp;gt;&lt;br /&gt;unsigned int List&amp;lt;Type&amp;gt;::size( ) const {&lt;br /&gt;    return length;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;template &amp;lt;typename Type&amp;gt;&lt;br /&gt;Type List&amp;lt;Type&amp;gt;::get( unsigned int index ) const {&lt;br /&gt;    if ( this-&amp;gt;isEmpty( ) ) {&lt;br /&gt;        throw &amp;quot;List is empty.&amp;quot;;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    if ( index &amp;gt;= this-&amp;gt;length ) &lt;br /&gt;        throw &amp;quot;Index is out of boundary.&amp;quot;;  &lt;br /&gt;    &lt;br /&gt;    int counter = 0;&lt;br /&gt;    Node&amp;lt;Type&amp;gt; *p = this-&amp;gt;head;&lt;br /&gt;    while ( p &amp;amp;&amp;amp; ( counter &amp;lt; index ) ) {&lt;br /&gt;        counter++;&lt;br /&gt;        p = p-&amp;gt;getNext( );&lt;br /&gt;    }&lt;br /&gt;    return p-&amp;gt;getData( );&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;template &amp;lt;typename Type&amp;gt;&lt;br /&gt;void List&amp;lt;Type&amp;gt;::reverse( ) {&lt;br /&gt;    Node&amp;lt;Type&amp;gt; * p, * q, * r;&lt;br /&gt;    p = q = r = 0;&lt;br /&gt;    r = this-&amp;gt;head;&lt;br /&gt;    while ( r ) {&lt;br /&gt;        q = p;&lt;br /&gt;        p = r;&lt;br /&gt;        r = r-&amp;gt;getNext( );&lt;br /&gt;        p-&amp;gt;setNext( q );&lt;br /&gt;    }&lt;br /&gt;    this-&amp;gt;head = p;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;template &amp;lt;typename Type&amp;gt;&lt;br /&gt;const List&amp;lt;Type&amp;gt; &amp;amp; List&amp;lt;Type&amp;gt;::getFirstHalf( ) const {&lt;br /&gt;    List&amp;lt;Type&amp;gt; *list = new List( );&lt;br /&gt;    Node&amp;lt;Type&amp;gt; *p, *q;&lt;br /&gt;    q = p = this-&amp;gt;head;&lt;br /&gt;    &lt;br /&gt;    int counter = 1;&lt;br /&gt;    while ( p ) {&lt;br /&gt;        p = p-&amp;gt;getNext( );&lt;br /&gt;        if( counter++ % 2 == 0 ) {&lt;br /&gt;            list-&amp;gt;insert( q-&amp;gt;getData( ) );&lt;br /&gt;            q = q-&amp;gt;getNext( );&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    return *list;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;template &amp;lt;typename Type&amp;gt;&lt;br /&gt;const Node&amp;lt;Type&amp;gt; * List&amp;lt;Type&amp;gt;::getMidNode( ) const {&lt;br /&gt;    Node&amp;lt;Type&amp;gt; *p, *q;&lt;br /&gt;    q = p = this-&amp;gt;head;&lt;br /&gt;    &lt;br /&gt;    int counter = 1;&lt;br /&gt;    while ( p ) {&lt;br /&gt;        p = p-&amp;gt;getNext( );&lt;br /&gt;        if( counter++ % 2 == 0 ) {&lt;br /&gt;            q = q-&amp;gt;getNext( );&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    return q;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;template &amp;lt;typename Type&amp;gt;&lt;br /&gt;bool List&amp;lt;Type&amp;gt;::isEmpty( ) const {&lt;br /&gt;    if ( 0 == this-&amp;gt;head ) return true;&lt;br /&gt;    return false;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/*********************************&lt;br /&gt;** n between 0 and length - 1 &lt;br /&gt;**********************************/&lt;br /&gt;template &amp;lt;typename Type&amp;gt;&lt;br /&gt;bool List&amp;lt;Type&amp;gt;::remove( unsigned int n ) {&lt;br /&gt;    if ( n &amp;gt;= this-&amp;gt;length ) return false;&lt;br /&gt;    if ( this-&amp;gt;length == 1 ) {&lt;br /&gt;        this-&amp;gt;clear( );&lt;br /&gt;        return true;&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    int counter = 0;&lt;br /&gt;    Node&amp;lt;Type&amp;gt; *p, *q;&lt;br /&gt;    q = p = this-&amp;gt;head;&lt;br /&gt;    while ( counter++ &amp;lt; n &amp;amp;&amp;amp; p ) {&lt;br /&gt;        q = p;&lt;br /&gt;        p = p-&amp;gt;getNext( );&lt;br /&gt;    }&lt;br /&gt;    if ( counter &amp;lt;= n ) return false;&lt;br /&gt;    &lt;br /&gt;    if ( p == this-&amp;gt;head ) {&lt;br /&gt;        this-&amp;gt;head = p-&amp;gt;getNext( );&lt;br /&gt;    } &lt;br /&gt;    else {&lt;br /&gt;        q-&amp;gt;setNext( p-&amp;gt;getNext( ) );&lt;br /&gt;    }&lt;br /&gt;    if ( p == this-&amp;gt;tail ) {&lt;br /&gt;        this-&amp;gt;tail = q;&lt;br /&gt;    } &lt;br /&gt;    &lt;br /&gt;    delete p;&lt;br /&gt;    this-&amp;gt;length--;&lt;br /&gt;    return true;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/******************************&lt;br /&gt;** n between 0 and length - 1&lt;br /&gt;*******************************/&lt;br /&gt;template &amp;lt;typename Type&amp;gt;&lt;br /&gt;bool List&amp;lt;Type&amp;gt;::removeAtLast( unsigned int n ) {&lt;br /&gt;    return this-&amp;gt;remove( this-&amp;gt;length - n - 1 );    &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;template &amp;lt;typename Type&amp;gt;&lt;br /&gt;const List&amp;lt;Type&amp;gt; &amp;amp; List&amp;lt;Type&amp;gt;::operator =( const List&amp;lt;Type&amp;gt; &amp;amp; list ) {&lt;br /&gt;    this-&amp;gt;clear( );&lt;br /&gt;    &lt;br /&gt;    for ( Node&amp;lt;Type&amp;gt; * p = list.head; p; p = p-&amp;gt;getNext( ) ) {&lt;br /&gt;        this-&amp;gt;insert( p-&amp;gt;getData( ) );&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return *this;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;template &amp;lt;typename Type&amp;gt;&lt;br /&gt;List&amp;lt;Type&amp;gt; List&amp;lt;Type&amp;gt;::operator +(const List&amp;lt;Type&amp;gt; &amp;amp; list) const {&lt;br /&gt;    List&amp;lt;Type&amp;gt; result;&lt;br /&gt;    &lt;br /&gt;    for ( Node&amp;lt;Type&amp;gt; * p = this-&amp;gt;head; p; p = p-&amp;gt;getNext( ) ) {&lt;br /&gt;        result.insert( p-&amp;gt;getData( ) );&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    for ( Node&amp;lt;Type&amp;gt; * p = list.head; p; p = p-&amp;gt;getNext( ) ) {&lt;br /&gt;        result.insert( p-&amp;gt;getData( ) );&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return result;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;template &amp;lt;typename Type&amp;gt;&lt;br /&gt;void List&amp;lt;Type&amp;gt;::operator += ( const List&amp;lt;Type&amp;gt; &amp;amp; list ) {&lt;br /&gt;    for ( Node&amp;lt;Type&amp;gt; *p = list.head; p; p = p-&amp;gt;getNext( ) ) {&lt;br /&gt;        this-&amp;gt;insert( p-&amp;gt;getData( ) );&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;template &amp;lt;typename Type&amp;gt;&lt;br /&gt;bool List&amp;lt;Type&amp;gt;::operator == ( const List&amp;lt;Type&amp;gt; &amp;amp; list ) const {&lt;br /&gt;    if ( this-&amp;gt;length != list.length ) return false;&lt;br /&gt;    Node&amp;lt;Type&amp;gt; *p = this-&amp;gt;head, *q = list.head;&lt;br /&gt;    while ( p &amp;amp;&amp;amp; q ) {&lt;br /&gt;        if ( p-&amp;gt;getData( ) != q-&amp;gt;getData( ) ) return false;&lt;br /&gt;        p = p-&amp;gt;getNext( );&lt;br /&gt;        q = q-&amp;gt;getNext( );&lt;br /&gt;    }&lt;br /&gt;    if ( (p &amp;amp;&amp;amp; !q) &amp;#124;&amp;#124; (!p &amp;amp;&amp;amp; q) ) return false;&lt;br /&gt;    return true;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;template &amp;lt;typename Type&amp;gt;&lt;br /&gt;bool List&amp;lt;Type&amp;gt;::operator != ( const List&amp;lt;Type&amp;gt; &amp;amp; list ) const {&lt;br /&gt;    return !( this-&amp;gt;operator==( list ) );&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;template &amp;lt;typename Type&amp;gt;&lt;br /&gt;void List&amp;lt;Type&amp;gt;::clear( ) {&lt;br /&gt;    Node&amp;lt;Type&amp;gt; *p = this-&amp;gt;head, *next;&lt;br /&gt;    while ( p ) {&lt;br /&gt;        next = p-&amp;gt;getNext( );&lt;br /&gt;        delete p;&lt;br /&gt;        p = next;&lt;br /&gt;    }&lt;br /&gt;    this-&amp;gt;head = 0;&lt;br /&gt;    this-&amp;gt;tail = 0;&lt;br /&gt;    this-&amp;gt;length = 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;template &amp;lt;typename Type&amp;gt;&lt;br /&gt;List&amp;lt;Type&amp;gt;::~List( ) {&lt;br /&gt;    this-&amp;gt;clear( );&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/570164179299572192-7767355240643238727?l=mustafasoyvural.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mustafasoyvural.blogspot.com/feeds/7767355240643238727/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=570164179299572192&amp;postID=7767355240643238727' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/570164179299572192/posts/default/7767355240643238727'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/570164179299572192/posts/default/7767355240643238727'/><link rel='alternate' type='text/html' href='http://mustafasoyvural.blogspot.com/2007/12/linked-list-class.html' title='Linked List Class'/><author><name>vecii</name><uri>http://www.blogger.com/profile/03694394965687336378</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='26' src='http://1.bp.blogspot.com/_x7B_5iQ7s5g/SKKKNTU_OqI/AAAAAAAAAEU/1deWKlLP24Y/s1600-R/Photo-0152-y.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-570164179299572192.post-2556240270361443512</id><published>2007-12-11T17:02:00.000-08:00</published><updated>2007-12-17T03:01:37.579-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Algorithm'/><category scheme='http://www.blogger.com/atom/ns#' term='Data Structures'/><title type='text'>Linked List</title><content type='html'>hi,&lt;br /&gt;i wanna just give some problems of linked list and solutions. &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Q.1.)&lt;/span&gt;Given a singly-linked, find out the mid point of a single linked list in a &lt;br /&gt;single parse of the list. Assume the program would be loaded in read-only &lt;br /&gt;memory so no manipulation of the list is allowed.&lt;br /&gt;&lt;br /&gt;Having two pointers makes easy to implement gettig middle node of a linked list.&lt;br /&gt;while one pointer goes on the whole list the other pointer goes as half as first pinter's.&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;node_t * get_mid_node( list_t * list ) {&lt;br /&gt;    node_t *p, *q; &lt;br /&gt;    int counter = 1;&lt;br /&gt;    if ( NULL == list ) return NULL;&lt;br /&gt;    p = list-&amp;gt;head;&lt;br /&gt;    q = list-&amp;gt;head;&lt;br /&gt;&lt;br /&gt;    while ( p ) {&lt;br /&gt;        p = p-&amp;gt;next;&lt;br /&gt;        if ( counter++ 2 == 0 ) {&lt;br /&gt;            q = q-&amp;gt;next;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    return q;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Q.2.)&lt;/span&gt;Given: 2 Unsorted single linked list&lt;br /&gt;&lt;br /&gt;Todo: Fastest and optimised way to merge and make a single sorted list with&lt;br /&gt;these 2 unsorted single linked list.&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;list_t * get_intersection_of_two_sorted_list ( list_t * list1, list_t * list2 ) {&lt;br /&gt;    node_t *first, *second;&lt;br /&gt;    list_t *intersection_list;&lt;br /&gt;    if ( !list1 &amp;#124;&amp;#124; !list2 )    return NULL;&lt;br /&gt;&lt;br /&gt;    intersection_list = ( list_t * ) malloc( sizeof( list_t ) );&lt;br /&gt;    if ( NULL == intersection_list ) {&lt;br /&gt;        fprintf(stderr, &amp;quot;Bad memory allocation error\n&amp;quot;);&lt;br /&gt;        return NULL;&lt;br /&gt;    }&lt;br /&gt;    while ( first &amp;amp;&amp;amp; second ) {&lt;br /&gt;        if ( first-&amp;gt;data &amp;lt; second-&amp;gt;data ) first = first-&amp;gt;next;&lt;br /&gt;        else if ( second-&amp;gt;data &amp;lt; first-&amp;gt;data ) second = second-&amp;gt;next;&lt;br /&gt;        else {&lt;br /&gt;            add_list( intersection_list, first-&amp;gt;data );&lt;br /&gt;            first = first-&amp;gt;next;&lt;br /&gt;            second = second-&amp;gt;next;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Q.3.)&lt;/span&gt;Given a linked list, your are asked to find out the nth last element in&lt;br /&gt;the linked-list. (n would be given as the argument to the function)&lt;br /&gt;&lt;br /&gt;Last nth element is ( l - n + 1)th element from the beginning, so having two pointers:&lt;br /&gt;- Two pointers indicates the list-&gt;head at first&lt;br /&gt;- First pointer goes to nth node from the beginning&lt;br /&gt;- Both pointers goes simultaneously until first pointer comes to the end of the list&lt;br /&gt;- Now second pointer walks ( l - n ) nodes, head node is also assumed one walk for two pointers.&lt;br /&gt;- Then secod pointer now indicates &lt;span style="font-weight:bold;"&gt;the last nth element&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Test Cases&lt;/span&gt;:&lt;br /&gt;- List is null&lt;br /&gt;- List is empty&lt;br /&gt;- List with length 1 ( get 1 )&lt;br /&gt;- List with length 2 ( get 1, 2 )&lt;br /&gt;- List with length 3 ( get 3, 1, 2  )&lt;br /&gt;- Any value larger than the size of list&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;int getLastNth( list_t *list, unsigned int n ) {&lt;br /&gt;    int counter;&lt;br /&gt;    node_t *p, *q;&lt;br /&gt;    &lt;br /&gt;    if ( NULL == list ) {&lt;br /&gt;        fprintf( stderr, &amp;quot;list is null...(getLastNth)\n&amp;quot; );&lt;br /&gt;        exit(1);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    p = list-&amp;gt;head;&lt;br /&gt;    q = list-&amp;gt;head;&lt;br /&gt;    for ( counter = 0; p &amp;amp;&amp;amp; counter &amp;lt; n - 1; p = p-&amp;gt;next, counter++ );&lt;br /&gt;&lt;br /&gt;    if ( NULL == p ) {&lt;br /&gt;        fprintf( stderr, &amp;quot;Index is out boundary...(getLastNth)\n&amp;quot; );&lt;br /&gt;        exit(1);&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    while ( p-&amp;gt;next ) {&lt;br /&gt;        q = q-&amp;gt;next;&lt;br /&gt;        p = p-&amp;gt;next;&lt;br /&gt;    }&lt;br /&gt;    return q-&amp;gt;data;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Q.4.)&lt;/span&gt;Print reverse order of a singly linked list.&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;void print_list_reverse_order( node_t * head ) {&lt;br /&gt;    if ( NULL == head ) return;&lt;br /&gt;    print_list_reverse_order( head-&amp;gt;next );&lt;br /&gt;    printf(&amp;quot;%d\n&amp;quot;, head-&amp;gt;data);&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/570164179299572192-2556240270361443512?l=mustafasoyvural.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mustafasoyvural.blogspot.com/feeds/2556240270361443512/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=570164179299572192&amp;postID=2556240270361443512' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/570164179299572192/posts/default/2556240270361443512'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/570164179299572192/posts/default/2556240270361443512'/><link rel='alternate' type='text/html' href='http://mustafasoyvural.blogspot.com/2007/12/linked-list.html' title='Linked List'/><author><name>vecii</name><uri>http://www.blogger.com/profile/03694394965687336378</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='26' src='http://1.bp.blogspot.com/_x7B_5iQ7s5g/SKKKNTU_OqI/AAAAAAAAAEU/1deWKlLP24Y/s1600-R/Photo-0152-y.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-570164179299572192.post-3149929231833330931</id><published>2007-12-11T13:26:00.000-08:00</published><updated>2007-12-11T16:31:29.734-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Algorithm'/><title type='text'>An Impressing Operator (Xor)</title><content type='html'>Now, lets talk about Xor operator. You can use this operator in many ways that you will see in some exercises here.&lt;br /&gt;&lt;br /&gt;i ll give some remindful information about Xor gate:&lt;br /&gt;- it yields 1 if there exists odd number of 1 value inputs&lt;br /&gt;- x Xor 1 = not(x)&lt;br /&gt;- x Xor 0 = x&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Q.1.)&lt;/span&gt; Given two arrays A and B. Array 'A' contains all the elements of 'B' but&lt;br /&gt;one more element extra.....&lt;br /&gt;&lt;br /&gt;Find out the extra element......&lt;br /&gt;&lt;br /&gt;Restrictions: Dont use any relational ops ( &gt; or &gt; or == etc....), array&lt;br /&gt;elements are not in order ...,&lt;br /&gt;&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;int getDistinctElementFromTwoArrays( int arr1[ ], int len1, int arr2[ ], int len2 ) {&lt;br /&gt;    if ( len1 &amp;lt; 0 &amp;#124;&amp;#124; len2 &amp;lt; 0 ) throw out_of_range( &amp;quot;Length of arrays must be bigger than 0.&amp;quot; );&lt;br /&gt;    &lt;br /&gt;    int result = arr1[ 0 ];&lt;br /&gt;    for ( int i = 1; i &amp;lt; len1; i++ ) {&lt;br /&gt;        result ^= arr1[ i ];&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    for ( int i = 0; i &amp;lt; len2; i++ ) {&lt;br /&gt;        result ^= arr2[ i ];&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return result;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;&lt;br /&gt;using namespace std;&lt;br /&gt;&lt;br /&gt;int main ( int argc, char *argv[] ) {&lt;br /&gt;    try {&lt;br /&gt;        int arr1[ ] = { 1, 3, 5, 6, 7, -1, -3 };&lt;br /&gt;        int arr2[ ] = { 7, -3, 6, 1, -1, 5 };&lt;br /&gt;        int len1 = sizeof( arr1 ) / sizeof( arr1[ 0 ] )&lt;br /&gt;        int len2 = sizeof( arr2 ) / sizeof( arr2[ 0 ] );&lt;br /&gt;        &lt;br /&gt;        cout &amp;lt;&amp;lt; getDistinctElementFromTwoArrays( arr1, len1, arr2, len2 ) &amp;lt;&amp;lt; endl;&lt;br /&gt;    }&lt;br /&gt;    catch ( out_of_range orex ) {&lt;br /&gt;        cout &amp;lt;&amp;lt; orex.what( ) &amp;lt;&amp;lt; endl;&lt;br /&gt;    }&lt;br /&gt;    return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Q.2.)&lt;/span&gt;Given an array of numbers, except for one number all the others, occur&lt;br /&gt;twice. Give an algorithm to find that number which occurs only once in the&lt;br /&gt;array.&lt;br /&gt;&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;int getDistinctElement( int arr1[], int len1 ) {&lt;br /&gt;    if ( len1 &amp;lt; 0 ) throw  out_of_range(&amp;quot;Length must be bigger than 0&amp;quot;);&lt;br /&gt;    int result = arr1[ 0 ];&lt;br /&gt;    &lt;br /&gt;    for ( int i = 1; i &amp;lt; len1; i++ ) {&lt;br /&gt;        result ^= arr1[ i ];&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return result;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;&lt;br /&gt;#include &amp;lt;stdexcept&amp;gt;&lt;br /&gt;using namespace std;&lt;br /&gt;&lt;br /&gt;int main ( int argc, char *argv[] ) {&lt;br /&gt;    try {&lt;br /&gt;        int arr1[ ] = { -1, 1, 2, 3, 2, 1, -1 };&lt;br /&gt;        int len1 = sizeof( arr1 ) / sizeof( arr1[ 0 ] );&lt;br /&gt;                &lt;br /&gt;        cout &amp;lt;&amp;lt; getDistinctElement( arr1, len1 ) &amp;lt;&amp;lt; endl;&lt;br /&gt;    }&lt;br /&gt;    catch ( out_of_range orex ) {&lt;br /&gt;        cout &amp;lt;&amp;lt; orex.what( ) &amp;lt;&amp;lt; endl;&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    return 0;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/570164179299572192-3149929231833330931?l=mustafasoyvural.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mustafasoyvural.blogspot.com/feeds/3149929231833330931/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=570164179299572192&amp;postID=3149929231833330931' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/570164179299572192/posts/default/3149929231833330931'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/570164179299572192/posts/default/3149929231833330931'/><link rel='alternate' type='text/html' href='http://mustafasoyvural.blogspot.com/2007/12/impressing-operator-xor.html' title='An Impressing Operator (Xor)'/><author><name>vecii</name><uri>http://www.blogger.com/profile/03694394965687336378</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='26' src='http://1.bp.blogspot.com/_x7B_5iQ7s5g/SKKKNTU_OqI/AAAAAAAAAEU/1deWKlLP24Y/s1600-R/Photo-0152-y.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-570164179299572192.post-7503038401567829533</id><published>2007-12-11T05:36:00.000-08:00</published><updated>2007-12-17T23:20:30.552-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Algorithm'/><title type='text'>Shifting Operation</title><content type='html'>Hi, there is a good division and multiplication method by using shifting.&lt;br /&gt;Lets take an example 833794 and divide this number by 10, shift this number to right only once: 83379, and if you want to divide by 100 shift this number to right twice:&lt;br /&gt;8337. The same method is validate also for multiplication with only a little bit change, that is, only shift to left.&lt;br /&gt;&lt;br /&gt;Now lets do some exercises :)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Q.1.)&lt;/span&gt;Given a numbers x and n, where n is a power of 2, write C code, which&lt;br /&gt;gives the multiple of n which is greater than or equal to x.&lt;br /&gt;ex :&lt;br /&gt;I/P: 13 8&lt;br /&gt;O/P: 16&lt;br /&gt;&lt;br /&gt;I/P: 17 16&lt;br /&gt;O/P: 32&lt;br /&gt;&lt;br /&gt;The challenge: Do not use division or modulo operator.&lt;br /&gt;&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;unsigned int getBiggerPowerOf2( unsigned int x, unsigned int n ) {&lt;br /&gt;   if ( n == 0 ) return 0;&lt;br /&gt;   while ( n &amp;lt; x  ) {&lt;br /&gt;       n = n &amp;lt;&amp;lt; 1;&lt;br /&gt;   }&lt;br /&gt;   return n;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Q.2.)&lt;/span&gt;Write a C function, which takes a number n and positions p1 and p2 and returns if the the bits at positions p1 and p2 are set or not.&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;bool isBitsSet( int num, int p1, int p2 ) {&lt;br /&gt;    int temp = 0;&lt;br /&gt;    temp = ( 1 &amp;lt;&amp;lt; (p1 - 1) ) + ( 1 &amp;lt;&amp;lt; (p2 - 1) );&lt;br /&gt;    num = num &amp;amp; temp;&lt;br /&gt;    if ( num == temp ) return true;&lt;br /&gt;    return false;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Q.3.)&lt;/span&gt;Write a C function, which takes a number n and positions p1 and p2 and returns if the the bits at positions p1 and p2 are same or not.&lt;br /&gt;&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;bool isSameBits( int num, int p1, int p2 ) {&lt;br /&gt;    int temp = num;&lt;br /&gt;    &lt;br /&gt;    temp = 1 &amp;amp; ( temp &amp;gt;&amp;gt; (p1 - 1) );&lt;br /&gt;    num = 1 &amp;amp; ( num &amp;gt;&amp;gt; (p2 - 1) );&lt;br /&gt;    &lt;br /&gt;    return ( temp == num );&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Q.4.)&lt;/span&gt; Give a fast way to multiply a number by 7.&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;    number * 8 = number &amp;lt;&amp;lt; 3;&lt;br /&gt;    number = ( number &amp;lt;&amp;lt; 3 ) - number;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/570164179299572192-7503038401567829533?l=mustafasoyvural.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mustafasoyvural.blogspot.com/feeds/7503038401567829533/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=570164179299572192&amp;postID=7503038401567829533' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/570164179299572192/posts/default/7503038401567829533'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/570164179299572192/posts/default/7503038401567829533'/><link rel='alternate' type='text/html' href='http://mustafasoyvural.blogspot.com/2007/12/divide-and-multiply-by-2.html' title='Shifting Operation'/><author><name>vecii</name><uri>http://www.blogger.com/profile/03694394965687336378</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='26' src='http://1.bp.blogspot.com/_x7B_5iQ7s5g/SKKKNTU_OqI/AAAAAAAAAEU/1deWKlLP24Y/s1600-R/Photo-0152-y.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-570164179299572192.post-5650941202945236406</id><published>2007-11-27T23:26:00.000-08:00</published><updated>2007-12-03T01:23:12.707-08:00</updated><title type='text'>Reverse a stack "in-place"</title><content type='html'>&lt;span style="font-size:100%;"&gt;While i am searchig data structure questions on&lt;br /&gt;the net, i encountered a very nice question&lt;br /&gt;about stacks.Thanks Gowri Kumar for this&lt;br /&gt;question and solution.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;Write a C Program to reverse a stack "in place"&lt;br /&gt;using recursion ?&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;You can only use the following ADT functions&lt;br /&gt;on Stack:&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;IsEmpty&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;IsFull&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;Push&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;Pop&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;Top&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;What we require is:&lt;br /&gt;Before : A B C D&lt;br /&gt;After  : D C B A&lt;br /&gt;&lt;br /&gt;Before : A B C D&lt;br /&gt;Step 1 : D A B C&lt;br /&gt;Step 2 : D C A B&lt;br /&gt;Step 3 : D C B A&lt;br /&gt;&lt;br /&gt;Basically, at each step I am bringing the&lt;br /&gt;bottom most element to the top of the&lt;br /&gt;stack and pushing all the other elements one&lt;br /&gt;down (this I call Percolate, (pecolating up).&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;void percolate_up( stack_t *stack ) {&lt;br /&gt;    int a, b;&lt;br /&gt;    if ( !stack ) return;&lt;br /&gt;    a = Pop( stack );&lt;br /&gt;    if ( isEmpty( stack ) ) {&lt;br /&gt;        Push( stack, a );&lt;br /&gt;        return;&lt;br /&gt;    }&lt;br /&gt;    percolate_up( stack );&lt;br /&gt;    b = Pop( stack );&lt;br /&gt;    Push( stack, a );&lt;br /&gt;    Push( stack, b );&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Before(Step 0) : A B C D&lt;br /&gt;After (Step 1) : D A B C&lt;br /&gt;&lt;br /&gt;| A B C D&lt;br /&gt;a = A | B C D&lt;br /&gt;a = B | C D&lt;br /&gt;Now only two elements in the stack, do a&lt;br /&gt;direct reversal&lt;br /&gt;a = C    | D&lt;br /&gt;b = D    |&lt;br /&gt;Push(a)  | C&lt;br /&gt;Push(b)  | D C&lt;br /&gt;b = D&lt;br /&gt;Push(a)    | B C&lt;br /&gt;Push(b)    | D B C&lt;br /&gt;b = D      | B C&lt;br /&gt;Push(a)    | A B C&lt;br /&gt;Push(b)    | D A B C&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;void reverse_stack( stack_t * stack ) {&lt;br /&gt;    int a;&lt;br /&gt;    if ( !stack ) return;&lt;br /&gt;    if ( isEmpty( stack ) ) {&lt;br /&gt;        return;&lt;br /&gt;    }&lt;br /&gt;    percolate_up( stack );&lt;br /&gt;    a = Pop( stack );&lt;br /&gt;    reverse_stack( stack );&lt;br /&gt;    Push( stack, a );&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;I do it in the following steps:&lt;br /&gt;Before : A B C D&lt;br /&gt;&lt;br /&gt;After one PercolateUp&lt;br /&gt;Step 1 : D A B C&lt;br /&gt;After one PercolateUp&lt;br /&gt;Step 1 : D A B C&lt;br /&gt;&lt;br /&gt;D is in right postion, Pop it and do the Reverse&lt;br /&gt;on the remaining elements. After the reverse&lt;br /&gt;of remaining elements, push the element which&lt;br /&gt;we stored earlier.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;PercolateUp reminds me the Bubble Sort,&lt;br /&gt;which has a similar work mechanism.&lt;br /&gt;Bubble sort moves the largest element&lt;br /&gt;to the end of the list in each step&lt;br /&gt;and Percolate function moves&lt;br /&gt;the bottom element to the top of the&lt;br /&gt;list in each step similarly.&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Sorting a Stack "in-place"&lt;br /&gt;&lt;/span&gt;Lets think about how to sort a stack&lt;br /&gt;by stick to "in-place".&lt;br /&gt;Actually, i have given a hint when mentioned&lt;br /&gt;about the similarity between PercolateUp and&lt;br /&gt;Bubble Sort algorithm.&lt;br /&gt;Make some changes on PercolateUp:&lt;br /&gt;&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;void sorting_percolate_up( stack_t * stack ) {&lt;br /&gt;    int a, b;&lt;br /&gt;    a = Pop( stack );&lt;br /&gt;    if ( isEmpty( stack ) ) {&lt;br /&gt;        Push( stack, a );&lt;br /&gt;        return;&lt;br /&gt;    }&lt;br /&gt;    sorting_percolate_up( stack );&lt;br /&gt;    b = Pop( stack );&lt;br /&gt;    if ( a &amp;lt; b ) {&lt;br /&gt;        Push( stack, b );&lt;br /&gt;        Push( stack, a );&lt;br /&gt;    } else {&lt;br /&gt;        Push( stack, a );&lt;br /&gt;        Push( stack, b );&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;void sort_stack( stack_t * stack ) {&lt;br /&gt;    int a;&lt;br /&gt;    if ( !stack ) return;&lt;br /&gt;    if ( isEmpty( stack ) ) return;&lt;br /&gt;    sorting_percolate_up( stack );&lt;br /&gt;    a = Pop( stack );&lt;br /&gt;    sort_stack( stack );&lt;br /&gt;&lt;br /&gt;    Push( stack, a );&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Now, you have a stack sort function,&lt;br /&gt;by making a few changes.&lt;br /&gt;that's all :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/570164179299572192-5650941202945236406?l=mustafasoyvural.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mustafasoyvural.blogspot.com/feeds/5650941202945236406/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=570164179299572192&amp;postID=5650941202945236406' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/570164179299572192/posts/default/5650941202945236406'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/570164179299572192/posts/default/5650941202945236406'/><link rel='alternate' type='text/html' href='http://mustafasoyvural.blogspot.com/2007/11/reverse-stack-in-place.html' title='Reverse a stack &quot;in-place&quot;'/><author><name>vecii</name><uri>http://www.blogger.com/profile/03694394965687336378</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='26' src='http://1.bp.blogspot.com/_x7B_5iQ7s5g/SKKKNTU_OqI/AAAAAAAAAEU/1deWKlLP24Y/s1600-R/Photo-0152-y.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-570164179299572192.post-7807550490805691693</id><published>2007-10-30T01:52:00.000-07:00</published><updated>2007-12-03T06:39:09.168-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Data Structures'/><title type='text'>Binary Search Tree</title><content type='html'>&lt;span style="font-size:100%;"&gt;Hi you all:)&lt;br /&gt;i wanna just talk about binary search tree which is also familiar among most of the software engineers.&lt;br /&gt;&lt;br /&gt;BST (Binary Search Tree) has a few simple rules:&lt;br /&gt;- Each node must have a value&lt;br /&gt;- All the left subtree nodes must have values less than the node's value&lt;br /&gt;- All the right subtree nodes must have values greater or equal than the node's value&lt;br /&gt;&lt;br /&gt;As you can see, there are not any complexity to understand a search tree work mechanism, but a figure could be mohttp://www.youtube.com/watch?v=t3ASa4jpqgkre illustrative :))&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size:100%;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_x7B_5iQ7s5g/R0bnmc0IuQI/AAAAAAAAACg/ccVaktzkg8w/s1600-h/bst.bmp"&gt;&lt;img style="cursor: pointer;" src="http://bp1.blogger.com/_x7B_5iQ7s5g/R0bnmc0IuQI/AAAAAAAAACg/ccVaktzkg8w/s320/bst.bmp" alt="" id="BLOGGER_PHOTO_ID_5136047072818542850" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: left;"&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;After this introductory definition, and now it is the best time to do some exercises on BST. First of all, lets start with traversals of BST.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;1.&lt;/span&gt;&lt;span style="font-size:100%;"&gt; Inorder Traversal ( Left, Root, Right )&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;2.&lt;/span&gt;&lt;span style="font-size:100%;"&gt; Preorder Traversal (Root, Left, Right )&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;3.&lt;/span&gt;&lt;span style="font-size:100%;"&gt; Postorder Traversal ( Left, Right, Root )&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;//recursive inorder traversal&lt;br /&gt;void print_inorder( node_t *root) {&lt;br /&gt;if ( !root ) return;&lt;br /&gt;print_inorder( root-&amp;gt;left );&lt;br /&gt;printf( "%d ", root-&amp;gt;data );&lt;br /&gt;print_inorder( root-&amp;gt;right );&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;But you can convert recursive functions to iterative by using stack. Because, recursive functions use stack to hold parameters, local variables and return values in stack.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;//iterative inorder traversal&lt;br /&gt;void print_inorder_iter( node_t *root ) {&lt;br /&gt;stack_t stack;&lt;br /&gt;if ( !root ) return;&lt;br /&gt;initialize( &amp;amp;stack );&lt;br /&gt;&lt;br /&gt;do {&lt;br /&gt;while ( root ) {&lt;br /&gt;    Push( &amp;amp;stack, root );&lt;br /&gt;    root = root-&amp;gt;left;&lt;br /&gt;}&lt;br /&gt;if ( !isEmpty( &amp;amp;stack ) ) {&lt;br /&gt;    root = Pop( &amp;amp;stack );&lt;br /&gt;    printf("%d ", root-&amp;gt;data);&lt;br /&gt;}&lt;br /&gt;root = root-&amp;gt;right;&lt;br /&gt;} while ( root || !isEmpty( &amp;amp;stack ) );&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;//recursive preorder traversal&lt;br /&gt;void print_preorder( node_t *root ) {&lt;br /&gt;if ( !root ) return;&lt;br /&gt;printf( "%d ", root-&amp;gt;data );&lt;br /&gt;print_preorder( root-&amp;gt;left );&lt;br /&gt;print_preorder( root-&amp;gt;right );&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;//iterative preorder traversal&lt;br /&gt;void print_inorder_iter( node_t *root ) {&lt;br /&gt;stack_t stack;&lt;br /&gt;if ( !root ) return;&lt;br /&gt;initialize( &amp;amp;stack );&lt;br /&gt;&lt;br /&gt;do {&lt;br /&gt; while ( root ) {&lt;br /&gt;     Push( &amp;amp;stack, root );&lt;br /&gt;     root = root-&amp;gt;left;&lt;br /&gt; }&lt;br /&gt; if ( !isEmpty( &amp;amp;stack ) ) {&lt;br /&gt;     root = Pop( &amp;amp;stack );&lt;br /&gt;     printf("%d ", root-&amp;gt;data);&lt;br /&gt; }&lt;br /&gt; root = root-&amp;gt;right;&lt;br /&gt;} while ( root || !isEmpty( &amp;amp;stack ) );&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;//recursive postorder traversal&lt;br /&gt;void print_postorder( node_t *root ) {&lt;br /&gt;if ( !root ) return;&lt;br /&gt;print_postorder( root-&amp;gt;left );&lt;br /&gt;print_postorder( root-&amp;gt;right );&lt;br /&gt;printf( "%d ", root-&amp;gt;data );&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;1.)&lt;/span&gt;&lt;span style="font-size:100%;"&gt; How do you get the node numbers of a Binary Tree ?&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;//this is also known as size of a tree&lt;br /&gt;int get_node_numbers( node *root ) {&lt;br /&gt;if ( !root ) return 0;&lt;br /&gt;return  1 + get_node_numbers( root-&amp;gt;left ) + get_node_numbers( root-&amp;gt;right );&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;2.)&lt;/span&gt;&lt;span style="font-size:100%;"&gt; How do you get the Binary Tree height?&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;int get_tree_height( node *root ) {&lt;br /&gt;if ( !root ) return -1;&lt;br /&gt;return 1 + max( get_tree_height( root-&amp;gt;left ), get_tree_height( root-&amp;gt;right ) );&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;3.)&lt;/span&gt;&lt;span style="font-size:100%;"&gt; Get the sum of all nodes in a Binary Tree.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;int get_tree_sum( node *root ) {&lt;br /&gt;if ( !root ) return 0;&lt;br /&gt;return root-&amp;gt;data + get_tree_sum( root-&amp;gt;left ) + get_tree_sum( root-&amp;gt;right );&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;4.)&lt;/span&gt;&lt;span style="font-size:100%;"&gt; What is the number of leaves in a Binary Tree ?&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;int get_leaf_number( node *root ) {&lt;br /&gt;if ( !root ) return 0;&lt;br /&gt;if ( !root-&amp;gt;left &amp;amp;&amp;amp; !root-&amp;gt;right ) return 1;&lt;br /&gt;return get_leaf_number( root-&amp;gt;left ) + get_leaf_number( root-&amp;gt;right );&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;5.)&lt;/span&gt;&lt;span style="font-size:100%;"&gt; What is the minimum value in a Binary Tree?&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;int get_minimum_value( node *root ) {&lt;br /&gt;if ( !root ) return 0;&lt;br /&gt;&lt;br /&gt;while ( root-&amp;gt;left ) {&lt;br /&gt;   root = root-&amp;gt;left;&lt;br /&gt;}&lt;br /&gt;return root-&amp;gt;data;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;6.) &lt;/span&gt;&lt;span style="font-size:100%;"&gt;What is the maximum value in a Binary Tree ?&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;int get_maximum_value( node *root ) {&lt;br /&gt;if ( !root ) return 0;&lt;br /&gt;&lt;br /&gt;while ( root-&amp;gt;right ) {&lt;br /&gt;    root = root-&amp;gt;right;&lt;br /&gt;}&lt;br /&gt;return root-&amp;gt;data;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;7.)&lt;/span&gt;&lt;span style="font-size:100%;"&gt; Write a function that tests the binary tree whether it is a BST or not. Now, you must be careful about the maximum value of left subtree must be less than the current node's value and also the minimum of the right subtree must be greater than the current node's value.&lt;br /&gt;Lets discuss about this case in the below:&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;      12&lt;br /&gt;    /  \&lt;br /&gt;   9   13&lt;br /&gt;  / \&lt;br /&gt; 3  15&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;If you tests only nodes left and right value, then this tree will surprisingly become a BST which is a really bad situation for a developer :))&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;if&lt;/span&gt;&lt;span style="font-size:100%;"&gt; ( root-&gt;data &gt; root-&gt;left-&gt;data &amp;amp;&amp;amp; root-&gt;data &lt;&gt;right-&gt;data ) { ... }&lt;br /&gt;This control is not sufficient to test all cases, so be careful while writing all your test functions and try to consider all cases.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;Boolean isBinaryTree( node * root ) {&lt;br /&gt; if ( !root ) return True;&lt;br /&gt;&lt;br /&gt; if ( root-&amp;gt;left != NULL &amp;amp;&amp;amp; get_maximum_value( root-&amp;gt;left ) &amp;gt; root-&amp;gt;data )&lt;br /&gt;     return False;&lt;br /&gt;&lt;br /&gt; if ( root-&amp;gt;right != NULL &amp;amp;&amp;amp; get_minimum_value( root-&amp;gt;right ) &amp;lt;= root-&amp;gt;data )&lt;br /&gt;     return False;&lt;br /&gt;&lt;br /&gt; if ( isBinaryTree( root-&amp;gt;left ) || !isBinaryTree( root-&amp;gt;right ) )&lt;br /&gt;     return False;&lt;br /&gt; return True;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;8.)&lt;/span&gt;&lt;span style="font-size:100%;"&gt; Given a binary tree and a sum, return true if the tree has a root-to-leaf path such that adding up all the values along the path equals the given sum. Return false if no such path can be found.&lt;br /&gt;For example; for this tree and check path sum: 25&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;      12&lt;br /&gt;    /  \&lt;br /&gt;   9   13&lt;br /&gt;  / \&lt;br /&gt; 3  15&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;path1&lt;/span&gt;&lt;span style="font-size:100%;"&gt;: 12 - 9 - 3 : 24 ( false )&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;path2&lt;/span&gt;&lt;span style="font-size:100%;"&gt;: 12 - 9 - 15 : 36 ( false )&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;path3&lt;/span&gt;&lt;span style="font-size:100%;"&gt;: 12 - 13 : 25 ( true )&lt;br /&gt;&lt;br /&gt;To achieve this problem you will substract all nodes' value while traversiing nodes along a path.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;Boolean check_path_sum( node *root, int check_sum ) {&lt;br /&gt;    if ( !root ) {&lt;br /&gt;        return ( check_sum == 0 );&lt;br /&gt;    }&lt;br /&gt;    return ( check_path_sum( root-&amp;gt;left, check_sum - root-&amp;gt;data) &amp;#124;&amp;#124; check_path_sum( root-&amp;gt;right, check_sum - root-&amp;gt;data) );&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;&lt;br /&gt;9.)&lt;/span&gt;&lt;span style="font-size:100%;"&gt; Give back all nodes in a binary tree to memory, in other words you will free  a binary tree.  &lt;/span&gt;&lt;span style="font-style: italic;font-size:100%;" &gt;Hint&lt;/span&gt;&lt;span style="font-size:100%;"&gt; : If you free a parent before childs so how do you access childs adress, as a result of this problem you have to free childs before parent. As you can see, it is easy to see postorder traversal must be used.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;void free_tree( node *root ) {&lt;br /&gt;   if ( !root ) return;&lt;br /&gt;   free_tree( root-&amp;gt;left );&lt;br /&gt;   free_tree( root-&amp;gt;right );&lt;br /&gt;   free( root );&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;&lt;br /&gt;10.) &lt;/span&gt;&lt;span style="font-size:100%;"&gt;Change the roles of the left and right pointers of a node. Mirror a binary tree :)&lt;br /&gt;&lt;br /&gt;previous version:&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;      12&lt;br /&gt;    /  \&lt;br /&gt;   9   13&lt;br /&gt;  / \&lt;br /&gt; 3  15&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;mirror version:&lt;br /&gt;&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;      12&lt;br /&gt;    /  \&lt;br /&gt;   13   9&lt;br /&gt;  / \&lt;br /&gt; 15  3&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;void mirror_tree( node *root ) {&lt;br /&gt;   if ( !root ) return;&lt;br /&gt;   mirror_tree( root-&amp;gt;left );&lt;br /&gt;   mirror_tree( root-&amp;gt;right );&lt;br /&gt;&lt;br /&gt;   node *p = root-&amp;gt;left;&lt;br /&gt;   root-&amp;gt;left = root-&amp;gt;right;&lt;br /&gt;   root-&amp;gt;right = p;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;11.) &lt;/span&gt;For each node in a binary search tree, create a new duplicate node, and insert the duplicate as the left child of the original node. double a binary tree.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;void double_tree( node *root ) {&lt;br /&gt;   node *p;&lt;br /&gt;   if ( !root ) return;&lt;br /&gt;   double_tree( root-&amp;gt;left );&lt;br /&gt;   double_tree( root-&amp;gt;right );&lt;br /&gt;  &lt;br /&gt;   //take a new node&lt;br /&gt;   p = ( node * )malloc(sizeof(node));&lt;br /&gt;   p-&amp;gt;left = NULL;&lt;br /&gt;   p-&amp;gt;right = NULL;&lt;br /&gt;   p-&amp;gt;data = root-&amp;gt;data;&lt;br /&gt;  &lt;br /&gt;   if ( !root-&amp;gt;left ) {&lt;br /&gt;       root-&amp;gt;left = p;&lt;br /&gt;   }&lt;br /&gt;   else {&lt;br /&gt;       p-&amp;gt;left = root-&amp;gt;left;&lt;br /&gt;       root-&amp;gt;left = p;&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;12.)&lt;/span&gt;&lt;span style="font-size:100%;"&gt; Get the sum of path numbers from root to each leaves. I have also mentioned how to get the number of leaves in a binary tree. This is exactly equal to the path numbers of a binary tree from root to each leaves :)&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;&lt;br /&gt;13.) &lt;/span&gt;&lt;span style="font-size:100%;"&gt;Find the number of nodes between two nodes. The value of two nodes are given as first and second. Assume that two nodes are in the same subtree.&lt;br /&gt;First, you will search first value in the BST then search second value in the subtree of first.&lt;br /&gt;For example; BST is given in the follow, first 9 and second is 15.&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;      12&lt;br /&gt;    /  \&lt;br /&gt;   9   13&lt;br /&gt;  / \&lt;br /&gt; 3  15&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;First search 9 and then search 15 in the subtree of 9.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;    9&lt;br /&gt;  / \&lt;br /&gt; 3  15&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;node * lookup( node * root, int data ) {&lt;br /&gt;    if ( !root ) return NULL;&lt;br /&gt;    if ( data == root-&amp;gt;data ) return root;&lt;br /&gt;    else if ( data &amp;lt; root-&amp;gt;data ) return lookup( root-&amp;gt;left, data );&lt;br /&gt;    else return lookup( root-&amp;gt;right, data );&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;int get_number_between_two_nodes( node * root, int first, int second ) {&lt;br /&gt;    int counter = 0;&lt;br /&gt;    root = lookup( root, first );&lt;br /&gt;    //now, root points to first root     &lt;br /&gt;    if ( root == NULL ) return -1;&lt;br /&gt;    //find the last node&lt;br /&gt;    while ( root ) {&lt;br /&gt;        if ( second &amp;lt; root-&amp;gt;data ) {&lt;br /&gt;            counter++;&lt;br /&gt;            root = root-&amp;gt;left;&lt;br /&gt;        }&lt;br /&gt;        else if ( second &amp;gt; root-&amp;gt;data ) {&lt;br /&gt;            counter++;&lt;br /&gt;            root = root-&amp;gt;right;&lt;br /&gt;        }&lt;br /&gt;        else {&lt;br /&gt;            counter--;&lt;br /&gt;            break;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    if ( !root ) return -1;&lt;br /&gt;    if ( first == second ) return 0;&lt;br /&gt;    return counter;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:85%;" &gt;&lt;br /&gt;14.) &lt;/span&gt;&lt;span style="font-size:85%;"&gt;Print all paths from root to each leaf.&lt;br /&gt;&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;      12&lt;br /&gt;    /  \&lt;br /&gt;   9   13&lt;br /&gt;  / \&lt;br /&gt; 3  15&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;void print_array( int array[ ], int length ) {&lt;br /&gt;    int i = 0;&lt;br /&gt;    for ( i = 0; i &amp;lt; length; i++ ) {&lt;br /&gt;        printf( &amp;quot;%d - &amp;quot;, array[ i ] );&lt;br /&gt;    }&lt;br /&gt;    printf( &amp;quot;\n&amp;quot; );&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;void print_paths_rec( node * root, int path[ ], int len ) {&lt;br /&gt;    if ( !root ) return;&lt;br /&gt;    path[ len++ ] = root-&amp;gt;data;&lt;br /&gt;    if ( root-&amp;gt;left == NULL &amp;amp;&amp;amp; root-&amp;gt;right == NULL ) {&lt;br /&gt;        print_array( path, len );&lt;br /&gt;    }&lt;br /&gt;    print_paths_rec( root-&amp;gt;left, path, len );&lt;br /&gt;    print_paths_rec( root-&amp;gt;right, path, len );&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="source-code"&gt;&lt;code&gt;void print_paths( node *root ) {&lt;br /&gt;    int path[ 1000 ];&lt;br /&gt;    print_paths_rec( root, path, 0 );&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/570164179299572192-7807550490805691693?l=mustafasoyvural.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mustafasoyvural.blogspot.com/feeds/7807550490805691693/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=570164179299572192&amp;postID=7807550490805691693' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/570164179299572192/posts/default/7807550490805691693'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/570164179299572192/posts/default/7807550490805691693'/><link rel='alternate' type='text/html' href='http://mustafasoyvural.blogspot.com/2007/10/binary-search-tree.html' title='Binary Search Tree'/><author><name>vecii</name><uri>http://www.blogger.com/profile/03694394965687336378</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='26' src='http://1.bp.blogspot.com/_x7B_5iQ7s5g/SKKKNTU_OqI/AAAAAAAAAEU/1deWKlLP24Y/s1600-R/Photo-0152-y.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_x7B_5iQ7s5g/R0bnmc0IuQI/AAAAAAAAACg/ccVaktzkg8w/s72-c/bst.bmp' height='72' width='72'/><thr:total>0</thr:total></entry></feed>
