\documentclass{beamer} %include lhs2TeX.fmt \author{Piyush P Kurur\\ Office no: 224\\ Dept. of Comp. Sci. and Engg.\\ IIT Kanpur} \newcommand{\Token}[2][]{\node(#2#1)[token]{#2};} \newcommand{\Symbol}[2][]{\node(#2#1)[symbol]{#2};} \newcommand{\Point}[1]{\node(#1)[point]{#1};} \usepackage{tikz} \usetikzlibrary{positioning,shapes,chains,fit} \usetikzlibrary{shapes.symbols} \usetikzlibrary{matrix} \usetikzlibrary{backgrounds} \usetikzlibrary{shapes.geometric} \usepackage{multicol} \usepackage{algorithm2e} \usepackage{pgfkeys} %% \newcommand{\SingleLinkedList}[1]{ %% \foreach \datum/\anchor in {#1} %% \begin{scope} %% \node[rectangle, fill=yellow!30]{#2}; %% \node[rectangle, below, fill=green!30](#1){$\cdot$}; %% \end{scope} %% } %% \newcommand{\Null}{ %% \node[circle, fill=black, minimum size=1em]{}; %% } \pgfkeys {% /tikz/redbox/.style={% shape=rectangle,% minimum size=1.5em,% top color = white, % bottom color=red!50!black!50, inner sep=0pt, draw=black }, /tikz/null/.style={% shape=circle, minimum size=0.5em, draw=black, }, /tikz/greybox/.style={ shape=rectangle,% minimum width=7em,% minimum height=1.5em, fill=black!20, inner sep=0pt, draw=black }, /tikz/blackbox/.style={ shape=rectangle,% minimum width=7em,% minimum height=1.5em, fill=black, inner sep=0pt, draw=black }, /tikz/whitebox/.style={ shape=rectangle, minimum width=7em, minimum height=1.5em, draw=black }, /tikz/bluebox/.style={ shape=rectangle, minimum width=7em, minimum height=1.5em, fill=blue!40, draw=black }, /tikz/whitetape/.style={ shape=rectangle, minimum width=4em, minimum height=1.5em, draw=black }, /tikz/bluearr/.style={ ->, line width=0.25em, draw=blue!40 }, /tikz/greenarr/.style={ ->, line width=0.25em, draw=green!40!black!60 } } \newcommand{\arraythree}[4]{ \begin{tikzpicture}[node distance=0] \pgfsetstrokeopacity{#4}; \node[#1](a0#3){#2}; \node[#1, right=of a0#3](a1#3){#2}; \node[#1, right=of a1#3](a1#3){#2}; \end{tikzpicture} } \newcommand{\arraytwo}[4]{ \begin{tikzpicture}[node distance=0] \pgfsetstrokeopacity{#4}; \node[#1](a0#3){#2}; \node[#1,right=of a0#3]{#2}; \end{tikzpicture} } \newcommand{\Array}[0]{ \arraythree{box}{}{a}{1} } \newcommand{\AArray}[0]{% \arraythree{bbox}{\Array}{b}{0.5}} \newcommand{\AAArray}[0]{% \arraytwo{bbbox}{\AArray}{c}{0.25}} \newcommand{\T}[1]{\ensuremath{T\left(#1\right)}} \newcommand{\BigOh}[1]{\ensuremath{O\left(#1\right)}} \title{Fundamentals of Computing: Lecture 27} \date{October 9, 2009} \begin{document} \begin{frame} \maketitle \end{frame} \begin{frame} \frametitle{Recursive data types} \begin{itemize} \item List. \pause A list is either an empty list or an element followed by a list. \pause \item Binary trees. \pause A binary tree is either an empty Tree or a root node with two children left subtree and right subtree. \pause \item General trees (some times called Rose trees). \pause Either an empty tree or a node with a Forest of subtrees. \end{itemize} \end{frame} \begin{frame} \frametitle{List} \begin{spec} data List a = Empty | Cons a (List a) \end{spec} \pause \begin{code} typedef struct Cons Cons; typedef Cons *List struct Cons { int datum; List next; }; List emptyList = (List) NULL; \end{code} \end{frame} \begin{frame} \begin{code} int head(List l) { if( l == NULL) {error("head of an empty list");} else return l -> datum } List tail (List l) { if( l == NULL) {error("tail of an empty list");} else return l -> next } \end{code} \end{frame} \begin{frame} \frametitle{Some list functions} Function |singleton(x)| creates a list of just one element. \pause \begin{code} List singleton(int x){ List l; l = (List) malloc(sizeof(Cons)) if( l != NULL) { l -> datum = x; l -> next = NULL; } return l; } \end{code} \end{frame} \begin{frame} \begin{code} void appendTo(List *a, List b) { List ptr; if( *a == NULL){ *a = b; return; } ptr = *a; while(ptr -> next != NULL) { ptr = ptr -> next; } ptr -> next = b; return; } \end{code} \end{frame} \begin{frame} \frametitle{Reverse a list} \only<1> { \begin{tikzpicture}[node distance=1.25em] \node[null](leftnull){}; \node[redbox, right=of leftnull](a){2}; \node[right=of a](leftdots){$\ldots$}; \node[redbox, right=of leftdots, label=above:$\texttt{p}$](p){$42$}; \node[redbox, right=of p, label=above:$\texttt{q}$](q){$15$}; \node[redbox, right=of q, label=above:$\texttt{r}$](r){$100$}; \node[redbox, right=of r](rnext){$34$}; \node[right=of rnext](rightdots){$\ldots$}; \node[redbox, right=of rightdots](b){$1$}; \node[null, right=of b](rightnull){}; \draw[->, thick] (a) -- (leftnull); \draw[->, thick] (leftdots) -- (a); \draw[->, thick](p) -- (leftdots); \draw[->,thick](q) -- (r); \draw[->,thick](r) -- (rnext); \draw[->, thick](rnext)--(rightdots); \draw[->, thick](rightdots) -- (b); \draw[->, thick](b) -- (rightnull); \end{tikzpicture} } \only<2> { \begin{tikzpicture}[node distance=1.25em] \node[null](leftnull){}; \node[redbox, right=of leftnull](a){2}; \node[right=of a](leftdots){$\ldots$}; \node[redbox, right=of leftdots, label=above:$p$](p){$42$}; \node[redbox, right=of p, label=above:$q$](q){$15$}; \node[redbox, right=of q, label=above:$r$](r){$100$}; \node[redbox, right=of r](rnext){$34$}; \node[right=of rnext](rightdots){$\ldots$}; \node[redbox, right=of rightdots](b){$1$}; \node[null, right=of b](rightnull){}; \draw[->, thick] (a) -- (leftnull); \draw[->, thick] (leftdots) -- (a); \draw[->, thick](p) -- (leftdots); \draw[->,thick](q.east) to [out=0, in = 90] (p.north); \draw[->,thick](r) -- (rnext); \draw[->, thick](rnext)--(rightdots); \draw[->, thick](rightdots) -- (b); \draw[->, thick](b) -- (rightnull); \end{tikzpicture} } \only<3> { \begin{tikzpicture}[node distance=1.25em] \node[null](leftnull){}; \node[redbox, right=of leftnull](a){2}; \node[right=of a](leftdots){$\ldots$}; \node[redbox, right=of leftdots](p){$42$}; \node[redbox, right=of p, label=above:$\texttt{p,q}$](q){$15$}; \node[redbox, right=of q, label=above:$\texttt{r}$](r){$100$}; \node[redbox, right=of r](rnext){$34$}; \node[right=of rnext](rightdots){$\ldots$}; \node[redbox, right=of rightdots](b){$1$}; \node[null, right=of b](rightnull){}; \draw[->, thick] (a) -- (leftnull); \draw[->, thick] (leftdots) -- (a); \draw[->, thick](p) -- (leftdots); \draw[->,thick](q.east) to [out=0, in = 90] (p.north); \draw[->,thick](r) -- (rnext); \draw[->, thick](rnext)--(rightdots); \draw[->, thick](rightdots) -- (b); \draw[->, thick](b) -- (rightnull); \end{tikzpicture} } \only<4> { \begin{tikzpicture}[node distance=1.25em] \node[null](leftnull){}; \node[redbox, right=of leftnull](a){2}; \node[right=of a](leftdots){$\ldots$}; \node[redbox, right=of leftdots](p){$42$}; \node[redbox, right=of p, label=above:$\texttt{p}$](q){$15$}; \node[redbox, right=of q, label=above:$\texttt{q,r}$](r){$100$}; \node[redbox, right=of r](rnext){$34$}; \node[right=of rnext](rightdots){$\ldots$}; \node[redbox, right=of rightdots](b){$1$}; \node[null, right=of b](rightnull){}; \draw[->, thick] (a) -- (leftnull); \draw[->, thick] (leftdots) -- (a); \draw[->, thick](p) -- (leftdots); \draw[->,thick](q.east) to [out=0, in = 90] (p.north); \draw[->,thick](r) -- (rnext); \draw[->, thick](rnext)--(rightdots); \draw[->, thick](rightdots) -- (b); \draw[->, thick](b) -- (rightnull); \end{tikzpicture} } \only<5> { \begin{tikzpicture}[node distance=1.25em] \node[null](leftnull){}; \node[redbox, right=of leftnull](a){2}; \node[right=of a](leftdots){$\ldots$}; \node[redbox, right=of leftdots](p){$42$}; \node[redbox, right=of p, label=above:$\texttt{p}$](q){$15$}; \node[redbox, right=of q, label=above:$\texttt{q}$](r){$100$}; \node[redbox, right=of r, label=above:$\texttt{r}$](rnext){$34$}; \node[right=of rnext](rightdots){$\ldots$}; \node[redbox, right=of rightdots](b){$1$}; \node[null, right=of b](rightnull){}; \draw[->, thick] (a) -- (leftnull); \draw[->, thick] (leftdots) -- (a); \draw[->, thick](p) -- (leftdots); \draw[->,thick](q.east) to [out=0, in = 90] (p.north); \draw[->,thick](r) -- (rnext); \draw[->, thick](rnext)--(rightdots); \draw[->, thick](rightdots) -- (b); \draw[->, thick](b) -- (rightnull); \end{tikzpicture} } \only<6> { \begin{tikzpicture}[node distance=1.25em] \node[null](leftnull){}; \node[redbox, right=of leftnull](a){2}; \node[right=of a](leftdots){$\ldots$}; \node[redbox, right=of leftdots](p){$42$}; \node[redbox, right=of p, label=above:$\texttt{p}$](q){$15$}; \node[redbox, right=of q, label=above:$\texttt{q}$](r){$100$}; \node[redbox, right=of r, label=above:$\texttt{r}$](rnext){$34$}; \node[right=of rnext](rightdots){$\ldots$}; \node[redbox, right=of rightdots](b){$1$}; \node[null, right=of b](rightnull){}; \draw[->, thick] (a) -- (leftnull); \draw[->, thick] (leftdots) -- (a); \draw[->, thick](p) -- (leftdots); \draw[->,thick](q) -- (p); \draw[->,thick](r) -- (rnext); \draw[->, thick](rnext)--(rightdots); \draw[->, thick](rightdots) -- (b); \draw[->, thick](b) -- (rightnull); \end{tikzpicture} } \end{frame} \begin{frame} \begin{code} void reverse(List a) { List p,q,r; if( a == NULL) return; p = NULL; q = a; r = a -> next; while( r ) { q -> next = p; p = q; q = r; r = r -> next; } } \end{code} \end{frame} \end{document}