<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://wiki.kram.nz/index.php?action=history&amp;feed=atom&amp;title=SE250%3Alab-4%3Ajham005</id>
	<title>SE250:lab-4:jham005 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.kram.nz/index.php?action=history&amp;feed=atom&amp;title=SE250%3Alab-4%3Ajham005"/>
	<link rel="alternate" type="text/html" href="https://wiki.kram.nz/index.php?title=SE250:lab-4:jham005&amp;action=history"/>
	<updated>2026-04-08T11:24:11Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://wiki.kram.nz/index.php?title=SE250:lab-4:jham005&amp;diff=6072&amp;oldid=prev</id>
		<title>Mark: 2 revision(s)</title>
		<link rel="alternate" type="text/html" href="https://wiki.kram.nz/index.php?title=SE250:lab-4:jham005&amp;diff=6072&amp;oldid=prev"/>
		<updated>2008-11-03T05:19:34Z</updated>

		<summary type="html">&lt;p&gt;2 revision(s)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt; /*&lt;br /&gt;
   File: lab-4-soln.c&lt;br /&gt;
   Date: 1 April 2008&lt;br /&gt;
   Author: John Hamer&lt;br /&gt;
   Purpose: Sample solution to SOFTENG lab #4, 2008&lt;br /&gt;
 */&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;lt;assert.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 typedef int element_t;&lt;br /&gt;
 &lt;br /&gt;
 typedef&lt;br /&gt;
 struct Cons {&lt;br /&gt;
   element_t head;&lt;br /&gt;
   struct Cons* tail;&lt;br /&gt;
 } Cons;&lt;br /&gt;
 &lt;br /&gt;
 static Cons NIL = { 0, &amp;amp;NIL };&lt;br /&gt;
 Cons* nil = &amp;amp;NIL;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 Cons* cons( element_t elt, Cons* tail ) {&lt;br /&gt;
   Cons* cell = malloc( sizeof(Cons) );&lt;br /&gt;
   assert( cell != 0 );&lt;br /&gt;
   cell-&amp;gt;head = elt;&lt;br /&gt;
   cell-&amp;gt;tail = tail;&lt;br /&gt;
   return cell;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 void print_list( Cons* list ) {&lt;br /&gt;
   char* sep = &amp;quot;&amp;quot;;&lt;br /&gt;
   printf( &amp;quot;List[&amp;quot; );&lt;br /&gt;
   for( ; list != nil; list = list-&amp;gt;tail ) {&lt;br /&gt;
     printf( &amp;quot;%s%d&amp;quot;, sep, list-&amp;gt;head );&lt;br /&gt;
     sep = &amp;quot;,&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
   printf( &amp;quot;]\n&amp;quot; );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 int length( Cons* list ) {&lt;br /&gt;
   int len = 0;&lt;br /&gt;
   for( ; list != nil; list = list-&amp;gt;tail )&lt;br /&gt;
     len++;&lt;br /&gt;
   return len;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 element_t first(  Cons* list ) { return list-&amp;gt;head; }&lt;br /&gt;
 element_t second( Cons* list ) { return list-&amp;gt;tail-&amp;gt;head; }&lt;br /&gt;
 element_t third(  Cons* list ) { return list-&amp;gt;tail-&amp;gt;tail-&amp;gt;head; }&lt;br /&gt;
 element_t fourth( Cons* list ) { return list-&amp;gt;tail-&amp;gt;tail-&amp;gt;tail-&amp;gt;head; }&lt;br /&gt;
 &lt;br /&gt;
 element_t nth( int i, Cons* list ) {&lt;br /&gt;
   while( i-- &amp;gt; 0 )&lt;br /&gt;
     list = list-&amp;gt;tail;&lt;br /&gt;
   return list-&amp;gt;head;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 int equal( Cons* xs, Cons* ys ) {&lt;br /&gt;
   while( xs != nil &amp;amp;&amp;amp; ys != nil ) {&lt;br /&gt;
     if( xs-&amp;gt;head != ys-&amp;gt;head )&lt;br /&gt;
       return 0;&lt;br /&gt;
     xs = xs-&amp;gt;tail;&lt;br /&gt;
     ys = ys-&amp;gt;tail;&lt;br /&gt;
   }&lt;br /&gt;
   return xs == ys;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 Cons* find( element_t elt, Cons* list ) {&lt;br /&gt;
   for( ; list != nil; list = list-&amp;gt;tail )&lt;br /&gt;
     if( list-&amp;gt;head == elt )&lt;br /&gt;
       break;&lt;br /&gt;
   return list;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 Cons* append( Cons* xs, Cons* ys ) {&lt;br /&gt;
   Cons* result;			/* deliberately left uninitialised */&lt;br /&gt;
   Cons** cpp = &amp;amp;result;		/* pointer to the last uninitialised list pointer */&lt;br /&gt;
   for( ; xs != nil; xs = xs-&amp;gt;tail ) {&lt;br /&gt;
     *cpp = cons(xs-&amp;gt;head, (Cons*)0); /* nil would be misleading; this list is incomplete */&lt;br /&gt;
     cpp = &amp;amp;(*cpp)-&amp;gt;tail;&lt;br /&gt;
   }&lt;br /&gt;
   *cpp = ys;&lt;br /&gt;
   return result;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 Cons* copy_list( Cons* list ) { return append( list, nil ); }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 Cons* nappend( Cons* xs, Cons* ys ) {&lt;br /&gt;
   if( xs == nil )&lt;br /&gt;
     return ys;&lt;br /&gt;
   else {&lt;br /&gt;
     Cons* cp = xs;&lt;br /&gt;
     while( cp-&amp;gt;tail != nil )&lt;br /&gt;
       cp = cp-&amp;gt;tail;&lt;br /&gt;
     cp-&amp;gt;tail = ys;&lt;br /&gt;
   }&lt;br /&gt;
   return xs;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 Cons* reverse( Cons* list ) {&lt;br /&gt;
   Cons* rev = nil;&lt;br /&gt;
   for( ; list != nil; list = list-&amp;gt;tail )&lt;br /&gt;
     rev = cons( list-&amp;gt;head, rev );&lt;br /&gt;
   return rev;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 Cons* nreverse( Cons* list ) {&lt;br /&gt;
   Cons* prev = nil;&lt;br /&gt;
   Cons* next;&lt;br /&gt;
   for( ; list != nil; list = next ) {&lt;br /&gt;
     next = list-&amp;gt;tail;&lt;br /&gt;
     list-&amp;gt;tail = prev;&lt;br /&gt;
     prev = list;&lt;br /&gt;
   }&lt;br /&gt;
   return prev;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 int main( ) {&lt;br /&gt;
   print_list( nil );				/* List[] */&lt;br /&gt;
   print_list( cons(10,cons(20,cons(30,nil))) ); /* List[10,20,30] */&lt;br /&gt;
 &lt;br /&gt;
   assert( length( nil ) == 0 );&lt;br /&gt;
   assert( length( cons(10,cons(20,cons(30,nil))) ) == 3 );&lt;br /&gt;
 &lt;br /&gt;
   assert( first( nil ) == 0 );&lt;br /&gt;
   assert( first( cons(10,cons(20,nil)) ) == 10 );&lt;br /&gt;
 &lt;br /&gt;
   assert( second( nil ) == 0 );&lt;br /&gt;
   assert( second( cons(10,cons(20,nil)) ) == 20 );&lt;br /&gt;
 &lt;br /&gt;
   assert( third( nil ) == 0 );&lt;br /&gt;
   assert( third( cons(10,cons(20,nil)) ) == 0 );&lt;br /&gt;
   assert( third( cons(10,cons(20,cons(30,nil))) ) == 30 );&lt;br /&gt;
 &lt;br /&gt;
   assert( fourth( nil ) == 0 );&lt;br /&gt;
   assert( fourth( cons(10,cons(20,nil)) ) == 0 );&lt;br /&gt;
   assert( fourth( cons(10,cons(20,cons(30,nil))) ) == 0 );&lt;br /&gt;
   assert( fourth( cons(10,cons(20,cons(30,cons(40,nil)))) ) == 40 );&lt;br /&gt;
 &lt;br /&gt;
   assert( nth(0,nil) == 0 );&lt;br /&gt;
   assert( nth(1,nil) == 0 );&lt;br /&gt;
   assert( nth(0,cons(10,nil)) == 10 );&lt;br /&gt;
   assert( nth(1,cons(10,nil)) == 0 );&lt;br /&gt;
 &lt;br /&gt;
   assert( equal(nil,nil) );&lt;br /&gt;
   assert( ! equal(nil,cons(10,nil)) );&lt;br /&gt;
   assert( ! equal(cons(10,nil),nil) );&lt;br /&gt;
   assert( equal(cons(10,nil),cons(10,nil)) );&lt;br /&gt;
   assert( ! equal(cons(10,nil),cons(20,nil)) );&lt;br /&gt;
 &lt;br /&gt;
   print_list( find(10,nil) );		/* List[] */&lt;br /&gt;
   print_list( find(20,cons(10,nil)) );	/* List[] */&lt;br /&gt;
   print_list( find(10,cons(10,nil)) );	/* List[10] */&lt;br /&gt;
 &lt;br /&gt;
   print_list( append(nil,nil) );	  /* List[] */&lt;br /&gt;
   print_list( append(nil,cons(10,nil)) ); /* List[10] */&lt;br /&gt;
   print_list( append(cons(10,nil),nil) ); /* List[10] */&lt;br /&gt;
   print_list( append(cons(10,nil),cons(20,nil)) ); /* List[10,20] */&lt;br /&gt;
 &lt;br /&gt;
   print_list( copy_list(nil) );		 /* List[] */&lt;br /&gt;
   print_list( copy_list(cons(10,nil)) ); /* List[10] */&lt;br /&gt;
   print_list( copy_list(cons(10,cons(20,nil))) ); /* List[10,20] */&lt;br /&gt;
 &lt;br /&gt;
   print_list( nappend(nil,nil) );	   /* List[] */&lt;br /&gt;
   print_list( nappend(nil,cons(10,nil)) ); /* List[10] */&lt;br /&gt;
   print_list( nappend(cons(10,nil),nil) ); /* List[10] */&lt;br /&gt;
   print_list( nappend(cons(10,nil),cons(20,nil)) ); /* List[10,20] */&lt;br /&gt;
 &lt;br /&gt;
   print_list( reverse(nil) );			/* List[] */&lt;br /&gt;
   print_list( reverse(cons(10,nil)) );		/* List[10] */&lt;br /&gt;
   print_list( reverse(cons(10,cons(20,nil))) );	/* List[20,10] */&lt;br /&gt;
 &lt;br /&gt;
   print_list( nreverse(nil) );			/* List[] */&lt;br /&gt;
   print_list( nreverse(cons(10,nil)) );		/* List[10] */&lt;br /&gt;
   print_list( nreverse(cons(10,cons(20,nil))) ); /* List[20,10] */&lt;br /&gt;
 &lt;br /&gt;
   return 0;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 /*&lt;br /&gt;
 Local Variables:&lt;br /&gt;
 compile-command: &amp;quot;gcc -Wall lab-4-soln.c -o lab-4-soln &amp;amp;&amp;amp; ./lab-4-soln&amp;quot;&lt;br /&gt;
 End:&lt;br /&gt;
 */&lt;/div&gt;</summary>
		<author><name>Mark</name></author>
	</entry>
</feed>