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

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

struct node* head = NULL;

void add_node(int value) {
    struct node* new_node = (struct node*)malloc(sizeof(struct node));
    new_node->data = value;
    new_node->next = head;
    head = new_node;
}

void delete_node(int value) {
    struct node* temp = head;
    struct node* prev = NULL;

    if (temp != NULL && temp->data == value) {
        head = temp->next;
        free(temp);
        return;
    }

    while (temp != NULL && temp->data != value) {
        prev = temp;
        temp = temp->next;
    }

    if (temp == NULL) {
        return;
    }

    prev->next = temp->next;
    free(temp);
}

void search_node(int value) {
    struct node* current = head;

    while (current != NULL) {
        if (current->data == value) {
            printf("Found %d\n", value);
            return;
        }
        current = current->next;
    }

    printf("%d not found\n", value);
}

int main() {
    add_node(1);
    add_node(2);
    add_node(3);

    delete_node(2);

    search_node(1);
    search_node(2);

    return 0;
}

Как изменить значение узла?

Чтобы изменить значение узла, вам нужно сначала найти его. В функции search_node мы проходимся по всем узлам списка, чтобы найти узел с заданным значением. Затем вы можете изменить значение узла, используя указатель на этот узел. Вот пример кода, который показывает, как изменить значение узла:

void change_node_value(int old_value, int new_value) {
    struct node* current = head;

    while (current != NULL) {
        if (current->data == old_value) {
            current->data = new_value;
            printf("Changed %d to %d\n", old_value, new_value);
            return;
        }
        current = current->next;
    }

    printf("%d not found\n", old_value);
}

В этом коде мы добавляем новую функцию change_node_value, которая принимает два параметра: старое значение и новое значение. Функция проходит по всем узлам списка и находит узел с заданным старым значением. Затем она изменяет значение этого узла на новое значение.

Вы можете вызвать эту функцию из main или из другой функции, чтобы изменить значение узла. Например:

change_node_value(2, 5);

Это изменит значение узла с значением 2 на 5.

Как изменить указатель на следующий узел?

Чтобы изменить указатель на следующий узел, вам нужно сначала найти узел, который вы хотите изменить. Затем вы можете изменить указатель на следующий узел, используя указатель на этот узел.

В функции delete_node мы проходим по всем узлам списка, чтобы найти узел с заданным значением. Затем мы изменяем указатель на следующий узел, чтобы он указывал на следующий узел после найденного узла. Вот пример кода, который показывает, как изменить указатель на следующий узел:

void delete_node(int value) {
    struct node* temp = head;
    struct node* prev = NULL;

    if (temp != NULL && temp->data == value) {
        head = temp->next;
        free(temp);
        return;
    }

    while (temp != NULL && temp->data != value) {
        prev = temp;
        temp = temp->next;
    }

    if (temp == NULL) {
        return;
    }

    prev->next = temp->next; // Change the next pointer of the previous node
    free(temp);
}

В этом коде мы создаем два указателя: temp и prev. Мы проходим по всем узлам списка, чтобы найти узел с заданным значением. Затем мы изменяем указатель на следующий узел, чтобы он указывал на следующий узел после найденного узла.

Можно ли добавлять новые узлы в конец списка?

Да, вы можете добавлять новые узлы в конец списка. Для этого вам нужно создать новый узел и добавить его в конец списка. Вот пример кода на C, который показывает, как добавить новый узел в конец связанного списка:

void add_node_end(int value) {
    struct node* new_node = (struct node*)malloc(sizeof(struct node));
    new_node->data = value;
    new_node->next = NULL;

    if (head == NULL) {
        head = new_node;
        return;
    }

    struct node* current = head;

    while (current->next != NULL) {
        current = current->next;
    }

    current->next = new_node;
}

В этом коде мы создаем новый узел и устанавливаем его указатель на следующий узел равным NULL. Затем мы проверяем, пустой ли список. Если список пуст, мы делаем новый узел головой списка. Если список не пуст, мы проходим по всем узлам списка, чтобы найти последний узел. Затем мы изменяем указатель на следующий узел последнего узла, чтобы он указывал на новый узел.

Вы можете вызвать эту функцию из main или из другой функции, чтобы добавить новый узел в конец списка. Например:

add_node_end(4);

Это добавит новый узел со значением 4 в конец списка.

Что такое двусвязный список и как его реализовать на С?

Двусвязный список — это структура данных, которая состоит из узлов, каждый из которых содержит два указателя на соседние узлы и данные. В отличие от односвязного списка, двусвязный список позволяет перемещаться в обе стороны.

Вот пример кода на C для реализации двусвязного списка с функциями добавления, удаления и поиска узлов:

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

struct node {
    int data;
    struct node* next;
    struct node* prev;
};

struct node* head = NULL;

void add_node(int value) {
    struct node* new_node = (struct node*)malloc(sizeof(struct node));
    new_node->data = value;
    new_node->next = head;
    new_node->prev = NULL;

    if (head != NULL) {
        head->prev = new_node;
    }

    head = new_node;
}

void delete_node(int value) {
    struct node* temp = head;

    while (temp != NULL && temp->data != value) {
        temp = temp->next;
    }

    if (temp == NULL) {
        return;
    }

    if (temp->prev != NULL) {
        temp->prev->next = temp->next;
    } else {
        head = temp->next;
    }

    if (temp->next != NULL) {
        temp->next->prev = temp->prev;
    }

    free(temp);
}

void search_node(int value) {
    struct node* current = head;

    while (current != NULL) {
        if (current->data == value) {
            printf("Found %d\n", value);
            return;
        }
        current = current->next;
    }

    printf("%d not found\n", value);
}

int main() {
    add_node(1);
    add_node(2);
    add_node(3);

    delete_node(2);

    search_node(1);
    search_node(2);

    return 0;
}

В этом коде мы создаем структуру node, которая содержит данные и указатели на следующий и предыдущий узлы. Затем мы создаем указатель на голову списка, который изначально равен NULL. Функция add_node добавляет новый узел в начало списка, функция delete_node удаляет узел с заданным значением, а функция search_node ищет узел с заданным значением. Это простой пример, который можно дополнить другими функциями в зависимости от ваших потребностей.

Как изменить значение узла в двусвязном списке?

Чтобы изменить значение узла в двусвязном списке, вам нужно сначала найти его. В функции search_node мы проходим по всем узлам списка, чтобы найти узел с заданным значением. Затем вы можете изменить значение узла, используя указатель на этот узел. Вот пример кода, который показывает, как изменить значение узла:

void change_node_value(int old_value, int new_value) {
    struct node* current = head;

    while (current != NULL) {
        if (current->data == old_value) {
            current->data = new_value;
            printf("Changed %d to %d\n", old_value, new_value);
            return;
        }
        current = current->next;
    }

    printf("%d not found\n", old_value);
}

В этом коде мы добавляем новую функцию change_node_value, которая принимает два параметра: старое значение и новое значение. Функция проходит по всем узлам списка и находит узел с заданным старым значением. Затем она изменяет значение этого узла на новое значение.

Вы можете вызвать эту функцию из main или из другой функции, чтобы изменить значение узла. Например:

change_node_value(2, 5);

Это изменит значение узла с значением 2 на 5.

Как изменить указатель на следующий узел в двусвязном списке?

Чтобы изменить указатель на следующий узел в двусвязном списке, вам нужно сначала найти узел, который вы хотите изменить. Затем вы можете изменить указатель на следующий узел, используя указатель на этот узел.

В функции delete_node мы проходим по всем узлам списка, чтобы найти узел с заданным значением. Затем мы изменяем указатель на следующий узел, чтобы он указывал на следующий узел после найденного узла. Вот пример кода, который показывает, как изменить указатель на следующий узел:

void delete_node(int value) {
    struct node* temp = head;

    while (temp != NULL && temp->data != value) {
        temp = temp->next;
    }

    if (temp == NULL) {
        return;
    }

    if (temp->prev != NULL) {
        temp->prev->next = temp->next;
    } else {
        head = temp->next;
    }

    if (temp->next != NULL) {
        temp->next->prev = temp->prev;
    }

    free(temp);
}

В этом коде мы создаем два указателя: temp и prev. Мы проходим по всем узлам списка, чтобы найти узел с заданным значением. Затем мы изменяем указатель на следующий узел, чтобы он указывал на следующий узел после найденного узла.

Как изменить значение узла в двусвязном списке?

Чтобы изменить значение узла в двусвязном списке, вам нужно сначала найти его. В функции search_node мы проходим по всем узлам списка, чтобы найти узел с заданным значением. Затем вы можете изменить значение узла, используя указатель на этот узел. Вот пример кода, который показывает, как изменить значение узла:

void change_node_value(int old_value, int new_value) {
    struct node* current = head;

    while (current != NULL) {
        if (current->data == old_value) {
            current->data = new_value;
            printf("Changed %d to %d\n", old_value, new_value);
            return;
        }
        current = current->next;
    }

    printf("%d not found\n", old_value);
}

В этом коде мы добавляем новую функцию change_node_value, которая принимает два параметра: старое значение и новое значение. Функция проходит по всем узлам списка и находит узел с заданным старым значением. Затем она изменяет значение этого узла на новое значение.

Вы можете вызвать эту функцию из main или из другой функции, чтобы изменить значение узла. Например:

change_node_value(2, 5);

Это изменит значение узла с значением 2 на 5.