Как я могу добавить уже созданный узел в связанный список?

#c #oop #pointers #linked-list #segmentation-fault

#c #ооп #указатели #связанный список #ошибка сегментации

Вопрос:

Я пытаюсь добавить уже созданный узел в связанный список, передав указатель на указатель в качестве аргумента. Я не могу понять, как заставить его работать.

 void List::add(Node* n, int pos){
    if(pos > size)
        pos = size;
    
    if(pos == 0){
        if (head == NULL){
            head = n;
        }
        else{
            Node* temp = head;
            n->setNext(temp);
            head = n;
        }
    }
    else{
        Node* temp = head;
        int currPos = 0;
        while(temp->getNext() != NULL amp;amp; currPos != pos){
            temp = temp->getNext();
            currPos  ;
            }
        if(currPos == pos){
            Node* next = temp->getNext();
            n->setNext(next);
            }
            
    temp->setNext(n);
            
    }
    size  ; 
}
 

Я реализовал метод, который создает новый узел для каждого вызова, и он работает нормально, но мне нужно работать с уже созданными узлами.

Ниже у вас есть заголовочные файлы для списка и узла.

 #pragma once
#include "Node.hpp"
#include <iostream>

class List{
        Node* head;
        int size;
    
    public:
        List();
        List(const Teamamp;, Node* = NULL);
    //  List(const Listamp;);
    //  Listamp; operator=(const Listamp;);
        ~List();
        void add(const Teamamp;, int = 0);
        void add(Node*, int = 0);
        void remove(const Teamamp;);
        void removeLowest(int unqualNum);
        void print() const;
        void printNames(ostreamamp; o = cout) const;
        int getSize() const;
        Node* getHead() const;
};



#pragma once
#include "Team.hpp"

class Node{
        Team value;
        Node* next;
    
    public:
        Node(const Teamamp; = Team(), Node* = NULL);
    //  Node(const Nodeamp;);
    //  operator=(const Nodeamp;);
    //  ~Node();
        Team getValue() const;
        void setValue(const Teamamp;);
        Node* getNext() const;
        void setNext(Node*);
};
 

У меня есть другой стек классов, в котором я хочу использовать этот метод.

     #pragma once
#include "Node.hpp"
#include "List.hpp"
#include <iostream>

class Stack{
    Node* head;
    int size;
    
    public:
        Stack();
        Stack(const Teamamp;, Node* = NULL);
    //  Stack(const Stackamp;);
    //  Stackamp; operator=(const Stackamp;);
        ~Stack();
        
        void push(const Teamamp;);
        void pop();
        void print(ostreamamp; = cout) const;
        
        int getSize() const;
        Node* getHead() const;
        
        void toList(List* );
};
 

В методе ToList я пытаюсь переместить все узлы стека в список, переданный в качестве аргумента.

 void Stack::toList(List* l){
    Node *temp = head;
    while(temp){
        l->add(temp->getValue(), l->getSize()); // This works similar add method that build node inside
        l->add(temp, l->getSize()); // This doesn't, the method with Node as parameter
        temp = temp->getNext();
    }
}
 

Комментарии:

1. Какую ошибку вы наблюдаете?

2. Я получаю ошибку seg.

3. И где именно вы получаете segfault, могу я спросить?

4. @StefanNastase Почему вы изначально создаете узлы вне списка? Это плохой запах кода. Только List класс должен создавать какие-либо узлы для себя.

5. @CaptainTrojan я думаю, когда я устанавливаю следующий для * n