<?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-3%3Ajham005%3Aarraylist.c</id>
	<title>SE250:lab-3:jham005:arraylist.c - 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-3%3Ajham005%3Aarraylist.c"/>
	<link rel="alternate" type="text/html" href="https://wiki.kram.nz/index.php?title=SE250:lab-3:jham005:arraylist.c&amp;action=history"/>
	<updated>2026-04-12T22:51:35Z</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-3:jham005:arraylist.c&amp;diff=5554&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-3:jham005:arraylist.c&amp;diff=5554&amp;oldid=prev"/>
		<updated>2008-11-03T05:19:20Z</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; /*&lt;br /&gt;
   File:    arraylist.c&lt;br /&gt;
   Date:    18 March 2008&lt;br /&gt;
   Author:  John Hamer&lt;br /&gt;
   Purpose: resizable array-based list data structure&lt;br /&gt;
 */&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;lt;stdio.h&amp;gt;		/* for printf */&lt;br /&gt;
 #include &amp;lt;stdlib.h&amp;gt;		/* for malloc, realloc, free */&lt;br /&gt;
 #include &amp;lt;string.h&amp;gt;		/* for memmove */&lt;br /&gt;
 #include &amp;lt;assert.h&amp;gt;		/* for assert */&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;quot;arraylist.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 int    ARRAYLIST_MIN_ALLOC     = 16;&lt;br /&gt;
 double ARRAYLIST_GROWTH_FACTOR = 2.0;&lt;br /&gt;
 int    ARRAYLIST_GROWTH_INCR   = 0;&lt;br /&gt;
 int    ARRAYLIST_ALWAYS_MALLOC = 0;&lt;br /&gt;
 &lt;br /&gt;
 void arraylist_init( ArrayList *alist ) {&lt;br /&gt;
   alist-&amp;gt;arr = 0;&lt;br /&gt;
   alist-&amp;gt;length = 0;&lt;br /&gt;
   alist-&amp;gt;capacity = 0;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 void arraylist_clear( ArrayList *alist ) {&lt;br /&gt;
   if( alist-&amp;gt;arr )&lt;br /&gt;
     free( alist-&amp;gt;arr );&lt;br /&gt;
   arraylist_init( alist );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 int arraylist_size( ArrayList *alist ) {&lt;br /&gt;
   return alist-&amp;gt;length;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 void ensure_capacity( ArrayList *alist, int required_capacity ) {&lt;br /&gt;
   if( required_capacity &amp;gt; alist-&amp;gt;capacity ) {&lt;br /&gt;
     if( ARRAYLIST_ALWAYS_MALLOC ) {&lt;br /&gt;
       element_t* newarr = malloc( required_capacity * sizeof( element_t ) );&lt;br /&gt;
       assert( newarr != (element_t*)0 );&lt;br /&gt;
       memmove( newarr, alist-&amp;gt;arr, alist-&amp;gt;length * sizeof(element_t) );&lt;br /&gt;
       free( alist-&amp;gt;arr );&lt;br /&gt;
       alist-&amp;gt;arr = newarr;&lt;br /&gt;
     } else {&lt;br /&gt;
       /* This is the &amp;quot;right thing to do&amp;quot;, but it messes up the timings.&lt;br /&gt;
 	 In our benchmarks, nothing else allocates memory and so realloc&lt;br /&gt;
 	 may end up with very little work to do.  In a real program,&lt;br /&gt;
 	 many data structures compete for memory, and realloc will&lt;br /&gt;
 	 usually need to perform the steps in the #ifdef above.&lt;br /&gt;
       */&lt;br /&gt;
       alist-&amp;gt;arr = realloc( alist-&amp;gt;arr, required_capacity * sizeof(element_t) );&lt;br /&gt;
       assert( alist-&amp;gt;arr != (element_t*)0 );&lt;br /&gt;
     }&lt;br /&gt;
     alist-&amp;gt;capacity = required_capacity;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 void arraylist_put( ArrayList *alist, element_t elt, int index ) {&lt;br /&gt;
   assert( index &amp;gt;= 0 &amp;amp;&amp;amp; index &amp;lt;= alist-&amp;gt;length );&lt;br /&gt;
   if( alist-&amp;gt;length == alist-&amp;gt;capacity ) {&lt;br /&gt;
     int expand;&lt;br /&gt;
     if( expand &amp;lt; ARRAYLIST_MIN_ALLOC )&lt;br /&gt;
       expand = ARRAYLIST_MIN_ALLOC;&lt;br /&gt;
     else&lt;br /&gt;
       expand = (int)(alist-&amp;gt;capacity * ARRAYLIST_GROWTH_FACTOR + ARRAYLIST_GROWTH_INCR );&lt;br /&gt;
 &lt;br /&gt;
     if( expand &amp;lt; alist-&amp;gt;capacity + 1 )&lt;br /&gt;
       expand = alist-&amp;gt;capacity + 1;&lt;br /&gt;
 &lt;br /&gt;
     ensure_capacity( alist, expand );&lt;br /&gt;
   }&lt;br /&gt;
   memmove( &amp;amp;alist-&amp;gt;arr[ index + 1 ], &amp;amp;alist-&amp;gt;arr[ index ], &lt;br /&gt;
 	   (alist-&amp;gt;length - index) * sizeof( element_t ) );&lt;br /&gt;
   alist-&amp;gt;arr[ index ] = elt;&lt;br /&gt;
   alist-&amp;gt;length++;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 void arraylist_push( ArrayList *alist, element_t elt ) {&lt;br /&gt;
   arraylist_put( alist, elt, alist-&amp;gt;length );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 element_t arraylist_get( ArrayList *alist, int index ) {&lt;br /&gt;
   assert( index &amp;gt;= 0 &amp;amp;&amp;amp; index &amp;lt; alist-&amp;gt;length );&lt;br /&gt;
   return alist-&amp;gt;arr[ index ];&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 element_t arraylist_pop( ArrayList *alist ) {&lt;br /&gt;
   assert( alist-&amp;gt;length &amp;gt; 0 );&lt;br /&gt;
   return alist-&amp;gt;arr[ --alist-&amp;gt;length ];&lt;br /&gt;
 }&lt;/div&gt;</summary>
		<author><name>Mark</name></author>
	</entry>
</feed>