Как создать несколько объектов в одной функции, но не перезаписывая друг друга?

StackOverflow https://stackoverflow.com/questions/609411

Вопрос

Я пытаюсь создать объект в функции, но столкнулся с проблемой, заключающейся в том, что имена переменных необходимо определять во время выполнения.Могу ли я что-нибудь сделать с массивами, что позволит динамически создавать переменную в функции и желательно давать ей имя, отличное от того, которое было создано при последнем вызове функции?

***Я работаю на C++

РЕДАКТИРОВАТЬ:Я не могу дать код, потому что у меня его сейчас нет.Все, что у меня сейчас есть, это псевдокод.

По сути, я пытаюсь создать связанный список, но метод addNewItem(), который я хочу использовать, потребует использования одного и того же метода для создания разных объектов.

РЕДАКТИРОВАТЬ:Технически, мы не составляем список ссылок, а просто проверяем концепцию, чтобы понять, как они работают.

РЕДАКТИРОВАТЬ:Вот код:

#include "linklist.h"
#include <iostream>
using namespace std;

struct linklist
{
    Student * obj;
    linklist * next;
};

linklist * head;

int main()
{

}
void addStudent(char * newsdnt)
{
    if(!head){
            linklist * a = new linklist;
            a->obj = new Student(newsdnt);
            a->next = 0;
            head = a;
            return;
    }else{
            linklist * a = new linklist;
            a->obj = new Student(newsdnt);
            a->next = 0;
            if(!head->next){
                    head->next = a;  // Can only have one or two items in list
            }
    }

}

Это было полезно?

Решение

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

Что-то вроде этого:

void addStudent(char * newsdnt)
{
    linklist* a = new linklist;
    a.obj = new Student(newsdnt);
    a.next = 0;

    if( head == 0 ) {
        head = a;
    } else {
        linklist* whereToAdd = head;
        while( whereToAdd.next != 0 ) {
            whereToAdd = whereToAdd.next;
        }
        whereToAdd.next = a;
    }
}

Другие советы

Самый простой способ создать (одно) связанный список — добавить новый элемент в начало:

linklist *head = 0;

...
a->next = head;
head = a;
...

Если допустимо добавлять элементы в хвост за время O(N), то вы каждый раз просматриваете список, чтобы найти конец.

linklist head;

...
a->next = 0;
item = &head;
while (item->next != 0)
    item = item->next;
item->next = a;
...

Если вам необходимо добавить новые элементы в хвост списка за время O(1), сохраните круговой список и указатель на хвост списка (чтобы tail->next является указателем на начало списка).(Предыдущие структуры списков можно было бы назвать «открытыми».)

linklist  root = { 0, &root };
linklist *tail = &root;

...
a->next = tail;
tail->next = a;
...

Остерегаться:условия завершения перебора всего списка (например.для поиска элемента в списке) различаются в зависимости от используемой структуры (круглая или открытая).

Предостережение:непроверенный код!

Если вы не уверены, что означают O(1) и O(N), прочтите нотацию «Big O».

Я бы предложил вектор:

#include <vector>
using namespace std;
void foo()
{
    vector<int> v;
    v.push_back(1);
    v.push_back(2);
    v.push_back(3);
    cout << v[0] + v[1] << endl;
}

Предполагая, что вам нужно N объекты какого-то типа T:Массивы широко распространены в C++.Так же как и STL, который предоставляет вам множество возможностей.Вам необходимо определить, как вы хотите получать доступ к этим объектам и использовать их — это влияет на выбор вашего контейнера.Но можете ли вы опубликовать код, чтобы наши ответы были менее расплывчатыми (и более полезными для вас)?

Я не совсем уверен, чего вы хотите, но похоже, что вы могли бы использовать Мультисет.

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

Для начала я бы предложил вам переименовать структуру связанного списка в node и добавить новую структуру связанного списка, которая содержит заголовок и (возможно) текущие/хвостовые указатели.Затем вам следует реализовать в этом классе/структуре методы, которые позволят вам манипулировать им.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top