SE250:lab-4:stsa027

From Marks Wiki
Jump to navigation Jump to search

Writing the int length(Cons*) function:

I reused the code already provided in the for loop in LL.c, and simply added an extra variable. I initially called the variable length, same as the function name and was told this was not a good idea. So, it was changed to len.

I then copied and paseted the test code provided by the lecturer into the main function, and it was a success.


Code used:

int length(Cons* list) {
    int len = 0;
    for( ; list != nil ; list = list-> tail)
	 len++;
    return len;
}

Writing the element_t first to fourth (Cons*) function:

Even for the first one, I was slightly confused about what to do. The lecturer gave me the advice of NOT using a for loop as I was attempting, since all you have to do was return the head of the first element of the list. He also said that since nil is a valid cons cell in inself, with a head of 0 and a tail pointing to another nil cons cell, the following

    if (list == nil)                            //redundant
	return 0;                               //redundant

is not really required.

For writing the second function, I first tried this:

  element_t second(Cons* list) {
   if (list == nil)

return 0;

   return 
   element_t a;
   for( ; list != nil ; list = list->tail)    

a = list->head;

   return a;

which worked, but is a rather complicated way of doing things, as I was told by the tutor. Instead, I was advised to use this:

    return list->tail->head;

A similar thing was done with returning third and forth element_t.

Writing the element_t nth(int i, Cons*) function:



Writing the Cons* find(element_t, Cons*) function:




Writing the Cons* copy_list(Cons* xs, Cons* xs) function:

Cons* copy_list (Cons* xs){
  Cons* copy = nil;
  Cons* xs_orig = xs;
  int j = 0;
  int i = (length(xs_orig))-1;

  while(length(copy)<length(xs_orig)){
    while(j!=i){
      j++;
      xs = xs->tail;
    }
    copy = cons((xs->head), copy);
    i--;
    xs = xs_orig;
    j=0;
  }
  return copy;
}



Writing the Cons* nappend(Cons* xs, Cons* xs) function:

Cons* nappend(Cons* xs, Cons* ys){
    Cons* both = xs;

    if (xs == nil)
	return ys;
    while(both->tail!=nil){
        both = both->tail;
    }
    both->tail = ys;
    return xs;
}



Writing the Cons* reverse(Cons* xs, Cons* xs) function:

Cons* reverse(Cons* xs){
    Cons* rev = nil;
    for (; xs!=nil; xs = xs->tail){
	rev = cons((xs->head), rev);      //points rev to a new cons cell using the next xs->head, and original address of rev
    }
    return rev;
}



Writing the Cons* nreverse(Cons* xs, Cons* xs) function:

Cons* nreverse(Cons* xs){
    int i = length(xs);
    Cons* copy = xs;
    Cons* copyi = xs;
    while(xs->tail!=nil)
	xs = xs->tail;                  //makes xs point to the last element of the array list which has a tail that points to null
    while (copy->tail!=nil){
	copyi = copy;                   //copyi is arranged to be pointing to the element before copy
	copy = copy->tail;              //copy points to the last element (which has a tail that points to null)
	if(copy->tail==nil){
	    copy->tail = copyi;
	    copyi->tail = nil;
	    break;
	}
    }
    return xs;
    
}