Попытка указать на предыдущий узел в связанном списке - PullRequest
0 голосов
/ 07 июня 2019

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

Проблема в том, что каждая папка, которую я создаю, всегда указывает на текущую папку.Пожалуйста, проверьте функции cd() и mkdir().


#include "stdafx.h"
#include <iostream>
#include <Windows.h>
#include <String>
#include <stdio.h>
using namespace std;

int MAX_PER_FOLDER = 100;
int MAX_FILES_PER_FOLDER = 100;

struct File;

class Folder {
    public:
        Folder() {}
    string name;
    int nFolders;
    int nFiles;
    File *files;
    Folder *folders;
    Folder * prev;
};

struct File {
    string name;
    int size;
    Folder *folder;
    string data;
};

void ls(Folder root) {
    for (int i = 0; i < root.nFolders; i++) {
        Folder temp = root.folders[i];
        std::cout << " - " << temp.name << endl;
    }
}


void mkdir(string name, Folder &current) {
    Folder *temp = new Folder();
    temp->name = name;
    temp->prev = &current;
    temp->nFolders = 0;
    temp->nFiles = 0;
    temp->folders = new Folder[MAX_PER_FOLDER];
    temp->files = new File[MAX_FILES_PER_FOLDER];
    current.folders[current.nFolders] = *temp;
    current.nFolders++;
}

void cfile(string name, Folder &current, string data) {
    File temp;
    temp.name = name;
    temp.folder = &current;
    temp.data = data;
    current.files[current.nFiles] = temp;
    current.nFiles++;
}

void cd(string name, Folder &current) {
    bool found = false;
    if (name == ".." && current.prev != NULL) {
        cout << "====";
        current = *current.prev;
        cout << "---";
        found = true;
    }
    else {
        for (int i = 0; i < current.nFolders; i++) {
            Folder f = current.folders[i];
            if (f.name == name) {
                current = f;
                found = true;
                break;
            }
        }
    }
    if (found) {
        cout << "Current dir: " << current.name << endl;
    }
    else
        cout << "Directory does not exist" << endl;

}

int main()
{
    Folder root = Folder();
    root.folders = new Folder[MAX_PER_FOLDER];
    root.nFiles = 0;
    root.nFolders = 0;
    root.prev = NULL;
    root.name = "root";

    mkdir("Test1", root);
    mkdir("Test2", root);
    mkdir("Test3", root);

    ls(root);

    cd("Test3", root);
    mkdir("Test3.1", root);
    mkdir("Test3.2", root);
    mkdir("Test3.3", root);

    ls(root);

    cd("Test3.1", root);
    mkdir("Test3.1.2", root);
    mkdir("Test3.1.3", root);
    mkdir("Test3.1.4", root);

    cd("Test3.1.2", root);

    cd("..", root);
    ls(root);

    system("PAUSE");

    return 0;
}

Проблема в том, что все созданные папки всегда указывают на текущую папку, установленную cd(), я полагаю, что она существует в следующей строке:temp->prev = &current; при создании папки, поскольку, возможно, она указывает только на один адрес, который является адресом текущей папки.

Спасибо!

1 Ответ

1 голос
/ 07 июня 2019

Ваша команда cd заменяет содержимое из root чем-то другим. (проверьте с помощью отладчика!)

Я вижу три варианта:

  • Переключитесь на использование указателей на Folders везде. Это делает невозможным случайную перезапись содержимого папки.
  • Переписать функцию cd, чтобы использовать (возможно, глобальный) указатель на «текущий каталог». Это означает, что вы должны изменить все варианты использования cd.
  • Используйте std::reference_wrapper для cd, чтобы current = folder; обновлялся там, где current указывает без изменения его содержимого.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...