<?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%3Arwan064%3Acode</id>
	<title>SE250:lab-4:rwan064:code - 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%3Arwan064%3Acode"/>
	<link rel="alternate" type="text/html" href="https://wiki.kram.nz/index.php?title=SE250:lab-4:rwan064:code&amp;action=history"/>
	<updated>2026-06-08T20:52:31Z</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:rwan064:code&amp;diff=6185&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:rwan064:code&amp;diff=6185&amp;oldid=prev"/>
		<updated>2008-11-03T05:19:37Z</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;&amp;lt;pre&amp;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;
int length( Cons *list )&lt;br /&gt;
{&lt;br /&gt;
	Cons *cp;&lt;br /&gt;
	int i = 0;&lt;br /&gt;
	for ( cp = list; cp != nil; cp = cp-&amp;gt;tail ) {&lt;br /&gt;
		i++;&lt;br /&gt;
	}&lt;br /&gt;
	return i;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
element_t first( Cons* list )&lt;br /&gt;
{&lt;br /&gt;
	if ( length( list ) &amp;gt;= 1 ) {&lt;br /&gt;
		return list-&amp;gt;head;&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
		// length of list is less than one so a first element cannot exist.&lt;br /&gt;
		return 0;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
element_t second( Cons* list )&lt;br /&gt;
{&lt;br /&gt;
	if ( length( list ) &amp;gt;= 2 ) {&lt;br /&gt;
		Cons *cp = list;&lt;br /&gt;
		int i;&lt;br /&gt;
		for ( i = 0; i &amp;lt; 1; i++ ) {&lt;br /&gt;
			cp = cp-&amp;gt;tail;&lt;br /&gt;
		}&lt;br /&gt;
		return cp-&amp;gt;head;&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
		return 0;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
element_t third( Cons* list )&lt;br /&gt;
{&lt;br /&gt;
	if ( length( list ) &amp;gt;= 3 ) {&lt;br /&gt;
		Cons *cp = list;&lt;br /&gt;
		int i;&lt;br /&gt;
		for ( i = 0; i &amp;lt; 2; i++ ) {&lt;br /&gt;
			cp = cp-&amp;gt;tail;&lt;br /&gt;
		}&lt;br /&gt;
		return cp-&amp;gt;head;&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
		return 0;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
element_t fourth( Cons* list )&lt;br /&gt;
{&lt;br /&gt;
	if ( length( list ) &amp;gt;= 4 ) {&lt;br /&gt;
		Cons *cp = list;&lt;br /&gt;
		int i;&lt;br /&gt;
		for ( i = 0; i &amp;lt; 3; i++ ) {&lt;br /&gt;
			cp = cp-&amp;gt;tail;&lt;br /&gt;
		}&lt;br /&gt;
		return cp-&amp;gt;head;&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
		return 0;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
element_t nth( int i, Cons *list )&lt;br /&gt;
{&lt;br /&gt;
	if ( length( list ) &amp;gt;= i ) {&lt;br /&gt;
		Cons *cp = list;&lt;br /&gt;
		int count;&lt;br /&gt;
		for ( count = 0; count &amp;lt; (i-1); count++ ) {&lt;br /&gt;
			cp = cp-&amp;gt;tail;&lt;br /&gt;
		}&lt;br /&gt;
		return cp-&amp;gt;head;&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
		return 0;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int equal( Cons *xs, Cons *ys )&lt;br /&gt;
{&lt;br /&gt;
	if ( length( xs ) == length( ys ) ) {&lt;br /&gt;
		Cons *cp;&lt;br /&gt;
		int i = 1;&lt;br /&gt;
		for ( cp = xs; cp != nil; cp = cp-&amp;gt;tail ) {&lt;br /&gt;
			if ( cp-&amp;gt;head != nth( i, ys ) ) {&lt;br /&gt;
				return 0;&lt;br /&gt;
			}&lt;br /&gt;
			i++;&lt;br /&gt;
		}&lt;br /&gt;
		return 1;&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
		return 0;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Cons* find( element_t t, Cons* list )&lt;br /&gt;
{&lt;br /&gt;
	Cons *cp;&lt;br /&gt;
	for ( cp = list; cp != nil; cp = cp-&amp;gt;tail ) {&lt;br /&gt;
		if ( cp-&amp;gt;head == t ) {&lt;br /&gt;
			return cp;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return 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;
&lt;br /&gt;
Cons* copy_list( Cons *list )&lt;br /&gt;
{&lt;br /&gt;
	Cons *cp = nil;&lt;br /&gt;
	Cons *copy = nil;&lt;br /&gt;
	&lt;br /&gt;
	int len = length(list);&lt;br /&gt;
	element_t ts[ len ];&lt;br /&gt;
	int i = 0;&lt;br /&gt;
	&lt;br /&gt;
	for ( cp = list; cp != nil; cp = cp-&amp;gt;tail ) {&lt;br /&gt;
		ts[ i ] = cp-&amp;gt;head;&lt;br /&gt;
		i++;&lt;br /&gt;
	}&lt;br /&gt;
	if ( i != 0 ) {&lt;br /&gt;
		i = 0;&lt;br /&gt;
		for ( i = (len - 1); i &amp;gt;= 0; i-- ) {&lt;br /&gt;
			copy = cons( ts[i], copy );&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return copy;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Cons* append( Cons *xs, Cons *ys )&lt;br /&gt;
{&lt;br /&gt;
	Cons *zs = copy_list( xs );&lt;br /&gt;
	Cons *cp;&lt;br /&gt;
	&lt;br /&gt;
	cp = zs;&lt;br /&gt;
	while ( cp != nil ) {		&lt;br /&gt;
		if ( cp-&amp;gt;tail == nil ) {&lt;br /&gt;
			cp-&amp;gt;tail = ys;&lt;br /&gt;
			cp = nil;&lt;br /&gt;
		}&lt;br /&gt;
		else {&lt;br /&gt;
			cp = cp-&amp;gt;tail;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	return zs;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Cons* nappend( Cons *xs, Cons *ys )&lt;br /&gt;
{&lt;br /&gt;
	Cons *cp = xs;&lt;br /&gt;
	while ( cp != nil ) {		&lt;br /&gt;
		if ( cp-&amp;gt;tail == nil ) {&lt;br /&gt;
			cp-&amp;gt;tail = ys;&lt;br /&gt;
			cp = nil;&lt;br /&gt;
		}&lt;br /&gt;
		else {&lt;br /&gt;
			cp = cp-&amp;gt;tail;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return xs;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Cons* reverse( Cons *xs )&lt;br /&gt;
{&lt;br /&gt;
	Cons *cp = nil;&lt;br /&gt;
	Cons *copy = nil;&lt;br /&gt;
	&lt;br /&gt;
	for ( cp = xs; cp != nil; cp = cp-&amp;gt;tail ) {&lt;br /&gt;
		copy = cons( cp-&amp;gt;head, copy );&lt;br /&gt;
	}&lt;br /&gt;
	return copy;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Cons* nreverse( Cons *xs )&lt;br /&gt;
{&lt;br /&gt;
	Cons *cp = nil;&lt;br /&gt;
	&lt;br /&gt;
	int len = length( xs );&lt;br /&gt;
	element_t ts[ len ];&lt;br /&gt;
	int i = 0;&lt;br /&gt;
	&lt;br /&gt;
	for ( cp = xs; cp != nil; cp = cp-&amp;gt;tail ) {&lt;br /&gt;
		ts[ i ] = cp-&amp;gt;head;&lt;br /&gt;
		i++;&lt;br /&gt;
	}&lt;br /&gt;
	if ( i != 0 ) {&lt;br /&gt;
		i = len - 1;&lt;br /&gt;
		for ( cp = xs; cp != nil; cp = cp-&amp;gt;tail ) {&lt;br /&gt;
			cp-&amp;gt;head = ts[i];&lt;br /&gt;
			i--;&lt;br /&gt;
		}&lt;br /&gt;
		cp = xs;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	return cp;&lt;br /&gt;
}&lt;br /&gt;
/* 2nd try for the destructive reverse function */&lt;br /&gt;
Cons *nnreverse( Cons *xs )&lt;br /&gt;
{&lt;br /&gt;
	Cons *prev = xs;&lt;br /&gt;
	Cons *cp = xs-&amp;gt;tail;&lt;br /&gt;
	prev-&amp;gt;tail = nil;&lt;br /&gt;
	while ( cp != nil ) {&lt;br /&gt;
		Cons *t = cp-&amp;gt;tail;&lt;br /&gt;
		cp-&amp;gt;tail = prev;&lt;br /&gt;
		prev = cp;&lt;br /&gt;
		cp = t;&lt;br /&gt;
	}&lt;br /&gt;
	return prev;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main( )&lt;br /&gt;
{&lt;br /&gt;
	printf( &amp;quot;\n&amp;quot; );&lt;br /&gt;
	&lt;br /&gt;
	print_list( cons(1,cons(2,cons(3,nil))) ); /* expect: List[1,2,3] */&lt;br /&gt;
	&lt;br /&gt;
	Cons *my_list = cons(2, cons(4, cons(6, cons(8, nil))));&lt;br /&gt;
	print_list( my_list );&lt;br /&gt;
	printf( &amp;quot;Length of my_list is %d\n&amp;quot;, length(my_list) );&lt;br /&gt;
	&lt;br /&gt;
	printf( &amp;quot;First element is %d\n&amp;quot;&lt;br /&gt;
			&amp;quot;Second element is %d\n&amp;quot;&lt;br /&gt;
			&amp;quot;Third element is %d\n&amp;quot;&lt;br /&gt;
			&amp;quot;Fourth element is %d\n&amp;quot;, &lt;br /&gt;
			first( my_list ), second( my_list ), third( my_list ), fourth( my_list ) );&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	int i;&lt;br /&gt;
	for ( i = 0; i &amp;lt; 10; i++ ) {&lt;br /&gt;
		printf( &amp;quot;The %d&amp;#039;th element is %d\n&amp;quot;, i, nth( i, my_list ) );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	Cons *xs = cons(1, cons(2, nil));&lt;br /&gt;
	Cons *ys = cons(1, cons(2, xs));&lt;br /&gt;
	&lt;br /&gt;
	print_list( xs );&lt;br /&gt;
	print_list( ys );&lt;br /&gt;
	&lt;br /&gt;
	printf( &amp;quot;The two lists xs and ys are %s\n&amp;quot;, (equal(xs, ys) == 1) ? &amp;quot;equal&amp;quot; : &amp;quot;not equal&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	Cons *cp = cons(1, cons(2, cons(3, nil)));&lt;br /&gt;
	&lt;br /&gt;
	Cons *result = find( 4, cp );&lt;br /&gt;
	printf( &amp;quot;%d\n&amp;quot;, (result == nil) ? 0 : result-&amp;gt;head );&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	Cons *cp = cons(67, cons(45, cons(21, cons(89, nil))));&lt;br /&gt;
	&lt;br /&gt;
	print_list( cp );&lt;br /&gt;
	print_list( copy_list( cp ) );&lt;br /&gt;
	&lt;br /&gt;
	printf( &amp;quot;%s\n&amp;quot;, (equal( cp, copy_list(cp) ) == 1) ? &amp;quot;equal&amp;quot; : &amp;quot;not equal&amp;quot; );&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	Cons *xs = cons(1, cons(2, cons(3, nil)));&lt;br /&gt;
	Cons *ys = cons(4, cons(5, cons(6, nil)));&lt;br /&gt;
	Cons *zs = append( xs, ys );&lt;br /&gt;
	&lt;br /&gt;
	print_list( xs );&lt;br /&gt;
	print_list( ys );&lt;br /&gt;
	print_list( zs );&lt;br /&gt;
	&lt;br /&gt;
	ys-&amp;gt;head = 5;&lt;br /&gt;
	print_list( ys );&lt;br /&gt;
	print_list( zs );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	Cons *xs = cons(1, cons(2, cons(3, nil)));&lt;br /&gt;
	Cons *ys = cons(4, cons(5, cons(6, nil)));&lt;br /&gt;
	Cons *zs = nappend( xs, ys );&lt;br /&gt;
	print_list( xs );&lt;br /&gt;
	print_list( ys );&lt;br /&gt;
	print_list( zs );&lt;br /&gt;
	&lt;br /&gt;
	xs-&amp;gt;head = 3;&lt;br /&gt;
	ys-&amp;gt;head = 5;&lt;br /&gt;
	&lt;br /&gt;
	print_list( xs );&lt;br /&gt;
	print_list( ys );&lt;br /&gt;
	print_list( zs );&lt;br /&gt;
&lt;br /&gt;
	Cons *xs = cons(1, cons(2, cons(3, cons(4, cons(5, cons(6, nil))))));&lt;br /&gt;
	print_list( xs );&lt;br /&gt;
	Cons *ys = nnreverse( xs );&lt;br /&gt;
	&lt;br /&gt;
	print_list( xs );&lt;br /&gt;
&lt;br /&gt;
	print_list( ys );&lt;br /&gt;
&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mark</name></author>
	</entry>
</feed>