Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
4 / 4 / 1
Регистрация: 18.09.2020
Сообщений: 149
1

Вставить в первый список, все узлы из второго

26.03.2021, 11:34. Показов 2693. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Дана следующая задача:
Даны два линейных однонаправленных
списка L1 и L2.
Разработать функцию, которая
вставляет в список L1 за узлом с заданным
значением Х все узлы списка L2, если узел Х
есть в списке L1.
Я с этими списками вообще на "Вы", так до сих пор и не понял как они работают и как к ним обращаться. В общем создал что-то типа того:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include <iostream>
 
using namespace std;
 
struct node
{
    char data;
    node *next;
};
 
node* func (node *L1, node *L2, char key)
{
    node *q1 = L1;
    node *q2 = L2;
    while(q1!=0 && q1->data!=key)
    {
        q1 = q1->next;
    }
    if(q1->data == key)
    {
        while(q2!=0){
        q1 = q1->next;
        q1->data = q2 ->data;
        q2 = q2->next;
        }
    }
    return q1;
}
 
void print(node *L1)
{
    node *q1 = L1;
    cout << q1->data << endl;
    q1 = q1->next;
}
 
int main()
{
    node *ptr1, *ptr2,*ptr3,*ptr4,*ptr5;
    ptr1 = new node;
    ptr1 -> data = 'a';
    ptr1 -> next = 0;
 
    ptr2 = new node;
    ptr2 -> data = 'b';
    ptr2 -> next = 0;
 
    ptr3 = new node;
    ptr3 -> data = 'c';
    ptr3 -> next = 0;
 
    ptr4 = new node;
    ptr4 -> data = 'd';
    ptr4 -> next = 0;
 
    ptr5 = new node;
    ptr5 -> data = 'e';
    ptr5 -> next = 0;
 
    node *L1 = nullptr;
    L1 = ptr1;
    ptr1 -> next = ptr5;
 
    node *L2 = nullptr;
    L2 = ptr2;
    ptr2 -> next = ptr3;
    ptr3 -> next = ptr4;
 
    node *L3 = func(L1,L2,'a');
    print(L3);
    return 0;
}
В функцию func, я передаю оба списка и нужный символ, внутри неё я даже могу отыскать этот символ, но вот как вставлять я не имею малейшего понятия, у них нет нумерации, программа выше не работает.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.03.2021, 11:34
Ответы с готовыми решениями:

Если первый список является префиксом второго и третий суффиксом второго — вывести на экран true
Здравствуйте. Даны три списка , если первый список является префиксом второго и третий суффиксом...

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

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

Определить является ли первый список подсписком второго
Доборого Вам времени суток! Долго бьюсь над решением казалось бы не трудной задачи. Если...

7
2528 / 1247 / 461
Регистрация: 08.11.2016
Сообщений: 3,428
26.03.2021, 12:08 2
Лучший ответ Сообщение было отмечено David_G как решение

Решение

Для начала напишите функцию добавления элемента в список, чтобы не заниматься тем, чем Вы у себя в main() занимаетесь.
C++
1
2
3
4
5
void addToList(node *&head, char value)
{
    node *newnode = new node{ value, head };
    head = newnode;
}
Удаление списка тоже лучше сделать функцией
C++
1
2
3
4
5
6
7
8
9
void deleteList(node *head)
{
    while (head)
    {
        node *forDeleteNode = head;
        head = nead->next;
        delete forDeleteNode;
    }
}
Далее удобнее будет, написать функцию поиска элемента списка по значению, которая возвращает указатель на элемент списка если таковой найден, а если не найден то нулевой указатель
C++
1
2
3
4
5
6
7
8
9
10
node * findInList(node *head, char value)
{
    while (head)
    {
        if (head->data == value)
            return head;
        head = neat->next;
    }
    return nullptr;
}
И теперь совсем чуть-чуть: объединить списки
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
bool joinListsIf(node *lst1, node *lst2, char value)
{
    node *forInsertNode = findInList(lst1, value);
    if (forInsertNode)
    {
        node *lst1Tail = forInsertNode->next;
        forInsertNode->next = lst2;
 
        while (forInsertNode->next)
            forInsertNode = forInsertNode->next;
 
        forInsertNode->next = lst1Tail;
 
        return true;
    }
 
    return false;
}
1
4 / 4 / 1
Регистрация: 18.09.2020
Сообщений: 149
26.03.2021, 15:52  [ТС] 3
Помимо ваших функций добавил ещё
C++
1
2
3
4
5
6
7
8
9
void print(node *L)
{
    node *q = L;
    while(q)
    {
        cout << q->data << endl;
        q = q->next;
    }
}
ну и конечно main
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int main()
{
    node *L1;
    char value;
    for(int a = 0; a<10; a++){
    cin >> value;
    addToList(L1,value);
    }
    node *L2;
    for(int a = 0; a<10; a++){
    cin >> value;
    addToList(L2,value);
    }
    if(joinListsIf(L1,L2,'a')==true)
        print(L1);
    else
        cout << "NO KEY";
    return 0;
}
Когда символ есть вроде работает нормально, а когда символ не находит, то не выводит ничего вообще, и в обоих случаях возвращается с ошибкой Process returned -1073741819 (0xC0000005)
0
2528 / 1247 / 461
Регистрация: 08.11.2016
Сообщений: 3,428
26.03.2021, 17:11 4
David_G, первые ноды L1 и L2 надо правильно инициализировать
C++
1
2
3
node *L1 = new node{ '1', nullptr };
//......
node *L2 = new node{ '2', nullptr };
0
4 / 4 / 1
Регистрация: 18.09.2020
Сообщений: 149
26.03.2021, 17:23  [ТС] 5
Цитата Сообщение от Annemesski Посмотреть сообщение
первые ноды L1 и L2 надо правильно инициализировать
Спасибо, заработало, только вот теперь в конце он выводит два непонятных символа, что это такое?
Миниатюры
Вставить в первый список, все узлы из второго  
0
2528 / 1247 / 461
Регистрация: 08.11.2016
Сообщений: 3,428
26.03.2021, 17:40 6
Цитата Сообщение от David_G Посмотреть сообщение
что это такое?
это Ваше )) приведите полный код, что у Вас получилось?
0
4 / 4 / 1
Регистрация: 18.09.2020
Сообщений: 149
26.03.2021, 19:10  [ТС] 7
Цитата Сообщение от Annemesski Посмотреть сообщение
это Ваше )) приведите полный код, что у Вас получилось?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include <iostream>
 
using namespace std;
 
struct node
{
    char data;
    node *next;
};
 
void print(node *L)
{
    node *q = L;
    cout << "OUT" << endl;
    while(q)
    {
        cout << q->data << endl;
        q = q->next;
    }
}
 
void addToList(node *&head, char value)
{
    node *newnode = new node{ value, head };
    head = newnode;
}
 
void deleteList(node *head)
{
    while (head)
    {
        node *forDeleteNode = head;
        head = head->next;
        delete forDeleteNode;
    }
}
 
node * findInList(node *head, char value)
{
    while (head)
    {
        if (head->data == value)
            return head;
        head = head->next;
    }
    return nullptr;
}
 
bool joinListsIf(node *lst1, node *lst2, char value)
{
    node *forInsertNode = findInList(lst1, value);
    if (forInsertNode)
    {
        node *lst1Tail = forInsertNode->next;
        forInsertNode->next = lst2;
 
        while (forInsertNode->next)
            forInsertNode = forInsertNode->next;
 
        forInsertNode->next = lst1Tail;
 
        return true;
    }
 
    return false;
}
 
int main()
{
    node *L1 = new node{1,nullptr};
    char value;
    for(int a = 0; a<10; a++){
    cin >> value;
    addToList(L1,value);
    }
    node *L2 = new node{2,nullptr};
    for(int a = 0; a<10; a++){
    cin >> value;
    addToList(L2,value);
    }
    if(joinListsIf(L1,L2,'a')==true)
        print(L1);
    else
        cout << "NO KEY";
    return 0;
}
Добавлено через 5 минут
Цитата Сообщение от Annemesski Посмотреть сообщение
это Ваше )) приведите полный код, что у Вас получилось?
кажется я вместо char, передавал при инициализации через new - int, изменил на пустой символ ' ', стало всё нормально.
0
2528 / 1247 / 461
Регистрация: 08.11.2016
Сообщений: 3,428
27.03.2021, 07:53 8
David_G, да, Вы передавали код символа у символа "единица" код 49
0
27.03.2021, 07:53
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.03.2021, 07:53
Помогаю со студенческими работами здесь

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

Функция, вставляющая в первый список элементы второго списка
примечание: Определите на двух языках Clisp и SWI-Prolog соответственно функцию и предикат для...

Вывести True, если первый список является префиксом второго
Здравствуйте! Приношу свои извеинения за наглость. Но не могли бы мне помочь написать программу...

Имеется два списка; определить, является ли первый список подсписком второго
Доборого Вам времени суток! Долго бьюсь над решением казалось бы не трудной задачи, к несчастью...

Односвязный список на C#. Вставить первый элемент в конец
Добрый день всем! Заранее извиняюсь если вопрос нубский. Стоит такая задача: есть односвязный...

Прочитать числа второго файла и вставить их на правильные места в созданный список
Здравствуйте уважаемые программисты. Решил следующую задачу: В один файл заносятся упорядоченная...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru