SE250:lab-4:sbas046
/*
File: LL.c
Date: 1 April 2008
Author: John Hamer
Purpose: Starter code for SOFTENG 250 lab 4, 2008
*/
#include <assert.h>
#include <stdlib.h>
#include <stdio.h>
typedef int element_t;
typedef
struct Cons {
element_t head;
struct Cons* tail;
} Cons;
static Cons NIL = { 0, &NIL };
Cons* nil = &NIL;
Cons* cons( element_t elt, Cons* tail ) {
Cons* cell = malloc( sizeof(Cons) );
assert( cell != 0 );
cell->head = elt;
cell->tail = tail;
return cell;
}
void print_list( Cons* list ) {
char* sep = "";
printf( "List[" );
for( ; list != nil; list = list->tail ) {
printf( "%s%d", sep, list->head );
sep = ",";
}
printf( "]\n" );
}
int length(Cons* list){
int n = 0;
for( ; list != nil; list = list->tail ) {
n++;
}
return n;
}
element_t first(Cons* list){
return list->head;
}
element_t second(Cons* list){
return list->tail->head;
}
element_t third(Cons* list){
return list->tail->tail->head;
}
element_t fourth(Cons* list){
return list->tail->tail->tail->head;
}
element_t nth(int i, Cons* list){
element_t element;
int l;
for(l=0; l<i; l++){
if (l != 0){
list = list->tail;
}
element = list->head;
}
return element;
}
int equal(Cons* list, Cons* list2){
int length_list = length(list);
int length_list2 = length(list2);
int l;
if (length_list != length_list2){
return 0;
}
for(l=0; l<length_list; l++){
if (l != 0){
list = list->tail;
list2 = list2->tail;
}
if (list->head != list2->head){
return 0;
}
}
return 1;
}
Cons* find(element_t element, Cons* list){
Cons* emptylist;
int length_list = length(list);
int l;
for(l=0; l<length_list; l++){
if (l != 0){
list = list->tail;
}
if (list->head == element){
return list;
}
}
return emptylist;
}
Cons* nappend(Cons* list, Cons* list2){
int length_list = length(list);
int l;
for(l=0; l<length_list; l++){
if (l != 0){
list = list->tail;
}
if (list->tail == nil){
list->tail = list2;
}
}
return list;
}
Cons* append(Cons* list, Cons* list2){
Cons* newlist;
int l;
newlist = list;
int length_list = length(newlist);
for(l=0; l<length_list; l++){
if (l != 0){
newlist = newlist->tail;
}
if (newlist->tail == nil){
newlist->tail = list2;
}
}
return list;
}
int main( ) {
Cons* list = cons(1,cons(2,cons(3,nil)));
Cons* list2 = cons(4,cons(5,cons(7,nil)));
Cons* list3 = cons(1, cons(2,cons(3,cons(4,nil))));
Cons* search;
print_list(list ); /* expect: List[1,2,3] */
printf("Length = %d\n", length( list )); /* should return 3 */
printf("%d\n",first(list));
printf("%d\n",second(list));
printf("%d\n", third(list));
printf("%d\n", fourth(list));
printf("%d\n", nth(1, list));
printf("%d\n", nth(2, list));
printf("%d\n", nth(0, list));
printf("\nEqual test:\n");
printf("%d\n", equal(list, list2));
printf("%d\n", equal(list, list3));
printf("%d\n", equal(list, list));
printf("%d\n", equal(list2, list3));
search = find(5, list2);
print_list( search );
return 0;
}
void test_LL( ) {
print_list( nil ); /* List[] */
print_list( cons(10,cons(20,cons(30,nil))) ); /* List[10,20,30] */
assert( length( nil ) == 0 );
assert( length( cons(10,cons(20,cons(30,nil))) ) == 3 );
assert( first( nil ) == 0 );
assert( first( cons(10,cons(20,nil)) ) == 10 );
assert( second( nil ) == 0 );
assert( second( cons(10,cons(20,nil)) ) == 20 );
assert( third( nil ) == 0 );
assert( third( cons(10,cons(20,nil)) ) == 0 );
assert( third( cons(10,cons(20,cons(30,nil))) ) == 30 );
assert( fourth( nil ) == 0 );
assert( fourth( cons(10,cons(20,nil)) ) == 0 );
assert( fourth( cons(10,cons(20,cons(30,nil))) ) == 0 );
assert( fourth( cons(10,cons(20,cons(30,cons(40,nil)))) ) == 40 );
assert( nth(0,nil) == 0 );
assert( nth(1,nil) == 0 );
assert( nth(0,cons(10,nil)) == 10 );
assert( nth(1,cons(10,nil)) == 0 );
assert( equal(nil,nil) );
assert( ! equal(nil,cons(10,nil)) );
assert( ! equal(cons(10,nil),nil) );
assert( equal(cons(10,nil),cons(10,nil)) );
assert( ! equal(cons(10,nil),cons(20,nil)) );
print_list( find(10,nil) ); /* List[] */
print_list( find(20,cons(10,nil)) ); /* List[] */
print_list( find(10,cons(10,nil)) ); /* List[10] */
print_list( nappend(nil,nil) ); /* List[] */
print_list( nappend(nil,cons(10,nil)) ); /* List[10] */
print_list( nappend(cons(10,nil),nil) ); /* List[10] */
print_list( nappend(cons(10,nil),cons(20,nil)) ); /* List[10,20] */
print_list( append(nil,nil) ); /* List[] */
print_list( append(nil,cons(10,nil)) ); /* List[10] */
print_list( append(cons(10,nil),nil) ); /* List[10] */
print_list( append(cons(10,nil),cons(20,nil)) ); /* List[10,20] */
}
/*
Local Variables:
compile-command: "gcc -Wall LL.c -o LL && ./LL"
End:
*/
I hit a dead end at append and copy after about 1 and a half hours :(