<?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%3Ajsmi233</id>
	<title>SE250:lab-4:jsmi233 - 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%3Ajsmi233"/>
	<link rel="alternate" type="text/html" href="https://wiki.kram.nz/index.php?title=SE250:lab-4:jsmi233&amp;action=history"/>
	<updated>2026-06-08T22:25:17Z</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:jsmi233&amp;diff=6079&amp;oldid=prev</id>
		<title>Mark: 1 revision(s)</title>
		<link rel="alternate" type="text/html" href="https://wiki.kram.nz/index.php?title=SE250:lab-4:jsmi233&amp;diff=6079&amp;oldid=prev"/>
		<updated>2008-11-03T05:19:35Z</updated>

		<summary type="html">&lt;p&gt;1 revision(s)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Task one ==&lt;br /&gt;
&lt;br /&gt;
I wrote this code:&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;
      return 0; //later I realised I should return count.. duh!&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
It looks like it should work for an empty list and a non-empty list.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Task two ==&lt;br /&gt;
&lt;br /&gt;
Firstly I wrote this:&lt;br /&gt;
&lt;br /&gt;
  element_t first(Cons* list) {&lt;br /&gt;
      int count = 0;&lt;br /&gt;
      for (; list != nil; list = list-&amp;gt;tail)&lt;br /&gt;
  	if (++count == 1)&lt;br /&gt;
  	    return list-&amp;gt;head;&lt;br /&gt;
      return 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
Then I realised that since I will be writing a second, third, and fourth function, I might as well make a generalised function that works for all four functions and save some code. I called my generalised function elementAt:&lt;br /&gt;
&lt;br /&gt;
  element_t elementAt(Cons* list, int index) {&lt;br /&gt;
      int count = 0;&lt;br /&gt;
      for (; list != nil; list = list-&amp;gt;tail)&lt;br /&gt;
  	if (++count == index)&lt;br /&gt;
  	    return list-&amp;gt;head;&lt;br /&gt;
      return 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
Then it occurred to me that returning zero might fail if later the type element_t was changed. So I instead returned NILL-&amp;gt;head. I also decided to make the list index zero based. So elementAt now looks like: &lt;br /&gt;
&lt;br /&gt;
  element_t elementAt(Cons* list, int index) {&lt;br /&gt;
      int count = 0;&lt;br /&gt;
      for (; list != nil; list = list-&amp;gt;tail)&lt;br /&gt;
  	if (count++ == index)&lt;br /&gt;
  	    return list-&amp;gt;head;&lt;br /&gt;
      return NILL-&amp;gt;head;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
And so my first.. fourth functions are these:&lt;br /&gt;
&lt;br /&gt;
  element_t first(Cons* list) {&lt;br /&gt;
      return elementAt(0);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  element_t second(Cons* list) {&lt;br /&gt;
      return elementAt(1);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  element_t third(Cons* list) {&lt;br /&gt;
      return elementAt(2);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  element_t fourth(Cons* list) {&lt;br /&gt;
      return elementAt(3);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
== Task three ==&lt;br /&gt;
&lt;br /&gt;
It seems that I have already accomplished task three by writing my elementAt function. I just spotted a bug in my first.. fourth functions, their call to elementAt (now renamed to nth) doesn’t pass the list.&lt;br /&gt;
&lt;br /&gt;
Having fixed this, I move to task four.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Task four ==&lt;br /&gt;
&lt;br /&gt;
Here is my code:&lt;br /&gt;
&lt;br /&gt;
  int equal(Cons* list1, Cons* list2) {&lt;br /&gt;
      for (; list1 != nil &amp;amp;&amp;amp; list2 != nil; list1 = list1-&amp;gt;tail, list2 = list2-&amp;gt;tail)&lt;br /&gt;
  	if (list1-&amp;gt;head != list2-&amp;gt;head)&lt;br /&gt;
  	    return FALSE;&lt;br /&gt;
      return list1-&amp;gt;head == list2-&amp;gt;head;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Task five ==&lt;br /&gt;
&lt;br /&gt;
While I was writing my code John Hamer noticed my use of NIL and suggested that I should be using nil. I don’t understand how the declaration of NIL works: static Cons NIL = { 0, &amp;amp;NIL };&lt;br /&gt;
&lt;br /&gt;
How can you have a global static variable??&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Here is my find function:&lt;br /&gt;
&lt;br /&gt;
  Cons* find(element_t value, Cons* list) {&lt;br /&gt;
      for (; list != nil; list = list-&amp;gt;tail)&lt;br /&gt;
  	if (list-&amp;gt;head == value)&lt;br /&gt;
  	    return list-&amp;gt;head;&lt;br /&gt;
      return nil;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Task six ==&lt;br /&gt;
&lt;br /&gt;
This is a bit more difficult to imagine, I might resort to pen and paper.&lt;br /&gt;
&lt;br /&gt;
Ok, I got away with doing my working in the comments. Here is my code:&lt;br /&gt;
&lt;br /&gt;
  Cons* copy_list(Cons* list) {&lt;br /&gt;
      Cons* start = list;&lt;br /&gt;
      Cons* temp = nil, copy = nil;&lt;br /&gt;
      for (; list != nil; list = list-&amp;gt;tail)&lt;br /&gt;
  	temp = cons(list-&amp;gt;head, temp);&lt;br /&gt;
      for (; temp != nil; temp = temp-&amp;gt;tail)&lt;br /&gt;
  	copy = cons(temp-&amp;gt;head, copy);&lt;br /&gt;
      &lt;br /&gt;
      // temp = last, ..., second, first, nil&lt;br /&gt;
      // copy = first, second, ..., last, nil&lt;br /&gt;
  &lt;br /&gt;
      return copy;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
I know I have just lost temp in the memory somewhere, but I am too lazy right now to do anything about that.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Task seven == &lt;br /&gt;
&lt;br /&gt;
I think I now understand what the handout means by length(xs). Here is my function: &lt;br /&gt;
&lt;br /&gt;
  Cons* append(Cons* xs, Cons* ys) {&lt;br /&gt;
      int len = length(xs) + length(ys);&lt;br /&gt;
      Cons* list2 = nil, iterator;&lt;br /&gt;
      int i;&lt;br /&gt;
      for (int i = 0; i &amp;lt; len; i++) {&lt;br /&gt;
  	list2 = cons(0, nil);&lt;br /&gt;
      }&lt;br /&gt;
      iterator = list2;&lt;br /&gt;
      for (; xs != nil; xs = xs-&amp;gt;tail, iterator = iterator-&amp;gt;tail) {&lt;br /&gt;
  	iterator-&amp;gt;head = xs-&amp;gt;head;&lt;br /&gt;
      }&lt;br /&gt;
      for (; ys != nil; ys = ys-&amp;gt;tail, iterator = iterator-&amp;gt;tail) {&lt;br /&gt;
  	iterator-&amp;gt;head = ys-&amp;gt;head;&lt;br /&gt;
      }&lt;br /&gt;
      return list2;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Task Eight ==&lt;br /&gt;
&lt;br /&gt;
This looks easy.&lt;br /&gt;
&lt;br /&gt;
Here is my code:&lt;br /&gt;
&lt;br /&gt;
  Cons* nappend(Cons* xs, Cons* ys) {&lt;br /&gt;
      Cons* iterator;&lt;br /&gt;
      if (xs == nil)&lt;br /&gt;
  	return ys;&lt;br /&gt;
      for (; iterator-&amp;gt;tail != nil; iterator = iterator-&amp;gt;tail);&lt;br /&gt;
      iterator-&amp;gt;tail = ys;&lt;br /&gt;
      return xs;&lt;br /&gt;
  }&lt;/div&gt;</summary>
		<author><name>Mark</name></author>
	</entry>
</feed>