Robię więc tę pojedynczą realizację listy na przydzielanie szkolne. Struktura "oceny" została zdefiniowana w pliku nagłówka i obiekt "Mylinkedlist" przytrzymałby wskaźnik do głowy wiązanej listy. Powinno to być łatwy projekt, ale z jakiegoś powodu, gdy próbuję zadzwonić do funkcji dodawania, wskaźnik głowicy został zmieniony pomimo a) nie nazywany i b) wskaźnik głowy był pozornie zmieniany, zanim funkcja dodania została nawet nazywana

Poniżej znajduje się minimalny repro problemu

//header file
#pragma once

#ifndef MYLINKEDLIST_H
#define MYLINKEDLIST_H

#include <iostream>
#include <process.h>
using namespace std;
const int maxSize = 20; // size string
struct Evaluation
{
    char student[maxSize] = { 'a', 'b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t' };
    int grade;
    Evaluation *next;
};

class myLinkedList {
private:
    Evaluation *head;
public:
    myLinkedList(Evaluation *);
    Evaluation *add(Evaluation *, int &);
    Evaluation * returnHead();

};

#endif#pragma once
//mylinkedlist.cpp
#include "pch.h"
#include "myLinkedList.h"
#include <iostream>
#include <string>

myLinkedList::myLinkedList(Evaluation *h) {
    this->head = h;
}

Evaluation * myLinkedList::returnHead() {
    return this->head;
}

Evaluation * myLinkedList::add(Evaluation *c, int &b) {//a is the first element 
    Evaluation *pointer = this->head;
    cout << "head in the beginning " << this->head->grade << endl;
    cout << "pointer in the beginning " << pointer->grade << endl;

    bool y = b == 0;
    cout << "b==0 " << y << endl;

    if (b == 0) {
        pointer = this->head;
        this->head = c;
        this->head->next = pointer;
        cout << "head after if " << this->head->grade << endl;
    }
    return this->head;
}

//main
#include "pch.h"
#include "myLinkedList.h"
#include <iostream>
#include <string>

int main() {
    Evaluation *first = new Evaluation();
    int choice;
    int grade = 0;
    int number = 0;
    first->grade = 20;
    myLinkedList *list = new myLinkedList(first);
    cout << "list head is " << list->returnHead()->grade << endl;
    Evaluation *tempt = new Evaluation();
    do
    {
        cout << "please enter the grade of student : ";
        cin >> grade;
        cout << "list head is 2nd " << list->returnHead()->grade << endl;
        tempt->grade = grade;
        cout << "list head is 3rd " << list->returnHead()->grade << endl;
        list->add(tempt, number); // added element, index
        number++;
    } while (true);
    return 0;
}

This is the output I got

Zobacz, jak zmieniono głowę między "Głowica listy wynosi 2", a "Głowa listy wynosi 3" mimo głowy nie nazywa się. I kolejna dziwna rzecz była taka, że jeśli wyjmę funkcję Dodaj lub połączenie do funkcji Dodaj, problem zniknąłby pomimo połączenia z funkcją dodawania przychodzącym po Couts.

I wewnątrz metody dodania, jeśli stwierdzenie, jeśli zdawało się być problem po raz kolejny, pomimo nadchodzącego po linii COut i nie wykonuje (B == 0 Wydawanie False). Jedynym sposobem, w jaki wiedziałem, że ma coś wspólnego z utrzymującym problemem, jest to, że jeśli usunę, problem zniknął.

0
Icarus 16 październik 2020, 20:34

1 odpowiedź

Najlepsza odpowiedź

Ten sam węzeł przypisany do tempt jest wielokrotnie dodany, więc modyfikowanie węzła wpłynie na inne odniesienia do węzła.

Wydaje się, że chcesz przeznaczyć nowe węzły dla każdego wejścia. Aby to zrobić, przeznaczyć nowe elementy wewnątrz pętli.

    // remove this
    //Evaluation *tempt = new Evaluation();
    do
    {
        // and move here (inside the loop)
        Evaluation *tempt = new Evaluation();
        cout << "please enter the grade of student : ";
        cin >> grade;
        cout << "list head is 2nd " << list->returnHead()->grade << endl;
        tempt->grade = grade;
        cout << "list head is 3rd " << list->returnHead()->grade << endl;
        list->add(tempt, number); // added element, index
        number++;
    } while (true);
2
MikeCAT 16 październik 2020, 17:37