SE250:lab-4:sdal039

From Marks Wiki
Jump to navigation Jump to search

Running the assert checks on the functions below shows that they all work as expected.


int length(Cons* list) {
   len = 0;    
   for( ; list != nil ; list = list->tail, len++ );
   return len;
}
element_t first(Cons* list) {
   int i = 0;
   for( ; list != nil && i < 0 ; list = list->tail, i++ );
	return list->head;	
}
element_t second(Cons* list) {
   int i = 0;
   for( ; list != nil && i < 1 ; list = list->tail, i++ );
	return list->head;
}
element_t third(Cons* list) {
   int i = 0;
   for( ; list != nil && i < 2; list = list->tail, i++ );
	return list->head;	
 }
element_t fourth(Cons* list) {
   int i = 0;
   for( ; list != nil && i < 3; list = list->tail, i++ );
	return list->head;	
}
element_t nth(int j, Cons* list) {
   int  i = 0;
   for( ; list != nil && i < j ; list = list->tail, i++ );
	return list->head;
}
int equal(Cons* l1, Cons* l2) {
if ((l1 != nil && l2 == nil) || (l1 == nil && l2 != nil))
	return 0;

   for( ; l1 != nil && l2 != nil ; l1 = l1->tail, l2 = l2->tail ) {
	if (l1->head != l2->head)
	   return 0;
   }
//must be equal 
   return 1;
}
Cons* find(element_t elt, Cons* list) {
   for( ; list != nil && list->head != elt ; list = list->tail);
   return list;
}
Cons* reverse(Cons* list) {
   Cons* list_copy = nil;
   for(  ; list != nil ;  list = list->tail)
	list_copy = cons(list->head, list_copy);

    return list_copy;
}


One particularly hard part of this lab was the copy_list function. After getting some strange results, it turned out that with only a few changes it could be turned into the "reverse" function and so copy_list was left alone.


Cons* nappend(Cons* list1, Cons* list2) {
   for(  ;  ;  list1 = list1->tail) {
	if ((list1->tail == nil) | (list1 == nil))
	    list1->tail = list2;   
	return list1;
   }
}

This code nearly works, giving the output

List[]
List[]
List[10]
List[10,20]

where the expected output is

List[]
List[10]
List[10]
List[10,20]