Witam,
Mam jak wspomniałem w tytule konceptualny problem ze zrozumieniem np. (Node**p) czy innych tego typu trochę bardziej skomplikowanych konstrukcji. Piszę samodzielnie program dynamicznej listy i zabrałem się za dopieszczanie programu i implementację klasy w C++. Problem zaczyna się z konstruktorem który nie za bardzo wiem ja zaimplementować aby przy tworzeniu obiektu wszystko grało jak należy. Miałem też problem z funkcją insert której dałem radę (natomiast sam koncept tego co zrobiłem nie jest w pełni jasny). Jak widać przy mojej implementacji stworzyłem Node *q = (*p) i korzystałem z q, co i jak robić aby korzystać z tego "wprost" a nie poprzez q. Załączam pełny kod moich wypocin. Jak już podkreślałem we wcześniejszych postach w C/C++ jestem nowicjuszem i za bardzo nie chcę po prostu Ctr+C z geekforgeeks. chciałbym to dobrze i dokładnie zrozumieć. Z góry dziękuje za pomoc :).
//Node.h
class Node
{
public:
int data{};
Node* next{};
};
Node* initialize(int value);
void display(Node* p);
void displayRecursive(Node* p);
int count(Node* p);
void insert(Node** p, int index, int value);
void append(Node** p, int value);
int isSorted(Node* p);
//Node.cpp
#include "Node.h"
#include <iostream>
using namespace std;
Node* initialize(int value)
{
Node* h = new Node;
h->data = value;
h->next = nullptr;
return h;
}
void display(Node* p) {
while (p != nullptr) {
cout << p->data << " ";
p = p->next;
}
cout << "\n";
}
void displayRecursive(Node* p)
{
if (p != nullptr) {
cout << p->data;
displayRecursive(p->next);
}
}
int count(Node* p)
{
int num = 0;
while (p != nullptr) {
num++;
p = p->next;
}
return num;
}
void append(Node** p, int value) {
Node* t = new Node;
t->data = value;
t->next = nullptr;
if ((*p) == nullptr) (*p) = t;
else {
Node* q = (*p);
while (q->next != nullptr) q = q->next;
q->next = t;
}
}
int isSorted(Node* p)
{
int x;
while (p->next != nullptr) {
x = p->data;
p = p->next;
if (x > p->data) return -1;
}
return 0;
}
void insert(Node** p, int index, int value)
{
int i;
Node* t = new Node;
t->data = value;
if ((*p) == nullptr) {
t->next = nullptr;
(*p) = t;
return;
}
if (index == 0)
{
t->next = (*p);
(*p) = t;
}
else
{
Node* q = (*p);
for (i = 0; i < index - 1 && q != nullptr; i++) {
q = q->next;
}
if (q != nullptr) {
t->next = q->next;
q->next = t;
}
}
}
//main.cpp
#include <iostream>
#include "Node.h"
using namespace std;
int main() {
Node* head = initialize(1);
insert(&head, 0, 2);
insert(&head, 1, 4);
append(&head, 6);
append(&head, 8);
append(&head, 10);
append(&head, 12);
insert(&head, 0, 45);
cout << isSorted(head) << "\n";
display(head);
return 0;
}