Трудно создать функцию для списков в C - PullRequest
1 голос
/ 25 апреля 2020

Я пытаюсь создать функцию delz (), которая удаляет заданное число из конца списка, я пытался рекурсивно и некоторое время l oop, и я не могу понять это. Пример: [3 | следующий] - [4 | следующая] - [3 | следующий] - [7 | следующий] -----> [3 | следующий] - [4 | следующий] - [7 | следующий]

list delz (int val, list l) {
    if(l == NULL)
        return NULL;
    else {
        list head = l;
        list tmp = l;
        list tail;
        list temp;
        while(l != NULL){
            if(l->value == val) {
                list tail = l->next;
                head->next = tail;
            }
            temp = head;
            head = tmp;
            l = l->next;
        }
        return head;
    }
}


typedef struct node {
int value;
struct node *next;
} node, *list;

1 Ответ

1 голос
/ 25 апреля 2020

Функция будет проще, если передать ей указатель на головной узел по ссылке.

Вот демонстрационная программа. Я использовал свое собственное определение списка из односвязных списков, потому что вы не показали свое собственное. Также не рекомендуется вводить typedef для типа указателя.

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

struct Node
{
    int val;
    struct Node *next;
};

void assign( struct Node **head, const int a[], size_t n )
{
    if ( *head )
    {
        struct Node *tmp = *head;
        *head = ( *head )->next;
        free( tmp );
    }

    for ( size_t i = 0; i < n; i++ )
    {
        *head = malloc( sizeof( struct Node ) );
        ( *head )->val = a[i];
        ( *head )->next = NULL;
        head = &( *head )->next;
    }
}

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

    puts( "null" );
}

int remove_last( struct Node **head, int val )
{
    struct Node **target = NULL;

    for ( ; *head != NULL; head = &( *head )->next )
    {
        if ( ( *head )->val == val ) target = head;
    }

    int success = target != NULL;

    if ( success )
    {
        struct Node *tmp = *target;
        *target = ( *target )->next;
        free( tmp );
    }

    return success;
}

int main(void) 
{
    int a[] = { 3, 4, 3, 7 };
    const size_t N = sizeof( a ) / sizeof( *a );

    struct Node *head = NULL;

    assign( &head, a, N );

    display( head );

    int val = 3;

    if ( remove_last( &head, val ) )
    {
        printf( "The last node with the value %d is removed.\n", val );
    }

    display( head );

    return 0;
}

Вывод программы:

3 -> 4 -> 3 -> 7 -> null
The last node with the value 3 is removed.
3 -> 4 -> 7 -> null
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...