Fixed bug in deleting elements from linked lists

This commit is contained in:
Graham Nelson 2022-04-05 12:15:52 +01:00
parent 464e855c50
commit a882bf208e
6 changed files with 58 additions and 52 deletions

View file

@ -1,6 +1,6 @@
# Inweb 7
v7-alpha.1+1A83 'Escape to Danger' (4 April 2022)
v7-alpha.1+1A84 'Escape to Danger' (5 April 2022)
## About Inweb

View file

@ -1148,7 +1148,7 @@ typedef struct method {
struct method *next_method;
CLASS_DEFINITION
} method;
#line 23 "inweb/foundation-module/Chapter 2/Linked Lists and Stacks.w"
#line 24 "inweb/foundation-module/Chapter 2/Linked Lists and Stacks.w"
typedef struct linked_list_item {
void *item_contents;
struct linked_list_item *next_list_item;
@ -1158,6 +1158,7 @@ typedef struct linked_list {
struct linked_list_item *first_list_item;
struct linked_list_item *last_list_item;
int linked_list_length;
int early_items_used;
struct linked_list_item early_items[NO_LL_EARLY_ITEMS];
CLASS_DEFINITION
} linked_list;
@ -2827,31 +2828,31 @@ method_set * Methods__new_set(void) ;
void Methods__add(method_set *S, int ID, void *function) ;
#line 90 "inweb/foundation-module/Chapter 2/Methods.w"
int Methods__provided(method_set *S, int ID) ;
#line 29 "inweb/foundation-module/Chapter 2/Linked Lists and Stacks.w"
#line 30 "inweb/foundation-module/Chapter 2/Linked Lists and Stacks.w"
linked_list * LinkedLists__new(void) ;
#line 35 "inweb/foundation-module/Chapter 2/Linked Lists and Stacks.w"
#line 36 "inweb/foundation-module/Chapter 2/Linked Lists and Stacks.w"
void LinkedLists__empty(linked_list *ll) ;
#line 45 "inweb/foundation-module/Chapter 2/Linked Lists and Stacks.w"
#line 47 "inweb/foundation-module/Chapter 2/Linked Lists and Stacks.w"
void LinkedLists__add(linked_list *L, void *P, int to_end) ;
#line 73 "inweb/foundation-module/Chapter 2/Linked Lists and Stacks.w"
#line 75 "inweb/foundation-module/Chapter 2/Linked Lists and Stacks.w"
void * LinkedLists__remove_from_front(linked_list *L) ;
#line 86 "inweb/foundation-module/Chapter 2/Linked Lists and Stacks.w"
#line 88 "inweb/foundation-module/Chapter 2/Linked Lists and Stacks.w"
void * LinkedLists__delete(int N, linked_list *L) ;
#line 110 "inweb/foundation-module/Chapter 2/Linked Lists and Stacks.w"
#line 112 "inweb/foundation-module/Chapter 2/Linked Lists and Stacks.w"
void LinkedLists__insert(linked_list *L, int N, void *P) ;
#line 138 "inweb/foundation-module/Chapter 2/Linked Lists and Stacks.w"
#line 140 "inweb/foundation-module/Chapter 2/Linked Lists and Stacks.w"
int LinkedLists__len(linked_list *L) ;
#line 141 "inweb/foundation-module/Chapter 2/Linked Lists and Stacks.w"
#line 143 "inweb/foundation-module/Chapter 2/Linked Lists and Stacks.w"
linked_list_item * LinkedLists__first(linked_list *L) ;
#line 144 "inweb/foundation-module/Chapter 2/Linked Lists and Stacks.w"
#line 146 "inweb/foundation-module/Chapter 2/Linked Lists and Stacks.w"
void * LinkedLists__entry(int N, linked_list *L) ;
#line 151 "inweb/foundation-module/Chapter 2/Linked Lists and Stacks.w"
#line 153 "inweb/foundation-module/Chapter 2/Linked Lists and Stacks.w"
void LinkedLists__set_entry(int N, linked_list *L, void *P) ;
#line 158 "inweb/foundation-module/Chapter 2/Linked Lists and Stacks.w"
#line 160 "inweb/foundation-module/Chapter 2/Linked Lists and Stacks.w"
linked_list_item * LinkedLists__last(linked_list *L) ;
#line 161 "inweb/foundation-module/Chapter 2/Linked Lists and Stacks.w"
#line 163 "inweb/foundation-module/Chapter 2/Linked Lists and Stacks.w"
linked_list_item * LinkedLists__next(linked_list_item *I) ;
#line 164 "inweb/foundation-module/Chapter 2/Linked Lists and Stacks.w"
#line 166 "inweb/foundation-module/Chapter 2/Linked Lists and Stacks.w"
void * LinkedLists__content(linked_list_item *I) ;
#line 33 "inweb/foundation-module/Chapter 2/Dictionaries.w"
dictionary * Dictionaries__new(int S, int textual) ;
@ -7602,11 +7603,11 @@ int Methods__provided(method_set *S, int ID) {
return FALSE;
}
#line 22 "inweb/foundation-module/Chapter 2/Linked Lists and Stacks.w"
#line 23 "inweb/foundation-module/Chapter 2/Linked Lists and Stacks.w"
#line 27 "inweb/foundation-module/Chapter 2/Linked Lists and Stacks.w"
#line 28 "inweb/foundation-module/Chapter 2/Linked Lists and Stacks.w"
#line 29 "inweb/foundation-module/Chapter 2/Linked Lists and Stacks.w"
#line 30 "inweb/foundation-module/Chapter 2/Linked Lists and Stacks.w"
linked_list *LinkedLists__new(void) {
linked_list *ll = CREATE(linked_list);
LinkedLists__empty(ll);
@ -7615,16 +7616,17 @@ linked_list *LinkedLists__new(void) {
void LinkedLists__empty(linked_list *ll) {
ll->linked_list_length = 0;
ll->early_items_used = 0;
ll->first_list_item = NULL;
ll->last_list_item = NULL;
}
#line 45 "inweb/foundation-module/Chapter 2/Linked Lists and Stacks.w"
#line 47 "inweb/foundation-module/Chapter 2/Linked Lists and Stacks.w"
void LinkedLists__add(linked_list *L, void *P, int to_end) {
if (L == NULL) internal_error("null list");
linked_list_item *item = NULL;
if (L->linked_list_length < NO_LL_EARLY_ITEMS)
item = &(L->early_items[L->linked_list_length]);
if (L->early_items_used < NO_LL_EARLY_ITEMS)
item = &(L->early_items[L->early_items_used++]);
else
item = CREATE(linked_list_item);
item->item_contents = P;
@ -7645,18 +7647,18 @@ void LinkedLists__add(linked_list *L, void *P, int to_end) {
L->linked_list_length++;
}
#line 73 "inweb/foundation-module/Chapter 2/Linked Lists and Stacks.w"
#line 75 "inweb/foundation-module/Chapter 2/Linked Lists and Stacks.w"
void *LinkedLists__remove_from_front(linked_list *L) {
if (L == NULL) internal_error("null list");
if (L->first_list_item == NULL) internal_error("empty list can't be popped");
linked_list_item *top = L->first_list_item;
L->first_list_item = top->next_list_item;
linked_list_item *front = L->first_list_item;
if (front == NULL) internal_error("empty list can't have item 0 removed");
L->first_list_item = front->next_list_item;
if (L->first_list_item == NULL) L->last_list_item = NULL;
L->linked_list_length--;
return top->item_contents;
return front->item_contents;
}
#line 86 "inweb/foundation-module/Chapter 2/Linked Lists and Stacks.w"
#line 88 "inweb/foundation-module/Chapter 2/Linked Lists and Stacks.w"
void *LinkedLists__delete(int N, linked_list *L) {
if (L == NULL) internal_error("null list");
if ((N < 0) || (N >= L->linked_list_length)) internal_error("index not valid");
@ -7677,7 +7679,7 @@ void *LinkedLists__delete(int N, linked_list *L) {
return NULL;
}
#line 110 "inweb/foundation-module/Chapter 2/Linked Lists and Stacks.w"
#line 112 "inweb/foundation-module/Chapter 2/Linked Lists and Stacks.w"
void LinkedLists__insert(linked_list *L, int N, void *P) {
if (N <= 0) LinkedLists__add(L, P, FALSE);
else {
@ -7689,8 +7691,8 @@ void LinkedLists__insert(linked_list *L, int N, void *P) {
if (prev == NULL) LinkedLists__add(L, P, FALSE);
else {
linked_list_item *item = NULL;
if (L->linked_list_length < NO_LL_EARLY_ITEMS)
item = &(L->early_items[L->linked_list_length]);
if (L->early_items_used < NO_LL_EARLY_ITEMS)
item = &(L->early_items[L->early_items_used++]);
else
item = CREATE(linked_list_item);
item->item_contents = P;
@ -7703,7 +7705,7 @@ void LinkedLists__insert(linked_list *L, int N, void *P) {
}
}
#line 138 "inweb/foundation-module/Chapter 2/Linked Lists and Stacks.w"
#line 140 "inweb/foundation-module/Chapter 2/Linked Lists and Stacks.w"
int LinkedLists__len(linked_list *L) {
return L?(L->linked_list_length):0;
}
@ -8590,11 +8592,11 @@ int CommandLine__read_pair_p(text_stream *opt, text_stream *opt_val, int N,
; innocuous = TRUE; break;
case VERSION_CLSW: {
PRINT("inweb");
char *svn = "7-alpha.1+1A83";
char *svn = "7-alpha.1+1A84";
if (svn[0]) PRINT(" version %s", svn);
char *vname = "Escape to Danger";
if (vname[0]) PRINT(" '%s'", vname);
char *d = "4 April 2022";
char *d = "5 April 2022";
if (d[0]) PRINT(" (%s)", d);
PRINT("\n");
innocuous = TRUE; break;
@ -30928,7 +30930,7 @@ void Ctags__write(web *W, filename *F) {
WRITE("!_TAG_FILE_SORTED\t0\t/0=unsorted, 1=sorted, 2=foldcase/\n");
WRITE("!_TAG_PROGRAM_AUTHOR\tGraham Nelson\t/graham.nelson@mod-langs.ox.ac.uk/\n");
WRITE("!_TAG_PROGRAM_NAME\tinweb\t//\n");
WRITE("!_TAG_PROGRAM_VERSION\t7-alpha.1+1A83\t/built 4 April 2022/\n");
WRITE("!_TAG_PROGRAM_VERSION\t7-alpha.1+1A84\t/built 5 April 2022/\n");
}
#line 47 "inweb/Chapter 6/Ctags Support.w"

View file

@ -1,3 +1,3 @@
Prerelease: alpha.1
Build Date: 4 April 2022
Build Number: 1A83
Build Date: 5 April 2022
Build Number: 1A84

View file

@ -65,6 +65,7 @@ a few items, only one call to the memory manager is needed.
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">linked_list_item</span><span class="plain-syntax"> *</span><span class="identifier-syntax">first_list_item</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">linked_list_item</span><span class="plain-syntax"> *</span><span class="identifier-syntax">last_list_item</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">linked_list_length</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">early_items_used</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">linked_list_item</span><span class="plain-syntax"> </span><span class="identifier-syntax">early_items</span><span class="plain-syntax">[</span><span class="constant-syntax">NO_LL_EARLY_ITEMS</span><span class="plain-syntax">];</span>
<span class="plain-syntax"> </span><span class="constant-syntax">CLASS_DEFINITION</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">linked_list</span><span class="plain-syntax">;</span>
@ -86,6 +87,7 @@ a few items, only one call to the memory manager is needed.
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">LinkedLists::empty</span><span class="plain-syntax">(</span><span class="reserved-syntax">linked_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ll</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ll</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">linked_list_length</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ll</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">early_items_used</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ll</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_list_item</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ll</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">last_list_item</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
@ -98,8 +100,8 @@ want speed rather than memory efficiency.
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">LinkedLists::add</span><button class="popup" onclick="togglePopup('usagePopup2')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup2">Usage of <span class="code-font"><span class="function-syntax">LinkedLists::add</span></span>:<br/><a href="2-llas.html#SP6">&#167;6</a>, <a href="2-llas.html#SP8">&#167;8</a>, <a href="2-llas.html#SP11">&#167;11</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">linked_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">L</span><span class="plain-syntax">, </span><span class="reserved-syntax">void</span><span class="plain-syntax"> *</span><span class="identifier-syntax">P</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">to_end</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">L</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"null list"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">linked_list_item</span><span class="plain-syntax"> *</span><span class="identifier-syntax">item</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">L</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">linked_list_length</span><span class="plain-syntax"> &lt; </span><span class="constant-syntax">NO_LL_EARLY_ITEMS</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">item</span><span class="plain-syntax"> = &amp;(</span><span class="identifier-syntax">L</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">early_items</span><span class="plain-syntax">[</span><span class="identifier-syntax">L</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">linked_list_length</span><span class="plain-syntax">]);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">L</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">early_items_used</span><span class="plain-syntax"> &lt; </span><span class="constant-syntax">NO_LL_EARLY_ITEMS</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">item</span><span class="plain-syntax"> = &amp;(</span><span class="identifier-syntax">L</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">early_items</span><span class="plain-syntax">[</span><span class="identifier-syntax">L</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">early_items_used</span><span class="plain-syntax">++]);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">item</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CREATE</span><span class="plain-syntax">(</span><span class="reserved-syntax">linked_list_item</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">item</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">item_contents</span><span class="plain-syntax"> = </span><span class="identifier-syntax">P</span><span class="plain-syntax">;</span>
@ -126,12 +128,12 @@ want speed rather than memory efficiency.
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> *</span><span class="function-syntax">LinkedLists::remove_from_front</span><button class="popup" onclick="togglePopup('usagePopup3')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup3">Usage of <span class="code-font"><span class="function-syntax">LinkedLists::remove_from_front</span></span>:<br/><a href="2-llas.html#SP5">&#167;5</a>, <a href="2-llas.html#SP11">&#167;11</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">linked_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">L</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">L</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"null list"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">L</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_list_item</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"empty list can't be popped"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">linked_list_item</span><span class="plain-syntax"> *</span><span class="identifier-syntax">top</span><span class="plain-syntax"> = </span><span class="identifier-syntax">L</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_list_item</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">L</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_list_item</span><span class="plain-syntax"> = </span><span class="identifier-syntax">top</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_list_item</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">linked_list_item</span><span class="plain-syntax"> *</span><span class="identifier-syntax">front</span><span class="plain-syntax"> = </span><span class="identifier-syntax">L</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_list_item</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">front</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"empty list can't have item 0 removed"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">L</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">first_list_item</span><span class="plain-syntax"> = </span><span class="identifier-syntax">front</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_list_item</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">L</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">first_list_item</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">L</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">last_list_item</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">L</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">linked_list_length</span><span class="plain-syntax">--;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">top</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">item_contents</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">front</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">item_contents</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>&#167;5. </b>It's rather slower to delete from a known position in the middle:
@ -174,8 +176,8 @@ of the list, <span class="extract"><span class="extract-syntax">N</span></span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">prev</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><a href="2-llas.html#SP3" class="function-link"><span class="function-syntax">LinkedLists::add</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">L</span><span class="plain-syntax">, </span><span class="identifier-syntax">P</span><span class="plain-syntax">, </span><span class="constant-syntax">FALSE</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">linked_list_item</span><span class="plain-syntax"> *</span><span class="identifier-syntax">item</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">L</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">linked_list_length</span><span class="plain-syntax"> &lt; </span><span class="constant-syntax">NO_LL_EARLY_ITEMS</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">item</span><span class="plain-syntax"> = &amp;(</span><span class="identifier-syntax">L</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">early_items</span><span class="plain-syntax">[</span><span class="identifier-syntax">L</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">linked_list_length</span><span class="plain-syntax">]);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">L</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">early_items_used</span><span class="plain-syntax"> &lt; </span><span class="constant-syntax">NO_LL_EARLY_ITEMS</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">item</span><span class="plain-syntax"> = &amp;(</span><span class="identifier-syntax">L</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">early_items</span><span class="plain-syntax">[</span><span class="identifier-syntax">L</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">early_items_used</span><span class="plain-syntax">++]);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">item</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CREATE</span><span class="plain-syntax">(</span><span class="reserved-syntax">linked_list_item</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">item</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">item_contents</span><span class="plain-syntax"> = </span><span class="identifier-syntax">P</span><span class="plain-syntax">;</span>

Binary file not shown.

View file

@ -16,6 +16,7 @@ typedef struct linked_list {
struct linked_list_item *first_list_item;
struct linked_list_item *last_list_item;
int linked_list_length;
int early_items_used;
struct linked_list_item early_items[NO_LL_EARLY_ITEMS];
CLASS_DEFINITION
} linked_list;
@ -34,6 +35,7 @@ linked_list *LinkedLists::new(void) {
void LinkedLists::empty(linked_list *ll) {
ll->linked_list_length = 0;
ll->early_items_used = 0;
ll->first_list_item = NULL;
ll->last_list_item = NULL;
}
@ -45,8 +47,8 @@ want speed rather than memory efficiency.
void LinkedLists::add(linked_list *L, void *P, int to_end) {
if (L == NULL) internal_error("null list");
linked_list_item *item = NULL;
if (L->linked_list_length < NO_LL_EARLY_ITEMS)
item = &(L->early_items[L->linked_list_length]);
if (L->early_items_used < NO_LL_EARLY_ITEMS)
item = &(L->early_items[L->early_items_used++]);
else
item = CREATE(linked_list_item);
item->item_contents = P;
@ -72,12 +74,12 @@ void LinkedLists::add(linked_list *L, void *P, int to_end) {
=
void *LinkedLists::remove_from_front(linked_list *L) {
if (L == NULL) internal_error("null list");
if (L->first_list_item == NULL) internal_error("empty list can't be popped");
linked_list_item *top = L->first_list_item;
L->first_list_item = top->next_list_item;
linked_list_item *front = L->first_list_item;
if (front == NULL) internal_error("empty list can't have item 0 removed");
L->first_list_item = front->next_list_item;
if (L->first_list_item == NULL) L->last_list_item = NULL;
L->linked_list_length--;
return top->item_contents;
return front->item_contents;
}
@ It's rather slower to delete from a known position in the middle:
@ -118,8 +120,8 @@ void LinkedLists::insert(linked_list *L, int N, void *P) {
if (prev == NULL) LinkedLists::add(L, P, FALSE);
else {
linked_list_item *item = NULL;
if (L->linked_list_length < NO_LL_EARLY_ITEMS)
item = &(L->early_items[L->linked_list_length]);
if (L->early_items_used < NO_LL_EARLY_ITEMS)
item = &(L->early_items[L->early_items_used++]);
else
item = CREATE(linked_list_item);
item->item_contents = P;