Как создать несколько объектов в одной функции, но не перезаписывая друг друга? - PullRequest
0 голосов
/ 04 марта 2009

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

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

EDIT: Я не могу дать код, потому что у меня его сейчас нет. Все, что у меня сейчас есть, это псевдокод.

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

EDIT: Технически, мы не создаем список ссылок, а просто подтверждаем концепцию, чтобы понять, как они работают.

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

#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
            }
    }

}

Ответы [ 6 ]

2 голосов
/ 04 марта 2009

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

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».

2 голосов
/ 04 марта 2009

Если вы хотите связанный список - вызовите 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;
    }
}
0 голосов
/ 04 марта 2009

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

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

0 голосов
/ 04 марта 2009

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

Пожалуйста, предоставьте больше деталей, и я мог бы предоставить больше помощи.

0 голосов
/ 04 марта 2009

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

0 голосов
/ 04 марта 2009

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

#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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...