Чтобы не допустить длительного обсуждения в комментариях, я постараюсь написать некоторые предварительные и последующие условия.
Поскольку внутри функции невозможно проверить, вызывается ли она с указателями на действительные объекты списка, это относится к родителю / вызывающей стороне:
// The following function must be called with pointers that are either null
// or point to valid list elements. The lists must be correct (no malloc bugs etc).
// The compiler must have checked that it is called with pointers to the proper types,
// as C has no typeof operator.
//
int uguaglianza_insiemi(elem_lista_t *insieme_A,
elem_lista_t *insieme_B)
{
int esito;
if ((insieme_A == NULL) &&
(insieme_B == NULL))
esito = 1; // both pointers are null: equal
// not both pointes are null
else if (insieme_A == NULL ||
insieme_B == NULL)
esito = 0; // not both pointers are null, but one is: not equal
// neither pointer is null and so they may be dereferenced
else if (insieme_A->valore != insieme_B->valore)
esito = 0; // neither pointer is null, but their element values aer not equal: not equal
// the function can be called recursively now because its precondition has been met,
// that both successor pointers are null or point to valid list elements (induction).
else esito = uguaglianza_insiemi(insieme_A->succ_p,
insieme_B->succ_p);
// the post condition is that esito reflects equality of both (partial) lists
return (esito);
}
Я надеюсь, что это то, с чем вы и ваш профессор можете работать.
{P}: функция должна вызываться с указателями, которые либо равны нулю, либо указывают на допустимые элементы списка.
C: uguaglianza_insiemi( *A, *B)
{Q}: результат функции отражает равенство списков
Внутри функции это продолжается с оператора if
, использующего правило композиции.