#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
struct node {
int first;
struct node *rest;
};
void add_to_front(struct node **ptrhead, int item) {
assert(ptrhead
!= NULL
); // ptrhead must be valid
struct node
*newnode
= malloc(sizeof(struct node
));
if (newnode == NULL) {
printf("ERROR! add_to_front ran out of memory!\n"); }
newnode->first = item;
newnode->rest = *ptrhead;
*ptrhead = newnode;
}
int remove_from_front(struct node **ptrhead) {
assert(ptrhead
!= NULL
); // ptrhead must be valid assert(*ptrhead
!= NULL
); // list must be non-empty
struct node *lst = *ptrhead;
int retval = lst->first;
*ptrhead = lst->rest;
return(retval);
}
void print_list(struct node *lst) {
if (lst == NULL) {
return;
}
while (lst != NULL) {
if (lst->rest != NULL) {
}
lst = lst->rest;
}
}
void destroy_list(struct node *lst) {
struct node *next;
while (lst != NULL) {
next = lst->rest;
lst = next;
}
}
typedef struct sequence *Sequence;
struct sequence
{
struct node* lst;
int length;
};
Sequence new_sequence()
{
// PRE: true
// POST: returns a new, empty Sequence
// TIME: O(1)
Sequence s
= malloc(sizeof(struct sequence
)); if(!s)
{
printf("ERROR! new_sequence ran out of memory\n"); }
s->lst = 0;
s->length = 0;
return s;
}
void delete_sequence(Sequence s)
{
// PRE: s is a valid Sequence
// POST: s is no longer a valid Sequence
// TIME: O(n) [O(sequence length)]
destroy_list(s->lst);
}
int sequence_length(Sequence s)
{
// PRE: s is a valid Sequence
// POST: returns the number of items in s
// TIME: O(1)
return s->length;
}
int sequence_item_at(Sequence s, int pos)
{
// PRE: s is a valid non-empty Sequence
// 0 <= pos < length
// POST: returns the item at pos
// TIME: O(n) [O(sequence length)]
struct node* temp = s->lst;
for(; pos > 0; --pos)
{
temp = temp->rest;
}
return temp->first;
}
void sequence_insert_at(Sequence s, int pos, int item)
{
// PRE: s is a valid Sequence
// 0 <= pos <= length
// POST: changes s to insert item at pos
// length of s is now +1
// all previous items with position >= pos
// are now at position +1
// TIME: O(n) [O(sequence length)]
++s->length;
if(pos)
{
struct node* ptr = s->lst;
for(; pos > 1; --pos)
{
ptr = ptr->rest;
}
add_to_front(&ptr->rest, item);
print_list(ptr);
print_list(ptr->rest);
print_list(s->lst);
}
else
{
add_to_front(&s->lst, item);
}
}
int sequence_remove_at(Sequence s, int pos)
{
// PRE: s is a valid non-empty Sequence
// 0 <= pos < length
// POST: returns the item at pos
// changes s to remove item at pos
// length of s is now -1
// all previous items with position >= pos
// are now at position -1
// TIME: O(n) [O(sequence length)]
--s->length;
if(pos)
{
struct node* ptr = s->lst;
for(; pos > 1; --pos)
{
ptr = ptr->rest;
}
return remove_from_front(&ptr->rest);
}
else
{
return remove_from_front(&s->lst);
}
}
void sequence_insert_start(Sequence s, int item)
{
// NOTE: equivalent to: sequence_insert_at(s, 0, item);
// TIME: O(1)
sequence_insert_at(s, 0, item);
}
int sequence_remove_start(Sequence s)
{
// NOTE: equivalent to: sequence_remove_at(s, 0);
// TIME: O(1)
return sequence_remove_at(s, 0);
}
void sequence_reverse(Sequence s)
{
// PRE: s is a valid Sequence
// POST: reverses the order of all of the items in s
// TIME: O(n) [O(sequence length)]
struct node* temp = s->lst;
s->lst = 0;
while(temp)
{
add_to_front(&s->lst, remove_from_front(&temp));
}
}
void print_sequence(Sequence s)
{
// PRE: s is a valid Sequence
// POST: Prints out every item in s
// TIME: O(n) [O(sequence length)]
struct node* temp = s->lst;
for(int i = 0; temp; temp = temp->rest)
{
printf("%d: %d\n", i
++, temp
->first
); }
}
Sequence fibseq(int n)
{
// PRE: n >= 0
// POST: produces a Sequence of length n+1 corresponding
// to the Fibonacci Sequence (from 0...n)
// TIME: O(n)
Sequence s = new_sequence();
if(n)
{
int a = 0;
int b = 1;
sequence_insert_start(s, a);
for(; n; --n)
{
int temp = a;
a += b;
b = temp;
sequence_insert_start(s, a);
}
sequence_reverse(s);
}
else
{
sequence_insert_start(s, 0);
}
return s;
}
int main()
{
Sequence derp = new_sequence();
sequence_insert_at(derp, 0, 15);
sequence_insert_at(derp, 0, 16);
sequence_insert_at(derp, 0, 17);
sequence_insert_at(derp, 2, 5);
print_sequence(derp);
sequence_reverse(derp);
print_sequence(derp);
sequence_remove_at(derp, 1);
print_sequence(derp);
delete_sequence(derp);
Sequence test = fibseq(10);
print_sequence(test);
delete_sequence(test);
return 0;
}