Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.04.2022, 14:28   #1
chel_prostoy
 
Регистрация: 22.04.2022
Сообщений: 5
По умолчанию Дан длинный список и короткий. Удалить из длинного первый встретившийся короткий список

Помогите пожалуйста с реализацией задачи.
Код:
Код:
#include <iostream>
using namespace std;

struct Node // Узел
{
    int value; // Значение узла (значение)
    Node* next; // Следующий элемент узла
};

int main(int argc, char const* argv[]) {
    setlocale(LC_ALL, "Rus");

    Node* head = NULL; 
    Node* tail = NULL; 

    Node* head2 = NULL;
    Node* tail2 = NULL;

    int currentValue; // текущее значение
    Node* newNode = 0; // текущий узел
    int currentValue2;
    Node* newNode2 = 0;

    int J;
    cout << "Введите кол-во чисел в списке: ";
    cin >> J;

    for (int i = 0; i < J; i++) {
        cout << "Введите число: ";
        cin >> currentValue;

        newNode = new Node();
        newNode->value = currentValue;
        newNode->next = NULL;
        if (head == NULL) {
            head = newNode;
            tail = newNode;
        }
        else {
            tail->next = newNode;
            tail = newNode;
        }
    }
    Node* current = head;

    int N;
    cout << "Введите кол-во чисел в списке: ";
    cin >> N;

    for (int i = 0; i < N; i++) {
        cout << "Введите число: ";
        cin >> currentValue;

        newNode = new Node();
        newNode->value = currentValue;
        newNode->next = NULL;
        if (head2 == NULL) {
            head2 = newNode;
            tail2 = newNode;
        }
        else {
            tail2->next = newNode;
            tail2 = newNode;
        }
    }
    Node* current1 = head2;  //Указатель на первый элемент списка (на голову)


    cout << "\nСписок после изменений: \n";
    while (current != NULL) {
        cout << current->value << " ";
        current = current->next;
    }

    cout << endl;

    return 0;
}
chel_prostoy вне форума Ответить с цитированием
Старый 22.04.2022, 16:44   #2
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Чтобы не взрывать себе мозг вводом длинного и короткого списка лучше это сделать из файла.
Код:
for (int i = 0; i < N; i++) {
        cout << "Введите число: ";
        cin >> currentValue;

        newNode = new Node();
        newNode->value = currentValue;
        newNode->next = NULL;
        if (head2 == NULL) {
            head2 = newNode;
            tail2 = newNode;
        }
        else {
            tail2->next = newNode;
            tail2 = newNode;
        }
    }
Зачем вам в цикле условие выполняющееся 1 раз в начале. Не лучше его вытащить из цикла, а для ввода создать отдельную функцию (чтобы не повторяться):
Код:
Node *input_item()
{
    cout << "Введите число: ";
    cin >> currentValue;
    Node* item = new Node();
    item->value = currentValue;
    item->next = NULL;
    return item;
}
/* ... */
if (N > 0) { head2 = tail2 = input_item();  }
for (int i = 1; i < N; tail2 = tail2->next, i++) tail2->next = input_item();
Дальше как со строками. Нашли первый элемент и начали проверять короткий список. Если совпал до конца, то присвоили prev->next к check->next и закончили поиск через break.
macomics вне форума Ответить с цитированием
Старый 22.04.2022, 17:50   #3
chel_prostoy
 
Регистрация: 22.04.2022
Сообщений: 5
По умолчанию

macomics,наверное через файл проще,но мне нужно сделать простенькую программку,чтобы я ввёл в консоли например:в первом списке "1 2 3 4",а во втором "1 2" и он мне удалил 1 и 2 из первого списка . Если не трудно, помогите составить функцию удаления мне просто не сильно понятно как это сделать
chel_prostoy вне форума Ответить с цитированием
Старый 22.04.2022, 18:09   #4
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Я же уже написал как это сделать. Два вложенных цикла. В первом проверяете длинный список на совпадение его элемента с первым элементом короткого. Когда совпали запускаете вложенный цикл проверки элементов короткого списка с последующими элементами длинного и считаете количество совпадений. Если все элементы совпали (счетное количество равно длине короткого списка) - присваиваете prev->next = check->next и break.
macomics вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Короткий код на Java Johny007 Помощь студентам 0 02.01.2018 13:45
Короткий НОД varkich Помощь студентам 0 19.06.2012 20:31
короткий вопрос. pinkiller Общие вопросы C/C++ 1 25.12.2011 15:02
Короткий вопрос. cin pinkiller Общие вопросы C/C++ 9 17.12.2011 21:03