0 / 0 / 0
Регистрация: 16.05.2018
Сообщений: 48
1

Работа с двусвязными и односвязными списками

07.05.2021, 23:08. Показов 1263. Ответов 2

Есть односвязный и двусвязный списки.

Нужно:

1. Создать ещё один односвязный список, в который поместить все элементы которые меньше заданного числа с первых двух списков.

2. Создать ещё один односвязный список, в который поместить все элементы кроме нулевого с первых двух списков.


Помогите пожалуйста с этими заданиями , не понимаю как это реализовать и нигде не могу найти(

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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#include <iostream>
#include <windows.h>
 
using namespace std;
 
//------------------------------------------------ОДНОСВЯЗНЫЙ СПИСОК---------------------------------
 
typedef struct Node
{
    int item;
    Node* next;
} Node;
 
void addLast_1(Node** head, int data)
{
   
    Node* temp = (Node*)malloc(sizeof(struct Node));
    temp->item = data;
    temp->next = NULL;
 
    if ((*head) == NULL)
        (*head) = temp;
   
    else
    {
        Node* lastNode = *head;
        while (lastNode->next != NULL)
        {
            lastNode = lastNode->next;
        }
 
   
        lastNode->next = temp;
    }
}
 
 
void printList_1(Node* head)
{
   
    for (Node* t = head; t != NULL; t = t->next)
    {
        printf("%d ", t->item);
    }
    printf("\n");
}
 
//--------------------------------------------ДВУСВЯЗНЫЙ СПИСОК---------------------------------------
typedef struct NodeT {
    int item;
    NodeT * next, * prev;
} NodeT;
 
 
void addLast_2(NodeT** head, int data)
{
    
    NodeT* new_node = new NodeT();
    NodeT* last = *head; 
    new_node->item = data;
    new_node->next = NULL;
    if (*head == NULL)
    {
        new_node->prev = NULL;
        *head = new_node;
        return;
    }
    while (last->next != NULL)
        last = last->next;
    last->next = new_node;
    new_node->prev = last;
}
 
void printList_2(NodeT* head)
{
    //iterate the entire linked list and print the data
    for (NodeT* t = head; t != NULL; t = t->next)
    {
        printf("%d ", t->item);
    }
    printf("\n");
}
 
int main()
{
 
    Node* first = NULL;
    NodeT* second = NULL;
  
    //Односвязный список
    addLast_1(&first,2);
    addLast_1(&first,0);
    addLast_1(&first,5);
    addLast_1(&first,9);
    addLast_1(&first,7);
    printList_1(first);
 
    
    cout << endl << endl;
 
    //Двусвязный список:
    addLast_2(&second,8);
    addLast_2(&second,1);
    addLast_2(&second,0);
    addLast_2(&second,3);
    addLast_2(&second,0);
    printList_2(second);
 
    return 0;
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.05.2021, 23:08
Ответы с готовыми решениями:

Работа с двусвязными списками
Доброго времени суток... покажите пожалуйста примеры на организацию двусвязных списков, их...

Работа с односвязными кольцевыми списками
народ помогите написать программу, уже неделю пытаюсь что то понять, ничего не выходит Создать...

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

Получить сумму двух целых чисел, представленных двусвязными списками
Пoлyчить cуммy двyx длинныx целыx чиcел. Чиcлa и резyльтат предcтавлены линейныMи двуcвязными...

2
129 / 81 / 49
Регистрация: 10.01.2020
Сообщений: 293
08.05.2021, 08:54 2
Лучший ответ Сообщение было отмечено Smehota как решение

Решение

Smehota, foo_1 - делает первый пункт, foo_2 - делает второй пункт:
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
#include <iostream>
#include <windows.h>
 
using namespace std;
 
//------------------------------------------------ОДНОСВЯЗНЫЙ СПИСОК---------------------------------
 
typedef struct Node
{
    int item;
    Node* next;
} Node;
 
void addLast_1(Node** head, int data)
{
 
    Node* temp = (Node*)malloc(sizeof(struct Node));
    temp->item = data;
    temp->next = NULL;
 
    if ((*head) == NULL)
        (*head) = temp;
 
    else
    {
        Node* lastNode = *head;
        while (lastNode->next != NULL)
        {
            lastNode = lastNode->next;
        }
 
 
        lastNode->next = temp;
    }
}
 
void printList_1(Node* head)
{
 
    for (Node* t = head; t != NULL; t = t->next)
    {
        printf("%d ", t->item);
    }
    printf("\n");
}
 
//--------------------------------------------ДВУСВЯЗНЫЙ СПИСОК---------------------------------------
typedef struct NodeT {
    int item;
    NodeT* next, * prev;
} NodeT;
 
void addLast_2(NodeT** head, int data)
{
 
    NodeT* new_node = new NodeT();
    NodeT* last = *head;
    new_node->item = data;
    new_node->next = NULL;
    if (*head == NULL)
    {
        new_node->prev = NULL;
        *head = new_node;
        return;
    }
    while (last->next != NULL)
        last = last->next;
    last->next = new_node;
    new_node->prev = last;
}
 
void printList_2(NodeT* head)
{
    //iterate the entire linked list and print the data
    for (NodeT* t = head; t != NULL; t = t->next)
    {
        printf("%d ", t->item);
    }
    printf("\n");
}
 
 
void foo_1(Node*& resNode, Node* otherSingle, NodeT* otherDouble, int value)
{
    Node* currentSingleNode = otherSingle;
    while (currentSingleNode)
    {
        if (currentSingleNode->item < value)
        {
            addLast_1(&resNode, currentSingleNode->item);
        }
        currentSingleNode = currentSingleNode->next;
    }
 
    NodeT* currentDoubleNode = otherDouble;
    while (currentDoubleNode)
    {
        if (currentDoubleNode->item < value)
        {
            addLast_1(&resNode, currentDoubleNode->item);
        }
        currentDoubleNode = currentDoubleNode->next;
    }
}
 
void foo_2(Node*& resNode, Node* otherSingle, NodeT* otherDouble)
{
    if (otherSingle)
    {
        Node* currentSingleNode = otherSingle->next;
        while (currentSingleNode)
        {
            addLast_1(&resNode, currentSingleNode->item);
            currentSingleNode = currentSingleNode->next;
        }
    }
    if (otherDouble)
    {
        NodeT* currentDoubleNode = otherDouble->next;
        while (currentDoubleNode)
        {
            addLast_1(&resNode, currentDoubleNode->item);
            currentDoubleNode = currentDoubleNode->next;
        }
    }
}
 
int main()
{
 
    Node* first = NULL;
    NodeT* second = NULL;
 
    //Односвязный список
    addLast_1(&first, 2);
    addLast_1(&first, 0);
    addLast_1(&first, 5);
    addLast_1(&first, 9);
    addLast_1(&first, 7);
    printList_1(first);
 
 
    cout << endl << endl;
 
    //Двусвязный список:
    addLast_2(&second, 8);
    addLast_2(&second, 1);
    addLast_2(&second, 0);
    addLast_2(&second, 3);
    addLast_2(&second, 0);
    printList_2(second);
 
 
    Node* res_1 = nullptr;
    foo_1(res_1, first, second, 6);
    std::cout << "result list 1: ";
    printList_1(res_1);
 
    Node* res_2 = nullptr;
    foo_2(res_2, first, second);
    std::cout << "result list 2: ";
    printList_1(res_2);
    return 0;
}
Добавлено через 1 минуту
Вам не обязательно передавать Node по двум указателям, можно передавать, как это сделал я.
1
0 / 0 / 0
Регистрация: 16.05.2018
Сообщений: 48
08.05.2021, 10:15  [ТС] 3
stdin, Спасибо Вам огромное!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.05.2021, 10:15
Помогаю со студенческими работами здесь

Составить программу для обработки списка рассылки, иллюстрирующую работу с двусвязными списками
Составить программу для обработки списка рассылки, иллюстрирующую ра-боту с двусвязными списками....

Работа с односвязными и двусвязными линейными списками.
Помогите пожалуйста с этим заданием Вариант структуры / тип данных: C / char Создание пусто-го...

Действия над односвязными и двусвязными списками
Помогите пожалуйста со списками односвязными и двусвязными. Не пишу на С++,поэтому впал в ступор...

Работа с односвязными списками
результат очень не нравиться, первые пять элементов одинаковые, хотя рандомом делаю, в чем ошибка...

Работа с односвязными списками.
Помогите пожалуйста, решить задачу в паскале. Program spisoc1; Type spis=^spisoc; ...

работа слинейными односвязными списками
Идем по списку, считаю сколько прошли до положительного двухцифрового. если нашли узел с...


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

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

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