======Data Structures Journal======
====18 September 2014====
Notes
Fix your makefile for node0:
Change into your node0 folder
then issue fixit
lab46:~/src/Data/node0$ fixit
Copying base Makefile from /var/public/data/fall2014/node0 ...
'/var/public/data/fall2014/node0/Makefile' -> '/home/mgardne8/src/Data/node0/Makefile'
View the new make help
lab46:~/src/Data/node0$ make help
*********************************************************
*** NEW UPDATE AVAILABLE: Type 'make update' to apply ***
*********************************************************
****************[ Data Structures List Implementation ]*****************
** make - build everything (libs and testing) **
** make debug - build everything with debug symbols **
** **
** make libs - build all supporting libraries **
** make libs-debug - build all libraries with debug symbols **
** make testing - build unit tests **
** make testing-debug - build unit tests with debugging symbols **
** **
** make save - create a backup archive **
** make submit - submit assignment (based on dirname) **
** make update - check for and apply updates **
** **
** make clean - clean; remove all objects/compiled code **
** make help - this information **
************************************************************************
apply the new update:
make update
lab46:~/src/Data/node0$ make update
Update 1 COMMENCING
Update 1 CHANGE SUMMARY: Fixed base and other Makefile typos
Please reference errata section on project page for more information
Update 1 COMPLETE
Update 2 COMMENCING
Update 2 CHANGE SUMMARY: Ensure sane permissions for files
Please reference errata section on project page for more information
Update 2 COMPLETE
Updated from revision 0 to revision 2
Linked list
[temp->(12)->(57)->(26)->NULL]
singly linked list^^
[NULL<->(12)<->(57)<->(26)<->NULL]
doubly linked list^^
linked lists
cplist() copy list
rmlist() removes the list element by element
mklist() makes the list?
insert() add a node BEFORE specified node
append() add a node AFTER specified node
obtain() disconnect specified node from list
displayf() Display list from the beginning to the end
displayb() Display list from the end to the beginning
search()
sortlist()
swap()
Submit can now be used to see your status on projects
lab46:~/src/Data/node0$ submit data
data projects:
intro, submitted on 20140911-085637
node0, due on 20140924 (in 6 days)
node1, due on 20141001 (in 13 days)
====23 September 2014====
===node0===
Upgrade node0 to node1 with make upgrade-node1 inside of node0
--(mgardne8@lab46)-(09:10am)-( ~/src/Data/node0$)--
-->make upgrade-node1
make[1]: Entering directory '/home/mgardne8/src/Data/node0/src'
make[2]: Entering directory '/home/mgardne8/src/Data/node0/src/node'
rm -f *.swp *.o core
make[2]: Leaving directory '/home/mgardne8/src/Data/node0/src/node'
make[1]: Leaving directory '/home/mgardne8/src/Data/node0/src'
make[1]: Entering directory '/home/mgardne8/src/Data/node0/testing'
make[2]: Entering directory '/home/mgardne8/src/Data/node0/testing/node'
make[3]: Entering directory '/home/mgardne8/src/Data/node0/testing/node/app'
rm -f *.swp *.o ../../../bin/node-app-display node-app-test node-app-test2 core
make[3]: Leaving directory '/home/mgardne8/src/Data/node0/testing/node/app'
make[2]: Leaving directory '/home/mgardne8/src/Data/node0/testing/node'
make[1]: Leaving directory '/home/mgardne8/src/Data/node0/testing'
Archiving the project ...
Compressing the archive ...
Setting Permissions ...
You may now switch to the ../node1 directory
There are new files in:
./src/node/
./testing/node/app/
./testing/node/unit/
Each function is in it's own file:
./src/node/mk.c - make node
./src/node/rm.c - remove node
./src/node/cp.c - copy node
===Code===
Node *tmp3, *tmp4;
tmp3 = mknode(8);
tmp4 = cpnode(tmp3);
tmp3 -> (8) -> NULL <- (8) <- tmp4
tmp3 = rmnode(tmp3);
NULL <- (8) <- tmp4
malloc allocates;
free deallocates;
====25 September 2014====
===NAI (Notes As Images)===
{{:opus:fall2014:mgardne8:sep_25_1.bmp|}}
{{:opus:fall2014:mgardne8:sep_25_2.bmp|}}
{{:opus:fall2014:mgardne8:sep_25_3.bmp|}}
{{:opus:fall2014:mgardne8:sep_25_4.bmp|}}
{{:opus:fall2014:mgardne8:sep_25_5.bmp|}}
===NAC (Notes As Code)===
#include
#include
struct node{
char value;
struct node *next;
};
typedef struct node Node;
int main(void)
{
Node *tmp, *tmp2, *start, *end;
tmp = tmp2 = start = end = NULL;
char input;
int i;
while (input != -1)
{
printf("Enter a value(-1 to finalize): ");
scanf ("%hhd",&input);
if(start == NULL)
{
start = end = (Node*)malloc(sizeof(Node));
start->value = input;
start->next = NULL;
}
else
{
end->next = (Node*)malloc(sizeof(Node));
end = end->next;
end->value = input;
end->next = NULL;
}
}
printf("Enter value of new node: ");
scanf ("%hhd",&input);
tmp = (Node*)malloc(sizeof(Node));
tmp->value = input;
tmp->next = NULL;
printf("Enter node value to insert before: ");
scanf ("%hhd",&input);
tmp2 = start;
while(tmp2->next->value != input)
{
tmp2 = tmp2->next;
}
tmp->next = tmp2->next;
tmp2->next = tmp;
//display the list
return(0);
}
===JMW (Just Misc. Writing)===
insert before
append after
tmp ->NULL
tmp2 ->(13)
Insert node into empty list, node becomes the list
tmp ->(13)<- tmp2
insert tmp before tmp2
tmp2->(x)
====2 October 2014====
{{:opus:fall2014:mgardne8:compiler_complaint.png|Ouch!}}
===Debugging!===
==Working it out==
#include
#include
//Original/Broken
struct node {
char value;
struct node *next;
};
typedef struct node Node;
int main()
{
Node *start, *end, *tmp, *tmp2;
char input;
start = end = tmp = tmp2 = (Node *) malloc (sizeof(Node)*1);
tmp -> value = 0;
tmp -> next = NULL;
fprintf(stdout, "Enter a value (-1 to complete): ");
fscanf(stdin, "%hhd", &input);
while (input != -1)
{
end -> value = input;
end -> next = (Node *) malloc (sizeof(Node)*1);
end -> next -> value = 0;
end -> next -> next = NULL;
fprintf(stdout, "Enter a value (-1 to complete): ");
fscanf(stdin, "%hhd", &input);
if (input == -1)
{
free(end -> next);
end -> next = NULL;
}
else
end = end -> next;
}
// Display list from start to end
fprintf(stdout, "Enter value for new node: ");
fscanf(stdin, "%hhd", &input);
tmp = (Node *) malloc (sizeof(Node));
tmp -> value = input;
tmp -> next = NULL;
fprintf(stdout, "Enter value of node you want to insert new node before: ");
fscanf(stdin, "%hhd", &input);
tmp2 = start;
while (tmp2 -> next -> value != tmp -> value)
tmp2 = tmp2 -> next;
tmp -> next = tmp2 -> next;
tmp2 -> next = tmp;
// Display list from start to end
return(0);
}
--(mgardne8@[ 0;37mlab46)-(08:48am)-( ~/src/Data/example$)--
-->ll
total 4
-rw-r----- 1 mgardne8 lab46 1230 Sep 30 10:22 sll-debug.c
--(mgardne8@[ 0;37mlab46)-(08:48am)-( ~/src/Data/example$)--
-->gcc -g -o sll-debug sll-debug.c
--(mgardne8@[ 0;37mlab46)-(08:48am)-( ~/src/Data/example$)--
-->gdb sll-debug
GNU gdb (Debian 7.7.1+dfsg-3) 7.7.1
Copyright (C) 2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
.
Find the GDB manual and other documentation resources online at:
.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from sll-debug...done.
(gdb) run
Starting program: /home/mgardne8/src/Data/example/sll-debug
Enter a value (-1 to complete): 1
Enter a value (-1 to complete): 2
Enter a value (-1 to complete): 3
Enter a value (-1 to complete): 4
Enter a value (-1 to complete): -1
Enter value for new node: 10
Enter value of node you want to insert new node before: 2
Program received signal SIGSEGV, Segmentation fault.
0x0000000000400862 in main () at sll-debug.c:55
55 while (tmp2 -> next -> value != tmp -> value)
(gdb) print tmp -> value
$1 = 10 '\n'
(gdb) print tmp2 -> next -> value
Cannot access memory at address 0x0
(gdb) print tmp2 -> value
$2 = 4 '\004'
(gdb) quit
A debugging session is active.
Inferior 1 [process 14301] will be killed.
Quit anyway? (y or n) y
It appears to be segfaulting on line 55,
looking at the line, we are checking for the int 'tmp -> value' and not the int 'input'
lets fix this and try again
#include
#include
//Fixed!
struct node {
char value;
struct node *next;
};
typedef struct node Node;
int main()
{
Node *start, *end, *tmp, *tmp2;
char input;
start = end = tmp = tmp2 = (Node *) malloc (sizeof(Node)*1);
tmp -> value = 0;
tmp -> next = NULL;
fprintf(stdout, "Enter a value (-1 to complete): ");
fscanf(stdin, "%hhd", &input);
while (input != -1)
{
end -> value = input;
end -> next = (Node *) malloc (sizeof(Node)*1);
end -> next -> value = 0;
end -> next -> next = NULL;
fprintf(stdout, "Enter a value (-1 to complete): ");
fscanf(stdin, "%hhd", &input);
if (input == -1)
{
free(end -> next);
end -> next = NULL;
}
else
end = end -> next;
}
// Display list from start to end
fprintf(stdout, "Enter value for new node: ");
fscanf(stdin, "%hhd", &input);
tmp = (Node *) malloc (sizeof(Node));
tmp -> value = input;
tmp -> next = NULL;
fprintf(stdout, "Enter value of node you want to insert new node before: ");
fscanf(stdin, "%hhd", &input);
tmp2 = start;
while (tmp2 -> next -> value != input) // replaced 'tmp -> value' with 'input'
tmp2 = tmp2 -> next;
tmp -> next = tmp2 -> next;
tmp2 -> next = tmp;
// Display list from start to end
return(0);
}
--(mgardne8@[ 0;37mlab46)-(08:48am)-( ~/src/Data/example$)--
-->gcc -g -o sll-debug-fixed sll-debug-fixed.c
--(mgardne8@[ 0;37mlab46)-(08:48am)-( ~/src/Data/example$)--
-->gdb sll-debug-fixed
GNU gdb (Debian 7.7.1+dfsg-3) 7.7.1
Copyright (C) 2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
.
Find the GDB manual and other documentation resources online at:
.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from sll-debug-fixed...done.
(gdb) run
Starting program: /home/mgardne8/src/Data/example/sll-debug-fixed
Enter a value (-1 to complete): 1
Enter a value (-1 to complete): 2
Enter a value (-1 to complete): 3
Enter a value (-1 to complete): 4
Enter a value (-1 to complete): 5
Enter a value (-1 to complete): 6
Enter a value (-1 to complete): 7
Enter a value (-1 to complete): -1
Enter value for new node: 900
Enter value of node you want to insert new node before: 4
[Inferior 1 (process 15835) exited normally]
(gdb) quit
It works!
==Quick notes==
x - Dereferences value and dumps memory at that location - can't use on non-pointers
(gdb) x tmp
0x6010d0: 0x00000009
(gdb) x tmp2
0x601030: 0x00000002
(gdb) x tmp2->next
0x601050: 0x00000003
(gdb) x tmp2->next->value
0x3: Cannot access memory at address 0x3
(gdb) x input
0x5: Cannot access memory at address 0x5
whatis - displays variable type!
(gdb) whatis input
type = char
(gdb) whatis tmp
type = Node *
(gdb) whatis tmp->next
type = struct node *
(gdb) whatis tmp->value
type = char
set var =
(gdb) print tmp->value
$2 = 9 '\t'
(gdb) set var tmp->value=8
(gdb) print tmp->value
$3 = 8 '\b'
disas /m main
(gdb) disas /m main - dissasemble and dump the assembler code
Dump of assembler code for function main:
11 {
0x0000000000400676 <+0>: push %rbp
0x0000000000400677 <+1>: mov %rsp,%rbp
0x000000000040067a <+4>: sub $0x30,%rsp
12 Node *start, *end, *tmp, *tmp2;
13 char input;
14
15 start = end = tmp = tmp2 = (Node *) malloc (sizeof(Node)*1);
0x000000000040067e <+8>: mov $0x10,%edi
0x0000000000400683 <+13>: callq 0x400560
0x0000000000400688 <+18>: mov %rax,-0x10(%rbp)
0x000000000040068c <+22>: mov -0x10(%rbp),%rax
0x0000000000400690 <+26>: mov %rax,-0x18(%rbp)
0x0000000000400694 <+30>: mov -0x18(%rbp),%rax
0x0000000000400698 <+34>: mov %rax,-0x8(%rbp)
0x000000000040069c <+38>: mov -0x8(%rbp),%rax
0x00000000004006a0 <+42>: mov %rax,-0x20(%rbp)
16 tmp -> value = 0;
0x00000000004006a4 <+46>: mov -0x18(%rbp),%rax
0x00000000004006a8 <+50>: movb $0x0,(%rax)
17 tmp -> next = NULL;
0x00000000004006ab <+53>: mov -0x18(%rbp),%rax
0x00000000004006af <+57>: movq $0x0,0x8(%rax)
18
19 fprintf(stdout, "Enter a value (-1 to complete): ");
0x00000000004006b7 <+65>: mov 0x200652(%rip),%rax # 0x600d10
0x00000000004006be <+72>: mov %rax,%rcx
0x00000000004006c1 <+75>: mov $0x20,%edx
0x00000000004006c6 <+80>: mov $0x1,%esi
0x00000000004006cb <+85>: mov $0x400918,%edi
0x00000000004006d0 <+90>: callq 0x400570
20 fscanf(stdin, "%hhd", &input);
0x00000000004006d5 <+95>: mov 0x20063c(%rip),%rax # 0x600d18
0x00000000004006dc <+102>: lea -0x21(%rbp),%rdx
0x00000000004006e0 <+106>: mov $0x400939,%esi
0x00000000004006e5 <+111>: mov %rax,%rdi
0x00000000004006e8 <+114>: mov $0x0,%eax
0x00000000004006ed <+119>: callq 0x400530 <__isoc99_fscanf@plt>
21
22 while (input != -1)
0x00000000004006f2 <+124>: jmpq 0x40079e
0x000000000040079e <+296>: movzbl -0x21(%rbp),%eax
---Type to continue, or q to quit---
0x00000000004007a2 <+300>: cmp $0xff,%al
0x00000000004007a4 <+302>: jne 0x4006f7
23 {
24 end -> value = input;
0x00000000004006f7 <+129>: movzbl -0x21(%rbp),%edx
0x00000000004006fb <+133>: mov -0x8(%rbp),%rax
0x00000000004006ff <+137>: mov %dl,(%rax)
25
26 end -> next = (Node *) malloc (sizeof(Node)*1);
0x0000000000400701 <+139>: mov $0x10,%edi
0x0000000000400706 <+144>: callq 0x400560
0x000000000040070b <+149>: mov %rax,%rdx
0x000000000040070e <+152>: mov -0x8(%rbp),%rax
0x0000000000400712 <+156>: mov %rdx,0x8(%rax)
27 end -> next -> value = 0;
0x0000000000400716 <+160>: mov -0x8(%rbp),%rax
0x000000000040071a <+164>: mov 0x8(%rax),%rax
0x000000000040071e <+168>: movb $0x0,(%rax)
28 end -> next -> next = NULL;
0x0000000000400721 <+171>: mov -0x8(%rbp),%rax
0x0000000000400725 <+175>: mov 0x8(%rax),%rax
0x0000000000400729 <+179>: movq $0x0,0x8(%rax)
29
30 fprintf(stdout, "Enter a value (-1 to complete): ");
0x0000000000400731 <+187>: mov 0x2005d8(%rip),%rax # 0x600d10
0x0000000000400738 <+194>: mov %rax,%rcx
0x000000000040073b <+197>: mov $0x20,%edx
0x0000000000400740 <+202>: mov $0x1,%esi
0x0000000000400745 <+207>: mov $0x400918,%edi
0x000000000040074a <+212>: callq 0x400570
31 fscanf(stdin, "%hhd", &input);
0x000000000040074f <+217>: mov 0x2005c2(%rip),%rax # 0x600d18
0x0000000000400756 <+224>: lea -0x21(%rbp),%rdx
0x000000000040075a <+228>: mov $0x400939,%esi
0x000000000040075f <+233>: mov %rax,%rdi
0x0000000000400762 <+236>: mov $0x0,%eax
0x0000000000400767 <+241>: callq 0x400530 <__isoc99_fscanf@plt>
32
33 if (input == -1)
0x000000000040076c <+246>: movzbl -0x21(%rbp),%eax
0x0000000000400770 <+250>: cmp $0xff,%al
0x0000000000400772 <+252>: jne 0x400792
---Type to continue, or q to quit---
34 {
35 free(end -> next);
0x0000000000400774 <+254>: mov -0x8(%rbp),%rax
0x0000000000400778 <+258>: mov 0x8(%rax),%rax
0x000000000040077c <+262>: mov %rax,%rdi
0x000000000040077f <+265>: callq 0x400520
36 end -> next = NULL;
0x0000000000400784 <+270>: mov -0x8(%rbp),%rax
0x0000000000400788 <+274>: movq $0x0,0x8(%rax)
0x0000000000400790 <+282>: jmp 0x40079e
37 }
38 else
39 end = end -> next;
0x0000000000400792 <+284>: mov -0x8(%rbp),%rax
0x0000000000400796 <+288>: mov 0x8(%rax),%rax
0x000000000040079a <+292>: mov %rax,-0x8(%rbp)
40 }
41
42 // Display list from start to end
43
44 fprintf(stdout, "Enter value for new node: ");
0x00000000004007aa <+308>: mov 0x20055f(%rip),%rax # 0x600d10
0x00000000004007b1 <+315>: mov %rax,%rcx
0x00000000004007b4 <+318>: mov $0x1a,%edx
0x00000000004007b9 <+323>: mov $0x1,%esi
0x00000000004007be <+328>: mov $0x40093e,%edi
0x00000000004007c3 <+333>: callq 0x400570
45 fscanf(stdin, "%hhd", &input);
0x00000000004007c8 <+338>: mov 0x200549(%rip),%rax # 0x600d18
0x00000000004007cf <+345>: lea -0x21(%rbp),%rdx
0x00000000004007d3 <+349>: mov $0x400939,%esi
0x00000000004007d8 <+354>: mov %rax,%rdi
0x00000000004007db <+357>: mov $0x0,%eax
0x00000000004007e0 <+362>: callq 0x400530 <__isoc99_fscanf@plt>
46
47 tmp = (Node *) malloc (sizeof(Node));
0x00000000004007e5 <+367>: mov $0x10,%edi
0x00000000004007ea <+372>: callq 0x400560
0x00000000004007ef <+377>: mov %rax,-0x18(%rbp)
48 tmp -> value = input;
0x00000000004007f3 <+381>: movzbl -0x21(%rbp),%edx
0x00000000004007f7 <+385>: mov -0x18(%rbp),%rax
---Type to continue, or q to quit---
0x00000000004007fb <+389>: mov %dl,(%rax)
49 tmp -> next = NULL;
0x00000000004007fd <+391>: mov -0x18(%rbp),%rax
0x0000000000400801 <+395>: movq $0x0,0x8(%rax)
50
51 fprintf(stdout, "Enter value of node you want to insert new node before: ");
0x0000000000400809 <+403>: mov 0x200500(%rip),%rax # 0x600d10
0x0000000000400810 <+410>: mov %rax,%rcx
0x0000000000400813 <+413>: mov $0x38,%edx
0x0000000000400818 <+418>: mov $0x1,%esi
0x000000000040081d <+423>: mov $0x400960,%edi
0x0000000000400822 <+428>: callq 0x400570
52 fscanf(stdin, "%hhd", &input);
0x0000000000400827 <+433>: mov 0x2004ea(%rip),%rax # 0x600d18
0x000000000040082e <+440>: lea -0x21(%rbp),%rdx
0x0000000000400832 <+444>: mov $0x400939,%esi
0x0000000000400837 <+449>: mov %rax,%rdi
0x000000000040083a <+452>: mov $0x0,%eax
0x000000000040083f <+457>: callq 0x400530 <__isoc99_fscanf@plt>
53
54 tmp2 = start;
0x0000000000400844 <+462>: mov -0x20(%rbp),%rax
0x0000000000400848 <+466>: mov %rax,-0x10(%rbp)
55 while (tmp2 -> next -> value != input)
0x000000000040084c <+470>: jmp 0x40085a
0x000000000040085a <+484>: mov -0x10(%rbp),%rax
0x000000000040085e <+488>: mov 0x8(%rax),%rax
0x0000000000400862 <+492>: movzbl (%rax),%edx
0x0000000000400865 <+495>: movzbl -0x21(%rbp),%eax
0x0000000000400869 <+499>: cmp %al,%dl
0x000000000040086b <+501>: jne 0x40084e
56 tmp2 = tmp2 -> next;
0x000000000040084e <+472>: mov -0x10(%rbp),%rax
0x0000000000400852 <+476>: mov 0x8(%rax),%rax
0x0000000000400856 <+480>: mov %rax,-0x10(%rbp)
57
58 tmp -> next = tmp2 -> next;
0x000000000040086d <+503>: mov -0x10(%rbp),%rax
0x0000000000400871 <+507>: mov 0x8(%rax),%rdx
0x0000000000400875 <+511>: mov -0x18(%rbp),%rax
0x0000000000400879 <+515>: mov %rdx,0x8(%rax)
---Type to continue, or q to quit---
59 tmp2 -> next = tmp;
0x000000000040087d <+519>: mov -0x10(%rbp),%rax
0x0000000000400881 <+523>: mov -0x18(%rbp),%rdx
0x0000000000400885 <+527>: mov %rdx,0x8(%rax)
60
61 // Display list from start to end
62
63 return(0);
0x0000000000400889 <+531>: mov $0x0,%eax
64 }
0x000000000040088e <+536>: leaveq
0x000000000040088f <+537>: retq
End of assembler dump.
Click Image for full view
{{:opus:fall2014:mgardne8:70120637.png|CheatSheet}}
`
====7 October 2014====
===swap node===
{{:opus:fall2014:mgardne8:1.bmp|}}
==Bad!==
Node *tmp3 = mknode(tmp->value);
tmp->value=tmp2->value;
tmp2->value=tmp3->value;
free(tmp3);
==good!==
{{:opus:fall2014:mgardne8:2.bmp|}}
===Obtain node===
Pulls node from list, patches hole in list, keeps pulled node.
{{:opus:fall2014:mgardne8:3.bmp|}}
myList = obtain(myList, &tmp)
{
int pos = getpos(myList, &tmp);
Node *tmp2;
tmp2 = setpos(myList, pos-1);
tmp2->next = tmp->next;
*(tmp)->next = NULL;
myList->qty--;
return(myList);
}
myList = obtain(myList, &tmp)
{
Node *tmp = setpos(myList, getpos(myList, tmp)-1);
tmp2->next = tmp->next;
*(tmp)->next = NULL;
myList->qty--;
return(myList);
}
{{:opus:fall2014:mgardne8:4.bmp|}}
myList = obtain(mylist, &tmp);
==Implementation tips==
(*tmp)->value
===Misc. Notes===
Obtain is the only function in our linkedlist library where we will pass by value;
==Passing variables==
-Pass by value
*Passes copy
*myList=insert(myList,tmp,tmp2);
-Pass by address/reference
*changes happen outside of the function
*pointers!
====9 October 2014====
===Dry Erase Templates===
{{:opus:fall2014:mgardne8:1_-_onelhy1.png?direct&200|}}
{{:opus:fall2014:mgardne8:2_-_wzysbpu.png?direct&200|}}
{{:opus:fall2014:mgardne8:3_-_cguxkkx.png?direct&200|}}
{{:opus:fall2014:mgardne8:4_-_kybsupw.png?direct&200|}}
{{:opus:fall2014:mgardne8:5_-_gthns6e.jpg?direct&200|}}
{{:opus:fall2014:mgardne8:6_-_7ictm4w.jpg?direct&200|}}
{{:opus:fall2014:mgardne8:7_-_fjnyhp9.jpg?direct&200|}}
{{:opus:fall2014:mgardne8:8_-_crgvom6.png?direct&200|}}
====4 November 2014====
===Stacks===
==Vocab==
* Unbounded
* Unlimited in size
* Bounded
* Limited in size
* Stack Overflow
* Adding more than the stack allows
* Stack Underflow
* Removing more than there is on the stack ("negative")
==Functions==
- push
* Add to stack
- pop
* Remove from stack
- peek
* look at the top
- isempty
* is the list empty, used, or broke?
- mkstack
* make stack
- cpstack
* copy stack
- rmstack
* remove stack
==Misc.==
- qty
* This asshole is back.
- size
* Maximum size of stack
* 0 = infinite size.
* int = max size
* negative = error
==Pictures!==
This is an example stack:
{{:opus:fall2014:mgardne8:stack1.png|}}
This is our blank stack struct:
{{:opus:fall2014:mgardne8:blankstack.png|}}
Blank stack template:
{{:opus:fall2014:mgardne8:template.png|}}
====11 November 2014====