Реализация списков с++
#include <iostream>
using namespace std;
struct Node {
int value;
Node* next;
};
class List{
public:
Node* head;
List() {
head = NULL;
}
Node* add(int x,int ind) {
Node* p = new Node;
Node* q = new Node;
p->value = x;
p->next = NULL;
if (head == nullptr) {
head = p;
}
else {
q = head;
q->next = head;
for (int i = 0; i <= ind; i++) {
if (i == ind||q->next) {
p->next = q->next;
q->next = p;
}
q = q->next;
}
}
return p;
}
Node* del(int ind) {
Node* q = new Node;
for (int i = 0; i <= ind; i++) {
if (i == ind) {
q->next = q->next->next;
}
if (i == ind + 1) q->next = nullptr;
q = q->next;
}
return 0;
}
Node* top() {
cout << head->value;
return head;
}
void show() {
Node* h = head;
while (h!=NULL) {
cout << h->value;
h = h->next;
}
cout << h->value;
}
};
int main()
{
List list;
list.add(2,0);
list.add(3,1);
list.add(4,2);
list.show();
return 0;
}
Пытаюсь сделать односвязные списки на с++. Добавление идет после заданного элемента,удаление тоже. Не особо шарю за это.У меня в выводе элементов проблемы(ф-ия show). Не знаю как сделать правильное условие. У меня цикл выполняется бесконечно.
Ответы (2 шт):
Автор решения: AR Hovsepyan
→ Ссылка
По моему вам придется все заново написать, но с пониманием того, что делаете. Чтобы не заморачиваться, можете пользоваться более современным решением:
class List {
struct Node {
int value;
std::unique_ptr<Node> next;
};
std::unique_ptr<Node> head;
public:
void add(int x) {
head = std::make_unique<Node>(Node{ x, std::move(head) });
}
Node* top() {
return head.get();
}
void show() {
for (Node* p = top(); p; p = p->next.get())
std::cout << p->value << ' ';
}
~List()
{
while (head)
head = std::move(head->next);
}
};
int main()
{
List list;
list.add(2);
list.add(3);
list.add(4);
list.show();
return 0;
}
Автор решения: ТарасПрогер
→ Ссылка
#include <iostream>
using namespace std;
struct Node {
int value;
Node* next;
};
class List {
public:
Node* head;
List()
{
head = NULL;
}
void pop_front()
{
Node* temp = head;
head = head->next;
delete temp;
}
void push_front(int data)
{
head = new Node{data, head};
}
void del(int index)
{
if (index == 0)
{
pop_front();
}
else
{
Node* previous = this->head;
for (int i = 0; i < index - 1; i++)
{
previous = previous->next;
}
Node* toDelete = previous->next;
previous->next = toDelete->next;
delete toDelete;
}
}
void insert(int data, int index)
{
if (index == 0)
{
push_front(data);
}
else
{
Node* previous = this->head;
for (int i = 0; i < index - 1; i++)
{
previous = previous->next;
}
Node* newNode = new Node{ data, previous->next };
previous->next = newNode;
}
}
void push_back(int data)
{
if (head == nullptr)
{
head = new Node{ data, nullptr };
}
else
{
Node* current = this->head;
while (current->next != nullptr)
{
current = current->next;
}
current->next = new Node{data,nullptr};
}
}
void show()
{
Node* h = head;
while (h != NULL)
{
cout << h->value << endl;
h = h->next;
}
// cout << h->value;
}
};
int main()
{
List list;
// list.add(208, 0);
list.push_back(32);
list.push_back(-2);
list.push_front(3);
list.insert(292, 1);
list.show();
return 0;
}
Тут уже лучше переделать на вот так