Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.97/34: Рейтинг темы: голосов - 34, средняя оценка - 4.97
1 / 1 / 1
Регистрация: 28.09.2015
Сообщений: 40

Функция: вставка элемента в двусвязный список после заданного

20.05.2017, 14:18. Показов 7167. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток! Нужно написать функцию вставки элемента в двусвязный список после заданного. Список моего задания состоит из 4 элементов и через банальный switch я смог это сделать, но если бы там было больше элементов, он бы не работал. Хотелось бы увидеть пару советов, как реализовать эту задачу для любого количества элементов. Судя по прочитанному рекомендуют пролистать список до этого элемента и вставить после него, но этого сделать у меня не получается..Вот эта безуспешная попытка
C++
1
2
3
4
5
6
7
8
9
10
11
12
void List::addElemAfter(string data,int numb)
{
Element *temp = new Element;    
 
for(int i=1; i!=numb; i++)  
{
    temp->next=temp;
cout<<"numb="<<numb<<endl;
}
countElem++;    
 
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.05.2017, 14:18
Ответы с готовыми решениями:

Вставка элемента в линейный односвязный список после заданного
Я составила программу, но возникла проблема с реализацией вставки элемента после указанного значения. А точнее с составление функции,...

Рекурсия и списки: вставка заданного элемента в список на N-ую позицию
Написать программу вставки заданного элемента в список на N-ую позицию

Вставка элементов в перед и после заданного элемента
Народ помогите,нужно найти первое вхождение элемента Х в список и потом вставить после него и перед ним элементы Y-Перед, Z- После.

9
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
20.05.2017, 14:24
Элемент как идентифицируется-то?
0
1 / 1 / 1
Регистрация: 28.09.2015
Сообщений: 40
20.05.2017, 14:30  [ТС]
Извините, не могу понять вопроса )
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
20.05.2017, 14:31
Ну по номеру, что ли? Считать от начала?
0
1 / 1 / 1
Регистрация: 28.09.2015
Сообщений: 40
20.05.2017, 14:32  [ТС]
Да, после указанного номера списка, считая от начала.
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
20.05.2017, 15:10
temp для передвижения по списку. А новый элемент создай через другой указатель и перенаправь элементы перед и после.
0
1 / 1 / 1
Регистрация: 28.09.2015
Сообщений: 40
20.05.2017, 19:18  [ТС]
Всем доброго времени суток. Угрохал весь день на поиски материалов про вставку элемента двусвязного списка после заданного. После кучи часов потраченного времени у меня ничего не получилось, кроме вставки в конец, удаления и вывода на экран. Прошу помощи, чтоб разобраться на примере своего класса.
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 <list>
using namespace std; // ðàçðåøåíèå èñïîëüçîâàòü ãëîáàëüíûå èìåíà
 
struct Element  
{
public: // ñïèñîê ìåòîäîâ äîñòóïíûõ äðóãèì ôóíêöèÿì è îáúåêòàì ïðîãðàììû
string data;    //ñàìè äàííûå
Element *next; // óêàçàòåëè íà ñëåäóþùèé
Element *pred; //è íà ïðåäûäóùèé ýëåìåíòû ñïèñêà
};
 
class List
{
public:
Element *pHead; // óêàçàòåëü íà ïåðâûé ýëåìåíò ñïèñêà
Element *pTail; // óêàçàòåëü íà ïîñëåäíèé ýëåìåíò ñïèñêà
int countElem; // êîëè÷åñòâî ýëåìåíòîâ â ñïèñêå
 
List(); //êîíñòðóêòîð
~List();
void addToList(string data);    //ôóíêöèÿ äîáàâêè ýëåìåíòà (ñëîâà) â ñïèñîê
void printList();   //ôóíêöèÿ âûâîäà íà ýêðàí âñåõ ýëåìåíòîâ ñïèñêà
void delElem(int numb); //óäàëåíèå îäíîãî ýëåìåíòà
void addElemAfter(string data,int numb); // äîáàâëåíèå ýëåìåíòà ñïèñêà ïîñëå çàäàííîãî
void delAllList();
};
List::List() // ïóñòîé ñïèñîê
{
pHead = NULL; // ïåðâûé ýëåìåíò ïóñò
pTail = NULL; // âòîðîé ýëåìåíò ïóñò
countElem = 0;   // êîëè÷åñòâî ýëåìåíòîâ ðàâíî íóëþ
}
List::~List()
{
delAllList();
}
void List::delAllList()
{
while(pHead != NULL)    //ïîêà íå óêàçûâàåì íà õâîñò
{
Element *pTemp = pHead; //ñîçäàåì âðåìåííûé ýëåìåíò
pHead = pHead->next;    //ïðèñâàèâàåì åìó óêàçàòåëü íà ñëåäóþùèé
delete pTemp;   // è óäàëÿåì åãî
}
 
pHead = NULL;
pTail = NULL;
countElem = 0;
}
void List::addToList(string data)   //ðåàëèçàöèÿ ôóíêöèè äîáàâëåíèÿ
{
Element *temp = new Element;    //ñîçäàåòñÿ âðåìåííûé ýëåìåíò
if(pHead == NULL)   //åñëè ýòî ïåðâûé ýëåìåíò, òî
{
temp->pred = NULL;  //îáíóëÿåì óêàçàòåëü íà ïðåäøåñòâóþùèé 
//ýëåìåíò ò.ê. åãî íåò
temp->next = NULL;  //òî æå ñàìîå ñ ïîñëåäóþùèì ýëåìåíòîì
pHead = temp;   //"ãîëîâà" óêàçûâàåò íà ñîçäàííûé ýëåìåíò
}
else    //åñëè íå ïåðâûé, òî
pTail->next = temp; //ïðåäûäóùèé óêàçûâàåò íà íåãî
 
temp->data = data;  //êîïèðóåì äàííûå
temp->next = NULL;  //ïîñëåäóþùåãî ýëåìåíòà íåò (äîáàâëÿåì æå â êîíåö)
temp->pred = pTail; //óêàçûâàåì íà ïðåäûäóùèé ýëåìåíò, íà êîòîðûé «íàöåëåí» pTail
pTail = temp;   //à òåïåðü õâîñòîâîé ýëåìåíò óêàçûâàåò íà ïîñëåäíèé (äîáàâëåííûé)
countElem++;    //óâåëè÷èâàåì ñ÷åò÷èê ýëåìåíòîâ â ñïèñêå
}
 
void List::printList()  //ðåàëèçàöèÿ ôóíêöèè âûâîäà íà ýêðàí ñïèñêà
{
Element *pTemp = pHead; //ñîçäàåòñÿ âðåìåííûé ýëåìåíò
 
if (pHead == NULL)  //åñëè ñïèñîê ïóñò, òî 
{
cout << "Ñïèñîê ïóñò!";   //âûâîäèì ñîîòâåòñòâóþùåå ñîîáùåíèå
}
else    //åñëè âñå òàêè îí íå ïóñò, òî
{
cout << "Ñïèñîê: \n"; 
while(pTemp != NULL)    //ïîêà âðåì. ýëåì. íå áóäåò óêàçûâàòü íà õâîñò
{
cout << pTemp->data + ' '<<"\n";    //âûâîäèì äàííûå ýëåìåíòà
pTemp = pTemp->next;    //è ïåðåõîäèì íà ñëåäóþùèé çà íèì ýëåì.
cout<<"Çíà÷åíèå óêàçàòåëÿ íà ñëåäóþùèé ýëåìåíò = "<<pTemp<<endl;
}
cout << endl;
}
}
 
void List::addElemAfter(string data,int numb)
{
 
countElem++;    //óâåëè÷èâàåì ñ÷åò÷èê ýëåìåíòîâ â ñïèñêå
}
void List::delElem(int numb)    //ôóíêöèÿ óäàëåíèÿ ýëåìåíòà
{
Element *pTemp = pHead; //ñîçäàåì âðåìåííûé ýëåìåíò 
if ((numb>countElem) || (numb<1))   //åñëè óêàçàííûé ýëåìåíò íå ñóùåñòâóåò, òî
cout << "Òàêîãî ýëåìåíòà íåòó!" << endl; //âûâîäèì ïðåäóïðåæäåíèå íà ýêðàí
else
{
for(int i=1; i!=numb; i++)  //èíà÷å, ïåðåõîäèì äî ýòîãî ýëåìåíòà
{
pTemp = pTemp->next;
}
 
if (pTemp->pred == NULL) //åñëè óäàëÿåì ïåðâûé ýëåìåíò
{
if (countElem == 1) //åñëè ýòîò ýëåìåíò åäèíñòâåííûé
{
pHead = NULL;
pTail = NULL;
}
else //åñëè îí ïåðâûé, íî íå åäèíñòâåííûé
{
pTemp->next->pred = NULL;
}
 
delete pTemp;
countElem--;
cout << "Ýëåìåíò " << numb << " óäàë¸í." << endl;
return;
}
 
if (pTemp->next == NULL)    //åñëè óäàëÿåì ïîñëåäíèé ýëåìåíò, òî
{
pTemp->pred->next = NULL;   //ïðåäûäóùèé ýëåìåíò óêàçûâàåò 
//íà NULL
pTail = pTemp->pred;    //óêàçàòåëü íà ïîñëåäíèé ýëåìåíò 
//óêàçûâàåò íà ïðåäïîñëåäíèé
 
delete pTemp;
countElem--;
cout << "Ýëåìåíò " << numb << " óäàë¸í." << endl;
return;
}   
//åñëè ýëåìåíò íàõîäèòñÿ â öåíòðå ñïèñêà
if (pTemp->next != NULL && pTemp->pred != NULL) 
{
pTemp->pred->next = pTemp->next; //ïðåäûäóùèé ýëåìåíò óêàçûâàåò 
//íà ñëåäóþùèé
pTemp->next->pred = pTemp->pred; //ñëåäóþùèé óêàçûâàåò íà 
//ïðåäûäóùèé
delete pTemp;
countElem--;
cout << "Ýëåìåíò " << numb << " óäàë¸í." << endl;
return;
}
}
};
int main()  // ãëàâíàÿ ôóíêöèÿ ïðîãðàììû
{
List Lst; // 
setlocale(LC_CTYPE,"Russian"); // 
Lst.addToList("asd1"); //  
Lst.addToList("asd2");
Lst.addToList("asd3");
Lst.addElemAfter("asd4",3);
Lst.printList(); // 
Lst.~List();
return 0; // 
}
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
20.05.2017, 20:21
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void List::addElemAfter(string data, int numb)
{
    Element *p = pHead, n;
    for (int i = 1; i < numb && p != NULL; ++i) p = p->next;
 
    if (p->next == NULL)
    {
        addToList(data);
        return;
    }
 
    n = new Element;
    n->data = data;
    n->next = p->next;
    n->pred = p;
    p->next->pred = n;
    p->next = n;
 
    ++countElem;
}
Случаи с numb == 1 и с numb больше числа элементов сам добавь.
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
20.05.2017, 20:45
Цитата Сообщение от yurchik1 Посмотреть сообщение
После кучи часов потраченного времени у меня ничего не получилось, кроме вставки в конец,
yurchik1, вставка в конец это частный случай вставки по указателю нода. Но реализовать можно и иначе. То есть Вы можете просто связать элемент с нулевым (пустым указателем конца который незаполен у последнего нода, потом обнулить указатель вставленного элемента и может быть переустановить указатель конца списка если у вас он есть (а он вроде есть: pTail). Но лучше даже в этом случае вставлять элемент перед последним элементом. Это хорошо потому, что алгоритм вставки будет одинаково работать при вставке по любому указателю в списке. Для этого имеет смысл данный последний нод не использовать как нод данных, а считать нодом конца списка.
Тогда функция вставки получающая указатель на элементElement *element_to_ins_before перед которым вы хотите вставить новый элемент и новый элемент, будет разрывать двустороннюю связь element_to_ins_before (проверяя не является ли он корневым сначала, потому как в этом случае - достаточно только вставить новый в начало и изменить указатель на корень). В разорванную связь вставляется новый элемент и образуются две новые связи по цепочке, в месте где он вставлен. Указатели предшественника и последователя обновляются.
0
1 / 1 / 1
Регистрация: 28.09.2015
Сообщений: 40
20.05.2017, 23:22  [ТС]
nmcf, выдаёт ошибку в 12 строке, как поправить?
C:\Users\Þðà\Documents\ASD.cpp In member function 'void List::addElemAfter(std::string, int)':
103 7 C:\Users\Þðà\Documents\ASD.cpp [Error] no match for 'operator=' (operand types are 'Element' and 'Element*')
103 7 C:\Users\Þðà\Documents\ASD.cpp [Note] candidate is:
5 8 C:\Users\Þðà\Documents\ASD.cpp [Note] Element& Element::operator=(const Element&)
5 8 C:\Users\Þðà\Documents\ASD.cpp [Note] no known conversion for argument 1 from 'Element*' to 'const Element&'
104 6 C:\Users\Þðà\Documents\ASD.cpp [Error] base operand of '->' has non-pointer type 'Element'
105 6 C:\Users\Þðà\Documents\ASD.cpp [Error] base operand of '->' has non-pointer type 'Element'
106 6 C:\Users\Þðà\Documents\ASD.cpp [Error] base operand of '->' has non-pointer type 'Element'
107 19 C:\Users\Þðà\Documents\ASD.cpp [Error] cannot convert 'Element' to 'Element*' in assignment
108 13 C:\Users\Þðà\Documents\ASD.cpp [Error] cannot convert 'Element' to 'Element*' in assignment

Добавлено через 1 час 6 минут
Всё, исправил, спасибо )
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.05.2017, 23:22
Помогаю со студенческими работами здесь

Вставка заданного числа в массив после k-го элемента
Написать программу, вставляющую заданное число m в целочисленный массив A после k-го элемента. Число для вставки m и номер k-го элемента...

Функция, которая возвращает список булевских значений четности каждого элемента заданного элемента целочисленного списка
Определите рекурсивные функции для решения задачи. НЕ РЕКОМЕНДУЕТСЯ использовать функции высших порядков. Сама задача: Возвращает список...

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

Двусвязный список - Добавить элемент после заданного, удалить заданный элемент
Реализуйте списочную структуру в виде класса. работа состоит из двух частей: из класса (структуры, алгоритма) и из тестирующего кода. ...

Списки, вставка Х элементов в список после 2-ого элемента
Доброго времени суток, прошу помощи у знающих. что то списки совсем туго даются.. задача - имеется некий список, нужно вставить несколько...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru