c++ - 为什么我在函数中创建的对象不会被其他函数修改? (C++)

标签 c++ list object

我在使用 C++ 中的对象时遇到问题。我的大学老师分配给我们一项工作,我们必须在其中构建一个名为 Lista(我是意大利人)的类,其中包含它的每个特性,例如 setElement、readElement、Head 等。我会发布我的文件,以便您可以阅读我写的内容。我的问题是我在 servizilista.cpp 的函数“fondi”中创建的 Lista 对象没有被 inserisci() 函数修改。会不会是变量名有问题我再翻译成英文。

节点.h

//
//  Nodo.h
//  Lista con Doppio Riferimento
//
//

#ifndef Nodo_h
#define Nodo_h

template <class tipoelem>
class Nodo {
public:
    tipoelem valore;
    Nodo* successivo;
    Nodo* precedente;
    
    Nodo();
    ~Nodo();
};

template <class tipoelem> Nodo <tipoelem> :: Nodo () {
    successivo = NULL;
    precedente = NULL;
}

template <class T> Nodo <T> :: ~Nodo () {}

#endif /* Nodo_h */

列表.h

//
//  Lista.h
//  Lista con Doppio Riferimento
//
//

#ifndef Lista_h
#define Lista_h

#include "Nodo.h"

template <class tipoelem>
class Lista {
public:
    typedef Nodo <tipoelem> *posizione;
    
    Lista();
    ~Lista();
    bool vuota();
    posizione primo();
    bool fine(posizione);
    posizione successivo(posizione);
    posizione precedente(posizione);
    tipoelem leggi(posizione);
    void scrivi(posizione, tipoelem);
    void inserisci(posizione, tipoelem);
    void rimuovi(posizione);
    int ottieniLunghezza();
    
private:
    posizione testa;
    int lunghezza;
};

template <class tipoelem> Lista <tipoelem> :: Lista() {
    lunghezza = 0;
    testa = NULL;
}

template <class tipoelem> Lista <tipoelem> :: ~Lista() {}

template <class tipoelem> bool Lista <tipoelem> :: vuota() {
    return (testa == NULL);
}

template <class tipoelem> typename Lista <tipoelem> :: posizione Lista <tipoelem> :: primo() {
    return testa;
}

template <class tipoelem> bool Lista <tipoelem> :: fine(posizione pos) {
    return (pos -> successivo == NULL);
}

template <class tipoelem> typename Lista <tipoelem> :: posizione Lista <tipoelem> :: successivo(posizione pos) {
    return (pos -> successivo);
}

template <class tipoelem> typename Lista <tipoelem> :: posizione Lista <tipoelem> :: precedente(posizione pos) {
    return (pos -> precedente);
}

template <class tipoelem> tipoelem Lista <tipoelem> :: leggi(posizione pos) {
    return (pos -> valore);
}

template <class tipoelem> void Lista <tipoelem> :: scrivi(posizione pos, tipoelem elem) {
    pos -> valore = elem;
}

template <class tipoelem> void Lista <tipoelem> :: inserisci(posizione pos, tipoelem elem) {
    Nodo <tipoelem> *nodo = new Nodo <tipoelem>;
    
    nodo -> valore = elem;
    
    if(pos == testa and testa == NULL) {
        nodo -> successivo = NULL;
        testa = nodo;
    }
    else if(pos == testa and testa != NULL) {
        nodo -> successivo = pos;
        pos -> precedente = nodo;
        testa = nodo;
    }
    else if (pos != testa and pos == NULL){
        posizione iter = primo();
        while(!fine(iter)) {
            iter = iter -> successivo;
        }
        
        nodo -> successivo = NULL;
        nodo -> precedente = iter;
        iter -> successivo = nodo;
    }
    else if (pos != testa and pos != NULL) {
        nodo -> successivo = pos;
        nodo -> precedente = pos -> precedente;
        pos -> precedente -> successivo = nodo;
        pos -> precedente = nodo;
    }
    
    lunghezza ++;
}

template <class tipoelem> void Lista <tipoelem> :: rimuovi(posizione pos) {
    Nodo <tipoelem> *temp = pos;
    
    if(pos == testa)
        testa = pos -> successivo;
    else {
        pos -> precedente -> successivo = pos -> successivo;
        
        if(pos -> successivo != NULL)
            pos -> successivo -> precedente = pos -> precedente;
    }
    
    pos = pos -> successivo;
    
    lunghezza --;
    
    delete temp;
}

template <class tipoelem> int Lista <tipoelem> :: ottieniLunghezza() {
    return lunghezza;
}

#endif /* Lista_h */

servizilista.h

//
//  serviziolista.h
//  Lista con Doppio Riferimento
//
//

#ifndef serviziolista_h
#define serviziolista_h

#include "Lista.h"

void stampa(Lista <double>);
Lista <double> epura(Lista <double>);
Lista <double> fondi (Lista <double>, Lista <double>);

#endif /* serviziolista_h */

servizilista.cpp

//
//  serviziolista.cpp
//  Lista con Doppio Riferimento
//
//

#include <iostream>
#include "serviziolista.h"

using namespace std;

void stampa(Lista <double> l) {
    Lista <double> :: posizione iter = l.primo();
    
    cout << "[";
    while(iter != NULL) {
        cout << l.leggi(iter);
        
        if(l.successivo(iter) != NULL)
            cout << ", ";
        
        iter = l.successivo(iter);
    }
    cout << "]\n\n";
}

Lista <double> epura(Lista <double> l) {
    Lista <double> :: posizione s1;
    Lista <double> :: posizione s2;
    Lista <double> :: posizione temp;

    s1 = l.primo();
    while(s1 != NULL) {
      s2 = l.successivo(s1);
      while(s2 != NULL) {
        if(l.leggi(s1) == l.leggi(s2)) {
            temp = l.successivo(s2);
            l.rimuovi(s2);
            s2 = temp;
        }
        else {
          s2 = l.successivo(s2);
        }
      }
      s1 = l.successivo(s1);
    }
    
    return l;
}

Lista <double> fondi(Lista <double> l1, Lista <double> l2) {
    Lista <double> l;
    Lista <double> :: posizione p1 = l1.primo();
    Lista <double> :: posizione p2 = l2.primo();
    Lista <double> :: posizione pl = l.primo();
    double e1, e2;
    
    while(p1 != NULL and p2 != NULL) {
        e1 = l1.leggi(p1);
        e2 = l2.leggi(p2);
        
        if(e1 < e2) {
            cout << "Valore da inserire in pl: " << e1 << ".\n";
            l.inserisci(pl, e1);
            p1 = l1.successivo(p1);
            cout << "Valore in pl: " << l.leggi(pl) << ".\n";
        }
        else {
            cout << "Valore da inserire in pl: " << e2 << ".\n";
            l.inserisci(pl, e2);
            p2 = l2.successivo(p2);
            cout << "Valore in pl: " << l.leggi(pl) << ".\n";
        }
        
        pl = l.successivo(pl);
    }
    
    while(p1 != NULL) {
        l.inserisci(pl, l1.leggi(p1));
        p1 = l1.successivo(p1);
        pl = l.successivo(pl);
    }
    
    while(p2 != NULL) {
        l.inserisci(pl, l2.leggi(p2));
        p2 = l2.successivo(p2);
        pl = l.successivo(pl);
    }
    
    return l;
}

主要.cpp

//
//  main.cpp
//  Lista con Doppio Riferimento
//
//

#include <iostream>
#include "Lista.h"
#include "serviziolista.h"

using namespace std;

int main() {
    Lista <double> l1;
    Lista <double> l2;
    Lista <double> lista;
    
    l1.inserisci(l1.primo(), 4);
    l1.inserisci(l1.primo(), 1);
    l1.inserisci(l1.primo(), 2);
    
    l2.inserisci(l2.primo(), 3);
    
    cout << "Lunghezza l1: " << l1.ottieniLunghezza() << ".\n";
    cout << "Lista l1: ";
    stampa(l1);
    
    cout << "Lunghezza l2: " << l2.ottieniLunghezza() << ".\n";
    cout << "Lista l2: ";
    stampa(l2);
    
    lista = fondi(l1, l2);
    
    cout << "Lunghezza lista fusa: " << lista.ottieniLunghezza() << ".\n";
    cout << "Lista fusa: ";
    stampa(lista);
    
    return 0;
}

最佳答案

您的列表代码似乎没问题。

问题在于您如何使用它 - 您永远不会更新变量 pl。所以做这样的事情:

    if(e1 < e2) {
        cout << "Valore da inserire in pl: " << e1 << ".\n";
        l.inserisci(pl, e1);
        p1 = l1.successivo(p1);
        pl = l.primo();
        cout << "Valore in pl: " << l.leggi(pl) << ".\n";
    }
    else {
        cout << "Valore da inserire in pl: " << e2 << ".\n";
        l.inserisci(pl, e2);
        p2 = l2.successivo(p2);
        pl = l.primo();
        cout << "Valore in pl: " << l.leggi(pl) << ".\n";
    }

编辑:好的,现在我明白你想要做什么了。 同样,列表实现没问题。

要将元素添加到列表头,您应该调用 l.inserisci(l.primo(), e1);

将元素添加到尾部 - l.inserisci(NULL, e1);

这里你想要的是总是添加到尾部。所以忘掉变量 pl。完全地。放弃吧,你不需要它。您的代码变得更加简单:

while(p1 != NULL and p2 != NULL) {
    e1 = l1.leggi(p1);
    e2 = l2.leggi(p2);
    
    if(e1 < e2) {
        cout << "Valore da inserire in pl: " << e1 << ".\n";
        l.inserisci(NULL, e1);
        p1 = l1.successivo(p1);
    }
    else {
        cout << "Valore da inserire in pl: " << e2 << ".\n";
        l.inserisci(NULL, e2);
        p2 = l2.successivo(p2);
    }
}

while(p1 != NULL) {
    l.inserisci(NULL, l1.leggi(p1));
    p1 = l1.successivo(p1);
}

while(p2 != NULL) {
    l.inserisci(NULL, l2.leggi(p2));
    p2 = l2.successivo(p2);
}

祝你好运

关于c++ - 为什么我在函数中创建的对象不会被其他函数修改? (C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64685688/

相关文章:

java - LibGdx 多个对象的一个​​或多个实例

c# - 当方法采用对象 C# 时,字符串作为引用参数的问题

c++ - 分离源和 header 是否像使用内联一样有效?

python - 用于删除具有重复整数的数字的函数会跳过一项,我不知道为什么

list - 如何连接两个 Snoc 列表?

list - 一切都是计划中的 list 吗?

c++ - C/C++中的gettext国际化系统的性能开销

c++ - C++ Linux蓝牙sdp_connect仅以root特权成功

c++ - 如何找到 -lm lib 并将其包含在 CMake 中?

javascript - 使用 setInterval 替代 2 个常量