我在使用 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/