Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
4 / 3 / 0
Регистрация: 12.01.2020
Сообщений: 264

Реализовать добавление элемента в начало

09.04.2020, 14:07. Показов 739. Ответов 17

Студворк — интернет-сервис помощи студентам
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Node* Add(Node * p, int num, Node* node = NULL)//Это опциональный параметр - это элемент после которого надо добавлять. Если он NULL, то новый элемент добавляется в начало. 
{   
    Node *elem = new Node();
    elem->field = num;
    if (node == NULL)
    {   
        if (p->ptr == NULL)
        {  
            elem->ptr = NULL;
            p->ptr = elem;
        }
        else
        {   
            elem->ptr = p->ptr;
            p->ptr = elem;
        }
        return elem;
    }
    elem->ptr = node->ptr;
    node->ptr = elem;
    return elem;
}
Если он NULL, то новый элемент добавляется в начало.
Вопрос: как реализовать добавление в начало в этом участке кода?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.04.2020, 14:07
Ответы с готовыми решениями:

Реализовать функционал работы с одномерным динамическим массивом (добавление одного элемента в начало)
Реализовать функционал работы с одномерным динамическим массивом. Возникла проблема с добавлением элемента. Буду признательна за...

Добавление элемента в начало массива
Есть два массива, например (1,2,3,4,5) и (0,0,5,5,5), нужно превратить их в (0,1,2,3,4,5) и в (0,0,0,5,5,5), не знаю как реализовать. ...

Добавление элемента в начало списка
Проблема в том, что выводит 100, 9. Почему не выводит промежуточные значения - не понятно. Вроде бы не должен. #include...

17
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
09.04.2020, 14:15
kitkat1000, что такое p? Голова? А если еще список пустой, то тогда, наверное, надо менять и голову?
0
4 / 3 / 0
Регистрация: 12.01.2020
Сообщений: 264
09.04.2020, 14:19  [ТС]
liv, вот весь код:
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
#include<iostream>
 
using namespace std;
 
struct Node
{   
    Node() : ptr(NULL) {}
    int   field;
    Node * ptr;
};
    
bool isEmpty(Node * p)
{   
     return p->ptr == NULL;
}
 
Node* Next(Node * p, Node* node)
{   
    if (isEmpty(p)) 
        return NULL;
        
    return node->ptr;
}
 
Node* Prev(Node * p, Node* node)
{   if (isEmpty(p))
        return NULL;
    if (node == p->ptr)
        return NULL;
        
    Node *cp = p->ptr;
    while (cp->ptr != node)
        cp = cp->ptr;
    return cp;
}
 
Node* Add(Node * p, int num, Node* node = NULL)//Это опциональный параметр - это элемент после которого надо добавлять. Если он NULL, то новый элемент добавляется в начало.
{   
    Node *elem = new Node();
    elem->field = num;
    if (node == NULL)
    {   
        if (p->ptr == NULL)
        {  
            elem->ptr = NULL;
            p->ptr = elem;
        }
        else
        {   
            elem->ptr = p->ptr;
            p->ptr = elem;
        }
        return elem;
    }
    elem->ptr = node->ptr;
    node->ptr = elem;
    return elem;
}
 
Node* Delete(Node * p, Node* node)
{   
    if (node == NULL)
    {   
        return NULL;
    }
    if (node == p->ptr)
    {   
        p->ptr = node->ptr;
        delete node;
        return p->ptr;
    }
    Node* prev = Prev(p, node);
    prev->ptr = node->ptr;
    delete node;
    return prev;
}
 
Node* getLast(Node * p)
{   Node* cp = p->ptr;
    while (Next(p, cp) != NULL)
        cp = Next(p, cp);
    return cp;
}
 
void Clear(Node * p)
{   
    Node *cp = p->ptr;
    if (cp == NULL)
        return;
    do
    {   
        Node *d = cp;
        cp = Next(p, cp);
        delete d;
    }
    while (cp != NULL);
    p->ptr = NULL;
}
 
void Print(Node * p)
{   
    if (isEmpty(p))
    {   
        cout << "The list is empty" << endl;
        return;
    }
    Node *cp = p->ptr;
    while (cp != NULL)
    {   
        cout << cp->field << " ";
        cp = Next(p, cp);
    }
    cout << endl;
}
 
int delete_value(Node * p, const int measure)
{   
    for(Node* cp = p->ptr; cp; cp = Next(p, cp))
    {   
        if(cp->field % 10 == measure)
        {
             cp = Delete(p, cp);
        }
    }
    return 0;
}
 
int main()
{
    cout << "Create a list\n";
    
    Node list;
    
    Print(&list);
 
    int N;
    cout <<"Enter the number of items: ";
    cin>>N;
    for (int i = 0; i < N; i++)
    {   int z;
        cout << "Number "<< i+1 <<": ";
        cin>>z;
        Add(&list, z);
    }
    cout << '\n';
    
    Print(&list);
 
    delete_value(&list, 5);
 
    cout << "\nResult: \n";
    Print(&list);
}
0
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
09.04.2020, 14:31
kitkat1000, зачем создавать отдельную тему? Вы же создали тему по этой программе!
И там ответили, что все в порядке. И так у Вас новый элемент добавляется в начало при node == NULL
И это происходит именно в этой подпрограмме.
0
4 / 3 / 0
Регистрация: 12.01.2020
Сообщений: 264
09.04.2020, 14:48  [ТС]
liv, а интересно как будет выглядеть код если новый элемент будет добавляться в конец?
0
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
09.04.2020, 14:55
kitkat1000, задайте node равным адресу последнего элемента. Вставит после указанного, т.е. в конец

Добавлено через 1 минуту
Это же типа Ваша программа Где спионерили?
0
4 / 3 / 0
Регистрация: 12.01.2020
Сообщений: 264
09.04.2020, 16:34  [ТС]
liv, почему то не получается
0
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
09.04.2020, 17:01
kitkat1000, ну и зачем было создавать еще одну тему?

Пройдитесь по своему списку, найдите последний узел списка и вызовите функцию add с параметром node, равным последнему узлу.

Добавлено через 10 минут
kitkat1000, как успехи?

Добавлено через 11 минут
kitkat1000, добавьте перед удалением элемента, равного 5, и будет Вам счастье:
C++
1
2
3
4
    Node *p;
    for (p = list.ptr; p->ptr; p = p->ptr);
    Add(&list, 100, p);
    Print(&list);
Добавится в конец списка узел со значением 100

Добавлено через 3 минуты
Кстати, у Вас там есть функция GetLast(). Наверное, можно ее использовать вместо моего цикла.
0
4 / 3 / 0
Регистрация: 12.01.2020
Сообщений: 264
09.04.2020, 18:00  [ТС]
liv, ерунда какая то получается, может я что то не так делаю?
0
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
09.04.2020, 18:12
kitkat1000, ну так показуйте...
0
4 / 3 / 0
Регистрация: 12.01.2020
Сообщений: 264
09.04.2020, 18:17  [ТС]
liv,
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
#include<iostream>
 
using namespace std;
 
struct Node
{   
    Node() : ptr(NULL) {}
    int   field;
    Node * ptr;
};
    
bool isEmpty(Node * p)
{   
     return p->ptr == NULL;
}
 
Node* Next(Node * p, Node* node)
{   
    if (isEmpty(p)) 
        return NULL;
        
    return node->ptr;
}
 
Node* Prev(Node * p, Node* node)
{   if (isEmpty(p))
        return NULL;
    if (node == p->ptr)
        return NULL;
        
    Node *cp = p->ptr;
    while (cp->ptr != node)
        cp = cp->ptr;
    return cp;
}
 
Node* Add(Node * p, int num, Node* node = NULL)
{   
    Node *elem = new Node();
    elem->field = num;
    if (node == NULL)
    {   
        if (p->ptr == NULL)
        {  
            elem->ptr = NULL;
            p->ptr = elem;
        }
        else
        {   
            elem->ptr = p->ptr;
            p->ptr = elem;
        }
        return elem;
    }
    elem->ptr = node->ptr;
    node->ptr = elem;
    return elem;
}
 
Node* Delete(Node * p, Node* node)
{   
    if (node == NULL)
    {   
        return NULL;
    }
    if (node == p->ptr)
    {   
        p->ptr = node->ptr;
        delete node;
        return p->ptr;
    }
    Node* prev = Prev(p, node);
    prev->ptr = node->ptr;
    delete node;
    return prev;
}
 
Node* getLast(Node * p)
{   Node* cp = p->ptr;
    while (Next(p, cp) != NULL)
        cp = Next(p, cp);
    return cp;
}
 
void Clear(Node * p)
{   
    Node *cp = p->ptr;
    if (cp == NULL)
        return;
    do
    {   
        Node *d = cp;
        cp = Next(p, cp);
        delete d;
    }
    while (cp != NULL);
    p->ptr = NULL;
}
 
void Print(Node * p)
{   
    if (isEmpty(p))
    {   
        cout << "The list is empty" << endl;
        return;
    }
    Node *cp = p->ptr;
    while (cp != NULL)
    {   
        cout << cp->field << " ";
        cp = Next(p, cp);
    }
    cout << endl;
}
 
int delete_value(Node * p, const int measure)
{   
    for(Node* cp = p->ptr; cp; cp = Next(p, cp))
    {   
        if(cp->field % 10 == measure)
        {
             cp = Delete(p, cp);
        }
    }
    return 0;
}
 
int main()
{
    cout << "Create a list\n";
    
    Node list;
    
    Print(&list);
 
    int N;
    cout <<"Enter the number of items: ";
    cin>>N;
    for (int i = 0; i < N; i++)
    {   int z;
        cout << "Number "<< i+1 <<": ";
        cin>>z;
        Add(&list, z);
    }
    cout << '\n';
    
     Node *p;
     for (p = list.ptr; p->ptr; p = p->ptr);
     Add(&list, 100, p);
    Print(&list);
 
    delete_value(&list, 5);
 
    cout << "\nResult: \n";
    Print(&list);
}
0
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
09.04.2020, 18:19
kitkat1000, и что выводит?
0
4 / 3 / 0
Регистрация: 12.01.2020
Сообщений: 264
09.04.2020, 18:22  [ТС]
liv,
Миниатюры
Реализовать добавление элемента в начало  
0
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
09.04.2020, 18:22
Все должно быть правильно. У меня все работает. Что не нравится?
0
4 / 3 / 0
Регистрация: 12.01.2020
Сообщений: 264
09.04.2020, 18:24  [ТС]
liv, 100 не должно быть
0
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
09.04.2020, 18:29
Функция удаления что делает?
Удаляет все узлы, значение которых заканчивается на 5
Вот узлы 5 и 15 и были удалены...

Добавлено через 1 минуту
А 100 добавляется в конец списка по последней просьбе
Не надо - уберите...

Добавлено через 3 минуты
kitkat1000, вопросы еще есть? Осмысливайте...
0
4 / 3 / 0
Регистрация: 12.01.2020
Сообщений: 264
09.04.2020, 18:51  [ТС]
liv, поможете тогда с этим вопросом: Нужно незначительно исправить код ?
0
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
09.04.2020, 19:50
kitkat1000, ну там Вам помогает oleg-m1973. Что непонятно, спрашивайте у него.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.04.2020, 19:50
Помогаю со студенческими работами здесь

Добавление элемента в начало динамического массива
Господа подскажите пожалуйста ошибку в коде. Не верно работает добавление нового элемента в начало динамического массива. Не могу допетрить...

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

Односвязный список, распечатка, добавление элемента в начало
Вечер добрый. Пытаюсь вывести структуру, но ничего не получается. пишет Head was not declared in this scope. не знаю что делать. инет...

Списки. Инициализация, добавление элемента в начало и после другого элемента. Удаление элемента
uses crt; type list= ^item; item=record data: integer; next:list; end; var l:list; procedure print;

Добавление элемента в начало списка
Procedure AddToEnd(i:integer; var head:Tlist); //добавление элемента в конец списка i- добавляемые данные //head -начало для...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru