Konstruktor w linked list, problem z konceptualnym i implementacyjnym zrozumieniem oraz problem z insert.

0

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;
}

1

http://forum.4programmers.net/C_i_C++/262765-listy_dodawanie_pierwszego_el?p=1203991#id1203991

Jakoś nie widzę żadnej próby przeróbki pod c++.

(*p) = (*p)->next;

Jak potrzebujesz dodawać na koniec listy stwórz klasę lista a w niej pole tail.
Wtedy koszt dodawania będzie O(1) zamiast O(n)
Generalnie jak tworzysz listę to nie powinno jej się przekładać oprócz przypadku kiedy potrzebne są wszystkie elementy (np wyswietlenie).

1 użytkowników online, w tym zalogowanych: 0, gości: 1