Я нахожу проблемы, пытаясь реализовать функцию, вот что должна делать программа: пользователь должен сначала ввести целое число (это число не добавляется в список). Затем мне нужно написать функцию, которая рекурсивно удаляет все узлы в списке, кратные введенному числу.

Это мой текущий код:

#include <stdio.h>
#include <stdlib.h>

#define true 1 
#define false 0
#define bool int

typedef struct node {
    int data;
    struct node *next; 

} Node;

void addToHead(Node **head, int value);
void printList(Node *head);
bool isMultipleOf(int value, int n);
void deleteMultipleOfNNodes(Node **head, int n);


int main() {
    // Create head 
    Node *head = NULL;

    int loop = true;
    int input;

    // The value whose multiples must be deleted from the list
    int n;
    scanf("%d", &n);

    while (loop) {
        scanf("%d", &input);

        // End loop - print list
        if (input < 0) {
            deleteMultipleOfNNodes(&head, n);
            printList(head);
            loop = false;
        } else {
        // Add value to the head
            addToHead(&head, input);
        }

    }
    return 0;
}


void addToHead(Node **head, int value) {
    Node *temp;

    if (*head != NULL) { 
        // Create new node
        Node *newNode = (Node*) malloc(sizeof(Node));
        // Set new node data
        newNode -> data = value;
        // New node links to the head
        newNode -> next = *head;
        // New node is now the head of the list
        *head = newNode;

    } else {
        // Create head
        *head = (Node*) malloc(sizeof(Node));
        // Set head data
        (*head) -> data = value;
        // Head links to NULL
        (*head) -> next = NULL;

    }
}

void printList(Node *head) {
    Node *temp = head;
    while (temp != NULL) {
        if (temp -> next != NULL) {
            printf("%d -> ", temp->data);
        } else {
            printf("%d -> NULL", temp -> data);
        }
        temp = temp->next; 
    }

}

bool isMultipleOf(int value, int n) {
    // While the value is greater than zero, keep on subtracting the number
    while (value > 0) { 
        value -= n; 
    }

    return (value == 0);

}

void deleteMultipleOfNNodes(Node **head, int n) {
     // ========= CODE ================
}

Заранее спасибо за вашу помощь!

0
AlexDerFerri 4 Дек 2019 в 20:20
Эй, чувак :), мы не можем дать тебе ответ (так ты не научишься). Попробуйте сделать код и сообщите нам, что вы сделали и какие ошибки. Вам будет лучше учиться
 – 
Yoni Melki
4 Дек 2019 в 20:30
Да, я знаю, но я часами боролся с кодом и думал, что помощь определенно очистит мою голову, ахаха. :)
 – 
AlexDerFerri
4 Дек 2019 в 20:49

1 ответ

Функция может выглядеть очень просто

void deleteMultipleOfNNodes( Node **head, int n )
{
    Node *tmp = *head;

    if ( tmp != NULL )
    {
        tmp->data % n == 0 ? ( *head ) = ( *head )->next, free( tmp ) 
                           : ( void )(  head = &( *head )->next );
        deleteMultipleOfNNodes( head, n );
    }
}

Обратите внимание на то, что эта функция

bool isMultipleOf(int value, int n) {
    // While the value is greater than zero, keep on subtracting the number
    while (value > 0) { 
        value -= n; 
    }

    return (value == 0);

}

В общем случае недействителен, потому что либо значение, либо n могут быть отрицательными.

Так определите функцию как

bool isMultipleOf( int value, int n ) 
{
    return value % n == 0;
}

В этом случае функция выше может быть переписана как

void deleteMultipleOfNNodes( Node **head, int n )
{
    Node *tmp = *head;

    if ( tmp != NULL )
    {
        isMultipleOf( tmp->data, n ) ? ( *head ) = ( *head )->next, free( tmp ) 
                                     : ( void )(  head = &( *head )->next );
        deleteMultipleOfNNodes( head, n );
    }
}

Функция addToHead слишком сложна. Это можно записать следующим образом

bool addToHead(Node **head, int value) 
{
    Node *newNode = malloc( sizeof( Node ) );
    bool success = newNode != NULL;

    if ( success )
    {
        newNode -> data = value;
        newNode -> next = *head;
        *head = newNode;
    }

    return success;
}

Вот демонстрационная программа. Он содержит только те функции, которые необходимы для демонстрации рекурсивной функции.

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

typedef struct node {
    int data;
    struct node *next; 

} Node;

bool addToHead(Node **head, int value) 
{
    Node *newNode = malloc( sizeof( Node ) );
    bool success = newNode != NULL;

    if ( success )
    {
        newNode -> data = value;
        newNode -> next = *head;
        *head = newNode;
    }

    return success;
}

bool isMultipleOf( int value, int n ) 
{
    return value % n == 0;
}

void deleteMultipleOfNNodes( Node **head, int n )
{
    Node *tmp = *head;

    if ( tmp != NULL )
    {
        isMultipleOf( tmp->data, n ) ? ( *head ) = ( *head )->next, free( tmp ) 
                                     : ( void )(  head = &( *head )->next );
        deleteMultipleOfNNodes( head, n );
    }
}

void printList( const Node *head )
{
    for ( ; head != NULL; head = head->next )
    {
        printf( "%d --> ", head->data );
    }

    puts( "NULL" );
}

int main(void) 
{
    Node *head = NULL;
    const int N = 10;

    for ( int i = N; i != 0; i-- )
    {
        addToHead( &head, i );
    }

    printList( head );

    deleteMultipleOfNNodes( &head, 2 );

    printList( head );

    return 0;
}

Его вывод

1 --> 2 --> 3 --> 4 --> 5 --> 6 --> 7 --> 8 --> 9 --> 10 --> NULL
1 --> 3 --> 5 --> 7 --> 9 --> NULL
1
Vlad from Moscow 4 Дек 2019 в 20:59