Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
0 / 0 / 0
Регистрация: 16.09.2019
Сообщений: 7
1

Формирование нового списка из двух заданных. (Односвязные списки)

30.09.2019, 15:29. Показов 1831. Ответов 8
Метки нет (Все метки)

Описать процедуру, которая формирует список L, включив в него по одному разу элементы, которые входят в список L1, но не входят в список L2.
C++
1
2
3
4
5
struct tnode {
    int info;
    tnode *next;
    };
typedef tnode * pnode;
Сама функция:
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
pnode formNewList(pnode *listFirst, pnode *listSecond)
{
    pnode newList = NULL;
    pnode curF, curS, top;
    curF = *listFirst;
    curS = *listSecond;
    while (curF->next)
    {
        while (curS->next)
        {
            if (curF->info == curS->info)
            {
                break;
            }
            else
            {
                newList->info == curF->info;
                newList = newList->next;
                newList->next = NULL;
            
                curS = curS->next;
            }
        }
    }
    return newList;
}
Вызов функции:
C++
1
listResult = formNewList(&listFirst, &listSecond);
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.09.2019, 15:29
Ответы с готовыми решениями:

Односвязные списки (функции обращения списка)
1. Написать рекурсивную функцию обращения списка. 2. Написать итеративную функцию обращения...

Односвязные линейные списки Pascal. Сравнить 2 списка.
Здравствуйте! Уважаемые господа программисты, нужна Ваша помощь :-завтра можно дописать, эту же...

Односвязные списки. Поменять первую половину списка со второй
Здравствуйте, уважаемые форумчане! Придумал еще одну задачу на односвязные списки с использованием...

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

8
136 / 76 / 60
Регистрация: 14.09.2019
Сообщений: 218
30.09.2019, 17:34 2
Lolinescence, и что именно не получается?
0
0 / 0 / 0
Регистрация: 16.09.2019
Сообщений: 7
30.09.2019, 18:26  [ТС] 3
Не могу реализовать алгоритм.
Выбрала для себя такой:
Берём один элемент первого списка и проходим по второму, сравнивая.
а) нашли совпадение - выходим из цикла, переходим к следующему элементу
б) не нашли совпадение - добавляет элемент в список-результат, переходим к следующему (тут нужно проверить, дошли ли мы до конца списка без совпадений, чтоб один и тот же элемент не добавлялся несколько раз)
Когда заканчиваются элементы первого списка, присваиваем полю newList->next значение NULL.

Ещё нужно как-то определять, есть ли в списке результате идентичный элемент, к примеру
список 1: 1 2 3 2 4 5
список 2: 3 5

В итоге список-результат должен выглядеть: 1 2 4 (т.е. без повторений) вместо 1 2 2 4.

Вылетает ошибка при присвоении nullptr полю newList->next

Добавлено через 41 минуту
Цитата Сообщение от ibse Посмотреть сообщение
Lolinescence, и что именно не получается?
TЕсли есть варианты, можете подсказать алгоритм поудобнее?
0
136 / 76 / 60
Регистрация: 14.09.2019
Сообщений: 218
30.09.2019, 18:30 4
Lolinescence, весь код выложи

Добавлено через 18 секунд
Lolinescence, и тест на котором происходит ошибка
0
0 / 0 / 0
Регистрация: 16.09.2019
Сообщений: 7
30.09.2019, 18:44  [ТС] 5
Цитата Сообщение от ibse Посмотреть сообщение
Lolinescence, весь код выложи
Header:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
using namespace std;
 
 struct tnode {
    int info;
    tnode *next;
    };
typedef tnode * pnode;
 
void formForward(pnode *top);
 
void outputList(pnode top);
 
pnode formNewList(pnode *listFirst, pnode *listSecond);
Main:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include "Header.h"
 
int main()
{
    pnode listFirst = NULL;
    pnode listSecond = NULL;
    pnode listResult = NULL;
 
    cout << "Enter array 1" << endl;
    formForward(&listFirst);
 
    cout << "Enter array 2" << endl;
    formForward(&listSecond);
 
    outputList(listFirst);
    outputList(listSecond);
 
    listResult = formNewList(&listFirst, &listSecond);
    outputList(listResult);
 
    system("pause");
}
Functions:
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
#include "Header.h"
 
void formForward(pnode *top)    //функция с параметром  в прямом порядке
{
    int info;
    pnode cur = NULL;
    *top = NULL;
    cin >> info;
    if (info)
    {
        *top = new tnode;
        (*top)->info = info;
        (*top)->next = NULL;
        cur = *top;
    }
    cin >> info;
    while (info)
    {
        cur->next = new tnode;
        cur = cur->next;
        cur->info = info;
        cin >> info;
    }
    cur->next = NULL;
}
 
pnode formNewList(pnode *listFirst, pnode *listSecond)
{
    pnode newList = NULL;
    pnode curF, curS, top;
    curF = *listFirst;
    while (curF->next)
    {
        curS = *listSecond;
        while (curS->next)
        {
            if (curF->info == curS->info)
            {
                break;
            }
            else
            {
                newList->info = curF->info;
                newList = newList->next;   //Вызвано исключение: нарушение доступа для чтения. newList было nullptr.
                newList->next = NULL;         
                curS = curS->next;
            }
        }
        curF = curF->next;
    }
    return newList;
}
 
void outputList(pnode top)      //функция вывода информации списка
{
    pnode cur;
    cur = top;
    while (cur != NULL)
    {
        cout << cur->info << " ";
        cur = cur->next;
    }
    cout << endl;
}
0
136 / 76 / 60
Регистрация: 14.09.2019
Сообщений: 218
30.09.2019, 19:01 6
Lolinescence, тест, на котором происходит ошибка какой? какие числа ты вводишь и получаешь ошибку?
0
0 / 0 / 0
Регистрация: 16.09.2019
Сообщений: 7
30.09.2019, 19:10  [ТС] 7
ibse, любые, если честно. Ввожу 1 2 3 4 5 в первый список и 2 5 во второй
0
136 / 76 / 60
Регистрация: 14.09.2019
Сообщений: 218
30.09.2019, 20:18 8
Лучший ответ Сообщение было отмечено Lolinescence как решение

Решение

Lolinescence, 1 2 3 4 5, 2 5 на выходе 1 3 4
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
pnode formNewList(pnode *listFirst, pnode *listSecond)
{
    pnode newList = NULL;
    pnode curF, curS, top;
    bool flag = true;
    pnode head = NULL;
    curF = *listFirst;
    while (curF)
    {
        curS = *listSecond;
        while (curS)
        {
            if (curF->info == curS->info)
            {
                flag = false;
                break;
            }
            curS = curS->next;
        }
        if (flag) {
            if (newList == NULL) {
                newList = new tnode;
                head = newList;
            }
            else
            {
                newList->next = new tnode;
                newList = newList->next;
            }
            newList->info = curF->info;
            newList->next = NULL;  //Вызвано исключение: нарушение доступа для чтения. newList было nullptr.
        }
        flag = true;
        curF = curF->next;
    }
    return head;
}
1
0 / 0 / 0
Регистрация: 16.09.2019
Сообщений: 7
30.09.2019, 20:50  [ТС] 9
ibse, спасибо большое, так и думала, что нужно ввести счетчик, который будет хранить в себе информацию о совпадениях. (В вашем случае - flag) Что-то похожее ранее делала с двумя целочисленными массивами.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.09.2019, 20:50
Помогаю со студенческими работами здесь

Формирование нового списка или из pascal -> с++
Добрый вечер всем! Друзья помогите пожалуйста решить задачу на языке С++. Комп содержит записи,...

Формирование нового списка на основе существующих данных
Ребят... подскажите пожалуйста..где ошибка в коде... Задача На рабочем листе с помощью...

Формирование нового массива из двух других
Столкнулся с такой задачей. Сам только начал программировать на JAVA. Так пишу на C++. Вот задание:...

Формирование нового двумерного списка в зависимости от сортировки исходного
Есть двумерный список (1000 строк по 10 элементов в каждой). Необходимо сформировать новый список...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru