SE250:lab-4:shua066
Lab4
This Lab are all about Linked list.
Start code from LL.c Use Test code from test-code.c
task1
use funtion int Length(Cons*) to return the number of elements in the list
code
#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; } int length(Cons* list){ int length=0; for (; list!=nil; list=list->tail){ length++; } return length; } int main( ) { print_list( cons(1,cons(2,cons(3,nil))) ); /* expect: List[1,2,3] */ assert( length( nil ) == 0 ); assert( length( cons(10,cons(20,cons(30,nil))) ) == 3 ); return 0; }
for the funtion length need to check the list not equal to nil and list = list->tail.
task2
write functions element_t first(Cons*), element_t second(Cons*), element_t third(Cons*), element_t fourth(Cons*) that return the element in the named position.
code
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; }
test code is
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 );
because the code has
static Cons NIL = { 0, &NIL };
so dont need to check that whether the tail is equal to nil.
task3
write a funtion element_t nth(int i,Cons*) the return the i'th element of a list. or 0 if no such element exists.
code
element_t nth(int i,Cons* list){ int n; if( length(list)<i){ return 0; } for(n=1;n<=i;n++){ list = list->tail; } return list->head; }
this task is need to check that whether i is bigger than the length of the Cons* and return the element.
task4
write a funtion int equal(Cons*,Cons*) that returns true(1)if both list have exactly the same elements in same order,false(0) otherwise.
code
task5
write a funtion Cond* find(element_t,Cons*) to search for an element in list and return the Cons cell that contains this value,or the empty list if i does not occour in the list.