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

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

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

Author24 — интернет-сервис помощи студентам
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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.04.2020, 14:07
Ответы с готовыми решениями:

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

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

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

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

17
Эксперт CЭксперт С++
5113 / 4552 / 854
Регистрация: 07.10.2015
Сообщений: 9,462
09.04.2020, 14:15 2
kitkat1000, что такое p? Голова? А если еще список пустой, то тогда, наверное, надо менять и голову?
0
4 / 3 / 0
Регистрация: 12.01.2020
Сообщений: 264
09.04.2020, 14:19  [ТС] 3
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Эксперт С++
5113 / 4552 / 854
Регистрация: 07.10.2015
Сообщений: 9,462
09.04.2020, 14:31 4
kitkat1000, зачем создавать отдельную тему? Вы же создали тему по этой программе!
И там ответили, что все в порядке. И так у Вас новый элемент добавляется в начало при node == NULL
И это происходит именно в этой подпрограмме.
0
4 / 3 / 0
Регистрация: 12.01.2020
Сообщений: 264
09.04.2020, 14:48  [ТС] 5
liv, а интересно как будет выглядеть код если новый элемент будет добавляться в конец?
0
Эксперт CЭксперт С++
5113 / 4552 / 854
Регистрация: 07.10.2015
Сообщений: 9,462
09.04.2020, 14:55 6
kitkat1000, задайте node равным адресу последнего элемента. Вставит после указанного, т.е. в конец

Добавлено через 1 минуту
Это же типа Ваша программа Где спионерили?
0
4 / 3 / 0
Регистрация: 12.01.2020
Сообщений: 264
09.04.2020, 16:34  [ТС] 7
liv, почему то не получается
0
Эксперт CЭксперт С++
5113 / 4552 / 854
Регистрация: 07.10.2015
Сообщений: 9,462
09.04.2020, 17:01 8
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  [ТС] 9
liv, ерунда какая то получается, может я что то не так делаю?
0
Эксперт CЭксперт С++
5113 / 4552 / 854
Регистрация: 07.10.2015
Сообщений: 9,462
09.04.2020, 18:12 10
kitkat1000, ну так показуйте...
0
4 / 3 / 0
Регистрация: 12.01.2020
Сообщений: 264
09.04.2020, 18:17  [ТС] 11
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Эксперт С++
5113 / 4552 / 854
Регистрация: 07.10.2015
Сообщений: 9,462
09.04.2020, 18:19 12
kitkat1000, и что выводит?
0
4 / 3 / 0
Регистрация: 12.01.2020
Сообщений: 264
09.04.2020, 18:22  [ТС] 13
liv,
Миниатюры
Реализовать добавление элемента в начало  
0
Эксперт CЭксперт С++
5113 / 4552 / 854
Регистрация: 07.10.2015
Сообщений: 9,462
09.04.2020, 18:22 14
Все должно быть правильно. У меня все работает. Что не нравится?
0
4 / 3 / 0
Регистрация: 12.01.2020
Сообщений: 264
09.04.2020, 18:24  [ТС] 15
liv, 100 не должно быть
0
Эксперт CЭксперт С++
5113 / 4552 / 854
Регистрация: 07.10.2015
Сообщений: 9,462
09.04.2020, 18:29 16
Функция удаления что делает?
Удаляет все узлы, значение которых заканчивается на 5
Вот узлы 5 и 15 и были удалены...

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

Добавлено через 3 минуты
kitkat1000, вопросы еще есть? Осмысливайте...
0
4 / 3 / 0
Регистрация: 12.01.2020
Сообщений: 264
09.04.2020, 18:51  [ТС] 17
liv, поможете тогда с этим вопросом: Нужно незначительно исправить код ?
0
Эксперт CЭксперт С++
5113 / 4552 / 854
Регистрация: 07.10.2015
Сообщений: 9,462
09.04.2020, 19:50 18
kitkat1000, ну там Вам помогает oleg-m1973. Что непонятно, спрашивайте у него.
0
09.04.2020, 19:50
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.04.2020, 19:50
Помогаю со студенческими работами здесь

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

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

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

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

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

Добавление минимального элемента в начало списка
Имеется список, элементами которого являются вещественные числа. Создать консольное приложение,...


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

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