У вас проблема логики с последовательными циклами:
while((*l1 != NULL && l2 != NULL)&&((*l1)->d + l2->d) % n == 0) {
...
}
while((*l1 != NULL) && ((*l1)->d + l2->d) % n == 0){
...
}
если сумма элементов не кратна n , вам нужно перейти к следующему элементу, но вы не выполните
Кроме того, чтобы скрыть указатель с typedef , как вы делаете с typedef Nodo *LIST;
, это опасно и это хороший способ создать проблему, я рекомендую вам никогда этого не делать .
Вы можете сделать это:
void removeIf(Nodo ** l1, Nodo * l2, int n)
{
while ((*l1 != NULL) && (l2 != NULL)) {
if ((((*l1)->d + l2->d) % n) == 0) {
/* cell must be removed */
Nodo * rm = *l1;
*l1 = (*l1)->next;
free(rm);
}
else {
/* cell not removed */
l1 = &(*l1)->next;
}
l2 = l2->next;
}
// case where l2 is shorter than l1
while (*l1 != NULL) {
if (((*l1)->d % n) == 0) {
/* cell must be removed */
Nodo * rm = *l1;
*l1 = (*l1)->next;
free(rm);
}
else {
/* cell not removed */
l1 = &(*l1)->next;
}
}
}
Создание полной программы для
#include <stdio.h>
#include <stdlib.h>
struct data {
int d;
struct data *next;
};
typedef struct data Nodo;
void removeIf(Nodo ** l1, Nodo * l2, int n)
{
while ((*l1 != NULL) && (l2 != NULL)) {
if ((((*l1)->d + l2->d) % n) == 0) {
/* cell must be removed */
Nodo * rm = *l1;
*l1 = (*l1)->next;
free(rm);
}
else {
/* cell not removed */
l1 = &(*l1)->next;
}
l2 = l2->next;
}
// case where l2 is shorter than l1
while (*l1 != NULL) {
if (((*l1)->d % n) == 0) {
/* cell must be removed */
Nodo * rm = *l1;
*l1 = (*l1)->next;
free(rm);
}
else {
/* cell not removed */
l1 = &(*l1)->next;
}
}
}
Nodo * make(int v, Nodo * n)
{
Nodo * r = malloc(sizeof(Nodo));
r->d = v;
r->next = n;
return r;
}
void del(Nodo ** pl)
{
while (*pl != NULL) {
Nodo * n = *pl;
*pl = (*pl)->next;
free(n);
}
}
int main()
{
Nodo * l1 = make(4, make(4, make(11, make(3, make(4, make(8, make(7, NULL)))))));
Nodo * l2 = make(5, make(1, make(5, make(1, make(5, NULL)))));
removeIf(&l1, l2, 2);
/* show result */
for (Nodo * l = l1; l != NULL; l = l->next)
printf("%d ", l->d);
putchar('\n');
/* free resources */
del(&l1);
del(&l2);
return 0;
}
Компиляция и исполнение:
pi@raspberrypi:/tmp $ gcc -pedantic -Wall -Wextra ll.c
pi@raspberrypi:/tmp $ ./a.out
4 4 4 7
pi@raspberrypi:/tmp $
Исполнение под valgrind :
pi@raspberrypi:/tmp $ valgrind ./a.out
==3758== Memcheck, a memory error detector
==3758== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==3758== Using Valgrind-3.13.0 and LibVEX; rerun with -h for copyright info
==3758== Command: ./a.out
==3758==
4 4 4 7
==3758==
==3758== HEAP SUMMARY:
==3758== in use at exit: 0 bytes in 0 blocks
==3758== total heap usage: 13 allocs, 13 frees, 1,120 bytes allocated
==3758==
==3758== All heap blocks were freed -- no leaks are possible
==3758==
==3758== For counts of detected and suppressed errors, rerun with: -v
==3758== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 6 from 3)
pi@raspberrypi:/tmp $