<?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%3Adcho040</id>
	<title>SE250:lab-4:dcho040 - 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%3Adcho040"/>
	<link rel="alternate" type="text/html" href="https://wiki.kram.nz/index.php?title=SE250:lab-4:dcho040&amp;action=history"/>
	<updated>2026-04-06T15:59:47Z</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:dcho040&amp;diff=6032&amp;oldid=prev</id>
		<title>Mark: 9 revision(s)</title>
		<link rel="alternate" type="text/html" href="https://wiki.kram.nz/index.php?title=SE250:lab-4:dcho040&amp;diff=6032&amp;oldid=prev"/>
		<updated>2008-11-03T05:19:34Z</updated>

		<summary type="html">&lt;p&gt;9 revision(s)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;=Codes=&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
  File: LL.c&lt;br /&gt;
  Date: 1 April 2008&lt;br /&gt;
  Author: John Hamer&lt;br /&gt;
  Purpose: Starter code for SOFTENG 250 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;
// all cons have to initialized by nil to have length more than 1 ( because (length(list) - 1) is used in the codes )&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;
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;
int length( Cons* list ) {&lt;br /&gt;
	int count = 0;&lt;br /&gt;
  for( ; list != nil; list = list-&amp;gt;tail ) {&lt;br /&gt;
	count ++;&lt;br /&gt;
  }&lt;br /&gt;
  return count;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
element_t first(Cons* list) { return list -&amp;gt; head; }&lt;br /&gt;
&lt;br /&gt;
element_t second(Cons* list) { return nth(1,list); }&lt;br /&gt;
&lt;br /&gt;
element_t third(Cons* list) { return nth(2,list); }&lt;br /&gt;
&lt;br /&gt;
element_t fourth(Cons* list) { return nth(3,list); }&lt;br /&gt;
&lt;br /&gt;
element_t nth(int i, Cons* list) {&lt;br /&gt;
  // check i is bigger than the length of the list&lt;br /&gt;
  if (length( list ) &amp;lt; i) { return 0; }&lt;br /&gt;
&lt;br /&gt;
  // goes i th element&lt;br /&gt;
  int j;&lt;br /&gt;
  for ( j=0; j &amp;lt; i; j++ ) {&lt;br /&gt;
    list = list -&amp;gt; tail;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // return the value from i the element&lt;br /&gt;
  return list -&amp;gt; head;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Cons* nth_cons(int i, Cons* list) {&lt;br /&gt;
  // check i is bigger than the length of the list&lt;br /&gt;
  if (length( list ) &amp;lt; i) { return nil; }&lt;br /&gt;
&lt;br /&gt;
  // goes i th element&lt;br /&gt;
  int j;&lt;br /&gt;
  for ( j=0; j &amp;lt; i; j++ ) {&lt;br /&gt;
    list = list -&amp;gt; tail;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // return the value from i the element&lt;br /&gt;
  return list;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int equal(Cons* list, Cons* list2) {&lt;br /&gt;
  // check the length&lt;br /&gt;
  if ( length(list) != length(list2) ) { return 0; }&lt;br /&gt;
&lt;br /&gt;
  // check the values&lt;br /&gt;
  int i;&lt;br /&gt;
  for(i=0; i &amp;lt; length( list ); i++) {&lt;br /&gt;
	if ( nth(i, list) != nth(i, list2) ) { return 0; }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // return 1 (two lists are same)&lt;br /&gt;
  return 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Cons* find(element_t element, Cons* list) {&lt;br /&gt;
  int i;&lt;br /&gt;
  for(i=0; i &amp;lt; length( list ); i++) {&lt;br /&gt;
	if ( element == list -&amp;gt; head ) { return list; }&lt;br /&gt;
	list = list -&amp;gt; tail;&lt;br /&gt;
  }&lt;br /&gt;
  return nil;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Cons* copy_list(Cons* list) {&lt;br /&gt;
  Cons* new_list = nil;&lt;br /&gt;
  int i;&lt;br /&gt;
  for(i = (length( list ) - 1); i &amp;gt;= 0; i--) {&lt;br /&gt;
    new_list = cons(nth(i, list), new_list);&lt;br /&gt;
  }&lt;br /&gt;
  return new_list;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Cons* append(Cons* xs, Cons* ys) {&lt;br /&gt;
  Cons* both = copy_list(ys);&lt;br /&gt;
  int i;&lt;br /&gt;
  for (i = (length( xs )-1); i &amp;gt;= 0; i--) {&lt;br /&gt;
	both = cons(nth(i, xs), both);&lt;br /&gt;
  }&lt;br /&gt;
  return both;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Cons* nappend(Cons* xs, Cons* ys) {&lt;br /&gt;
  Cons* both = copy_list(ys);&lt;br /&gt;
  if ( xs == nil ) {&lt;br /&gt;
	 xs = both;&lt;br /&gt;
	  return xs;&lt;br /&gt;
  }&lt;br /&gt;
  nth_cons(length(xs)-1, xs) -&amp;gt; tail = both;&lt;br /&gt;
  return xs;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Cons* reverse(Cons* xs) {&lt;br /&gt;
  int i;&lt;br /&gt;
  Cons* new_list = nil;&lt;br /&gt;
  for(i=0; i &amp;lt; length( xs ); i++) {&lt;br /&gt;
	new_list = cons(nth(i, xs), new_list);&lt;br /&gt;
  }&lt;br /&gt;
  return new_list;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Cons* nreverse(Cons* xs) {&lt;br /&gt;
  int i, j, exchange; // i: nth from first, j: nth from last&lt;br /&gt;
  for(i=0; i &amp;lt; (length( xs ) / 2); i++) {&lt;br /&gt;
	j = (length( xs ) - 1) - i;&lt;br /&gt;
	exchange = nth(i, xs);&lt;br /&gt;
	nth_cons(i, xs) -&amp;gt; head = nth_cons(j, xs) -&amp;gt; head;&lt;br /&gt;
	nth_cons(j, xs) -&amp;gt; head = exchange;&lt;br /&gt;
  }&lt;br /&gt;
  return xs;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void test_LL( ) {&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;
&lt;br /&gt;
int main( ) {&lt;br /&gt;
  Cons* list = cons(1,cons(2,cons(3,nil)));&lt;br /&gt;
&lt;br /&gt;
  // 1th&lt;br /&gt;
  printf(&amp;quot;-1th-\n&amp;quot;);&lt;br /&gt;
  print_list( list ); /* expect: List[1,2,3] */&lt;br /&gt;
  printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  // 2th&lt;br /&gt;
  printf(&amp;quot;-2th-\n&amp;quot;);&lt;br /&gt;
  printf(&amp;quot;Length of the list = %d\n&amp;quot;, length( list ));&lt;br /&gt;
  printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  // 3th&lt;br /&gt;
  printf(&amp;quot;-3th-\n&amp;quot;&lt;br /&gt;
         &amp;quot;first : %d\n&amp;quot;&lt;br /&gt;
         &amp;quot;second: %d\n&amp;quot;&lt;br /&gt;
         &amp;quot;third : %d\n&amp;quot;&lt;br /&gt;
         &amp;quot;fourth : %d\n&amp;quot;&lt;br /&gt;
         , first( list ), second( list ), third( list ), fourth( list ));&lt;br /&gt;
  printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  // 4th&lt;br /&gt;
  printf(&amp;quot;-4th-\n&amp;quot;&lt;br /&gt;
         &amp;quot;first : %d\n&amp;quot;&lt;br /&gt;
         &amp;quot;second: %d\n&amp;quot;&lt;br /&gt;
         &amp;quot;third : %d\n&amp;quot;&lt;br /&gt;
         &amp;quot;fourth : %d\n&amp;quot;&lt;br /&gt;
         , nth(0, list ), nth(1, list ), nth(2, list ), nth(3, list ));&lt;br /&gt;
  printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  // 5th&lt;br /&gt;
  Cons* list2 = cons(1,cons(2,cons(3,nil)));&lt;br /&gt;
  Cons* list3 = cons(1,cons(2,nil));&lt;br /&gt;
  Cons* list4 = cons(1,cons(10,cons(2,nil)));&lt;br /&gt;
  printf(&amp;quot;-5th-\n&amp;quot;&lt;br /&gt;
         &amp;quot;same            : %d\n&amp;quot;&lt;br /&gt;
         &amp;quot;diffenent length: %d\n&amp;quot;&lt;br /&gt;
         &amp;quot;diffenent values: %d\n&amp;quot;&lt;br /&gt;
         , equal(list, list2), equal(list, list3), equal(list, list4));&lt;br /&gt;
  printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  // 6th&lt;br /&gt;
  Cons* found = find(2, list);&lt;br /&gt;
  printf(&amp;quot;-6th-\n&amp;quot;&lt;br /&gt;
  		 &amp;quot;Looking for 2 in the list [1, 2, 3]\n&amp;quot;&lt;br /&gt;
         &amp;quot;head: %d\n&amp;quot;&lt;br /&gt;
         &amp;quot;tail: %p\n&amp;quot;&lt;br /&gt;
         , found -&amp;gt; head, found -&amp;gt; tail);&lt;br /&gt;
  printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  // 7th&lt;br /&gt;
  Cons* copy = copy_list(list);&lt;br /&gt;
  printf(&amp;quot;-7th-\n&amp;quot;&lt;br /&gt;
         &amp;quot;after copy\n&amp;quot;&lt;br /&gt;
         &amp;quot; orignal &amp;amp; copy : %d\n&amp;quot;&lt;br /&gt;
         , equal(list, copy));&lt;br /&gt;
    // change the copyed list&lt;br /&gt;
  copy = cons(6, copy);&lt;br /&gt;
    // compare again&lt;br /&gt;
  printf(&amp;quot;after change the copy \n&amp;quot;&lt;br /&gt;
         &amp;quot; orignal &amp;amp; copy : %d\n&amp;quot;&lt;br /&gt;
         , equal(list, copy));&lt;br /&gt;
  printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 // 8th&lt;br /&gt;
  printf(&amp;quot;-8th-\n&amp;quot;&lt;br /&gt;
         &amp;quot;list  = &amp;quot;);&lt;br /&gt;
  print_list( list ); /* expect: List[1,2,3] */&lt;br /&gt;
&lt;br /&gt;
  printf(&amp;quot;list3 = &amp;quot;);&lt;br /&gt;
  print_list( list3 ); /* expect: List[1,2] */&lt;br /&gt;
&lt;br /&gt;
  printf(&amp;quot;use append to both\n&amp;quot;);&lt;br /&gt;
  Cons* both = append(list, list3);&lt;br /&gt;
&lt;br /&gt;
  printf(&amp;quot;both  = &amp;quot;); /* expect: List[1,2,3,1,2] */&lt;br /&gt;
  print_list( both );&lt;br /&gt;
&lt;br /&gt;
  printf(&amp;quot;after use append\n&amp;quot;&lt;br /&gt;
         &amp;quot;list  = &amp;quot;);&lt;br /&gt;
  print_list( list ); /* expect: List[1,2,3] */&lt;br /&gt;
&lt;br /&gt;
  printf(&amp;quot;list3 = &amp;quot;);&lt;br /&gt;
  print_list( list3 ); /* expect: List[1,2] */&lt;br /&gt;
  printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  // 9th&lt;br /&gt;
  printf(&amp;quot;-9th-\n&amp;quot;&lt;br /&gt;
         &amp;quot;list  = &amp;quot;);&lt;br /&gt;
  print_list( list ); /* expect: List[1,2,3] */&lt;br /&gt;
&lt;br /&gt;
  printf(&amp;quot;list3 = &amp;quot;);&lt;br /&gt;
  print_list( list3 ); /* expect: List[1,2] */&lt;br /&gt;
&lt;br /&gt;
  printf(&amp;quot;use nappend to list_extend\n&amp;quot;);&lt;br /&gt;
  Cons* list_extend = nappend(list, list3);&lt;br /&gt;
&lt;br /&gt;
  printf(&amp;quot;list_extend = &amp;quot;); /* expect: List[1,2,3,1,2] */&lt;br /&gt;
  print_list( list_extend );&lt;br /&gt;
&lt;br /&gt;
  printf(&amp;quot;after use nappend\n&amp;quot;&lt;br /&gt;
         &amp;quot;list  = &amp;quot;);&lt;br /&gt;
  print_list( list ); /* expect: List[1,2,3] */&lt;br /&gt;
&lt;br /&gt;
  printf(&amp;quot;list3 = &amp;quot;);&lt;br /&gt;
  print_list( list3 ); /* expect: List[1,2] */&lt;br /&gt;
  printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  // 10th&lt;br /&gt;
  printf(&amp;quot;-10th-\n&amp;quot;&lt;br /&gt;
         &amp;quot;list          = &amp;quot;);&lt;br /&gt;
  print_list( list ); /* expect: List[1,2,3,1,2] */&lt;br /&gt;
    // do reverse&lt;br /&gt;
  Cons* list_reverse = reverse( list );&lt;br /&gt;
  printf(&amp;quot;use reverse\n&amp;quot;&lt;br /&gt;
         &amp;quot;list_reverse  = &amp;quot;);&lt;br /&gt;
  print_list( list_reverse ); /* expect: List[2,1,3,2,1] */&lt;br /&gt;
  printf(&amp;quot;list          = &amp;quot;);&lt;br /&gt;
  print_list( list ); /* expect: List[2,1,3,2,1] */&lt;br /&gt;
  printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 // 11th&lt;br /&gt;
  printf(&amp;quot;-11th-\n&amp;quot;&lt;br /&gt;
         &amp;quot;list          = &amp;quot;);&lt;br /&gt;
  print_list( list ); /* expect: List[1,2,3,1,2] */&lt;br /&gt;
    // do reverse&lt;br /&gt;
  Cons* list_nreverse = nreverse( list );&lt;br /&gt;
  printf(&amp;quot;use nreverse\n&amp;quot;&lt;br /&gt;
         &amp;quot;list_nreverse = &amp;quot;);&lt;br /&gt;
  print_list( list_nreverse ); /* expect: List[2,1,3,2,1] */&lt;br /&gt;
  printf(&amp;quot;list          = &amp;quot;);&lt;br /&gt;
  print_list( list ); /* expect: List[2,1,3,2,1] */&lt;br /&gt;
  printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
  test_LL();&lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
�&lt;br /&gt;
/*&lt;br /&gt;
Local Variables:&lt;br /&gt;
compile-command: &amp;quot;gcc -Wall LL.c -o LL &amp;amp;&amp;amp; ./LL&amp;quot;&lt;br /&gt;
End:&lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Results=&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-1th-&lt;br /&gt;
List[1,2,3]&lt;br /&gt;
&lt;br /&gt;
-2th-&lt;br /&gt;
Length of the list = 3&lt;br /&gt;
&lt;br /&gt;
-3th-&lt;br /&gt;
first : 1&lt;br /&gt;
second: 2&lt;br /&gt;
third : 3&lt;br /&gt;
fourth : 0&lt;br /&gt;
&lt;br /&gt;
-4th-&lt;br /&gt;
first : 1&lt;br /&gt;
second: 2&lt;br /&gt;
third : 3&lt;br /&gt;
fourth : 0&lt;br /&gt;
&lt;br /&gt;
-5th-&lt;br /&gt;
same            : 1&lt;br /&gt;
diffenent length: 0&lt;br /&gt;
diffenent values: 0&lt;br /&gt;
&lt;br /&gt;
-6th-&lt;br /&gt;
Looking for 2 in the list [1, 2, 3]&lt;br /&gt;
head: 2&lt;br /&gt;
tail: 0xde0158&lt;br /&gt;
&lt;br /&gt;
-7th-&lt;br /&gt;
after copy&lt;br /&gt;
 orignal &amp;amp; copy : 1&lt;br /&gt;
after change the copy &lt;br /&gt;
 orignal &amp;amp; copy : 0&lt;br /&gt;
&lt;br /&gt;
-8th-&lt;br /&gt;
list  = List[1,2,3]&lt;br /&gt;
list3 = List[1,2]&lt;br /&gt;
use append to both&lt;br /&gt;
both  = List[1,2,3,1,2]&lt;br /&gt;
after use append&lt;br /&gt;
list  = List[1,2,3]&lt;br /&gt;
list3 = List[1,2]&lt;br /&gt;
&lt;br /&gt;
-9th-&lt;br /&gt;
list  = List[1,2,3]&lt;br /&gt;
list3 = List[1,2]&lt;br /&gt;
use nappend to list_extend&lt;br /&gt;
list_extend = List[1,2,3,1,2]&lt;br /&gt;
after use nappend&lt;br /&gt;
list  = List[1,2,3,1,2]&lt;br /&gt;
list3 = List[1,2]&lt;br /&gt;
&lt;br /&gt;
-10th-&lt;br /&gt;
list          = List[1,2,3,1,2]&lt;br /&gt;
use reverse&lt;br /&gt;
list_reverse  = List[2,1,3,2,1]&lt;br /&gt;
list          = List[1,2,3,1,2]&lt;br /&gt;
&lt;br /&gt;
-11th-&lt;br /&gt;
list          = List[1,2,3,1,2]&lt;br /&gt;
use nreverse&lt;br /&gt;
list_nreverse = List[2,1,3,2,1]&lt;br /&gt;
list          = List[2,1,3,2,1]&lt;br /&gt;
&lt;br /&gt;
List[]&lt;br /&gt;
List[10,20,30]&lt;br /&gt;
List[]&lt;br /&gt;
List[]&lt;br /&gt;
List[10]&lt;br /&gt;
List[]&lt;br /&gt;
List[10]&lt;br /&gt;
List[10]&lt;br /&gt;
List[10,20]&lt;br /&gt;
List[]&lt;br /&gt;
List[10]&lt;br /&gt;
List[10,20]&lt;br /&gt;
List[]&lt;br /&gt;
List[10]&lt;br /&gt;
List[10]&lt;br /&gt;
List[10,20]&lt;br /&gt;
List[]&lt;br /&gt;
List[10]&lt;br /&gt;
List[20,10]&lt;br /&gt;
List[]&lt;br /&gt;
List[10]&lt;br /&gt;
List[20,10]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Discussion=&lt;br /&gt;
This lab was not difficult to follow and very straight forward. The main point of this lab is learning about the concept of link list and making condensed effective codes which are short, simple and easy to understand.&lt;br /&gt;
&lt;br /&gt;
Only oneproblem I have got was using nappend having &amp;#039;xs&amp;#039; as &amp;#039;nil&amp;#039;&lt;br /&gt;
* first codes made&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Cons* nappend(Cons* xs, Cons* ys) {&lt;br /&gt;
  Cons* both = copy_list(ys);&lt;br /&gt;
  nth_cons(length(xs)-1, xs) -&amp;gt; tail = both;&lt;br /&gt;
  return xs;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 What the nappend fuction do&lt;br /&gt;
 1. create &amp;#039;both&amp;#039; list and copy the list from &amp;#039;ys&amp;#039;&lt;br /&gt;
 2. find the last list of &amp;#039;xs&amp;#039; and change &amp;#039;tail&amp;#039; from &amp;#039;nil&amp;#039; to &amp;#039;both&amp;#039;&lt;br /&gt;
 3. retrun xs&lt;br /&gt;
 but when &amp;#039;xs&amp;#039; is &amp;#039;nil&amp;#039;, this function always return empty array&lt;br /&gt;
&lt;br /&gt;
* Fix the error&lt;br /&gt;
  add special codes for when &amp;#039;xs&amp;#039; equals to &amp;#039;nil&amp;#039;&lt;br /&gt;
  When &amp;#039;xs&amp;#039; is &amp;#039;nil&amp;#039;, copy &amp;#039;both&amp;#039; to &amp;#039;xs&amp;#039; and return xs&lt;br /&gt;
* fianl codes fixed&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Cons* nappend(Cons* xs, Cons* ys) {&lt;br /&gt;
  Cons* both = copy_list(ys);&lt;br /&gt;
  if ( xs == nil ) {&lt;br /&gt;
	 xs = both;&lt;br /&gt;
	  return xs;&lt;br /&gt;
  }&lt;br /&gt;
  nth_cons(length(xs)-1, xs) -&amp;gt; tail = both;&lt;br /&gt;
  return xs;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Even simple codes, using many test cases is a good way to avoid from bugs.&lt;/div&gt;</summary>
		<author><name>Mark</name></author>
	</entry>
</feed>